システムの状態とパフォーマンスの監視と管理


Red Hat Enterprise Linux 10

システムのスループット、レイテンシー、および電力消費の最適化

Red Hat Customer Content Services

概要

パフォーマンス最適化用の TuneD、ハードウェアおよびソフトウェアイベントを監視する perf、システムパフォーマンス分析用の Performance Co-Pilot (PCP) などのツールを使用して、RHEL システムのパフォーマンスを監視、分析、改善します。パフォーマンスメトリクスを収集し、特定のワークロードに合わせてシステムを設定することで、システムアクティビティーを確認し、パフォーマンスデータをログに記録して視覚化して、ディスクスケジューラーや電力使用量などの主要な設定を調整します。リアルタイムの CPU プロファイリング、メモリー割り当ての分析、パフォーマンスのボトルネックの特定、電力消費の効率的な管理、誤った共有などの問題の検出といったテクニックを適用することで、システム効率を向上させます。

Red Hat ドキュメントへのフィードバック (英語のみ)

Red Hat ドキュメントに関するご意見やご感想をお寄せください。また、改善点があればお知らせください。

Jira からのフィードバック送信 (アカウントが必要)

  1. Jira の Web サイトにログインします。
  2. 上部のナビゲーションバーで Create をクリックします。
  3. Summary フィールドにわかりやすいタイトルを入力します。
  4. Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
  5. ダイアログの下部にある Create をクリックします。

第1章 パフォーマンス監視オプションの概要

Red Hat Enterprise Linux システムのパフォーマンスを監視および最適化するには、次のツールを使用できます。

  • Performance Co-Pilot (pcp) は、システムレベルのパフォーマンス測定を監視、視覚化、保存、分析するためのツール群です。リアルタイムデータの監視と管理、および履歴データのロギングと取得が可能になります。
  • RHEL は、ランレベル 5 以外のシステムを監視するためのコマンドラインツールをいくつか備えています。組み込みのコマンドラインツールは次のとおりです。

    • procps-ng パッケージは次のユーティリティーを提供します。

      • top ユーティリティーは、実行中のシステム内のプロセスを動的に表示します。システムの概要や Linux カーネルが現在管理しているタスクのリストなど、さまざまな情報が表示されます。
      • ps ユーティリティーは、選択したアクティブなプロセスグループのスナップショットを取得します。デフォルトでは、検査されるグループは、現在のユーザーが所有し、ps コマンドが実行されるターミナルに関連付けられているプロセスに制限されます。
      • 仮想メモリー統計 (vmstat) ユーティリティーは、システム内のプロセス、メモリー、ページング、ブロック入出力、割り込み、CPU アクティビティーの即時レポートを提供します。
    • sysstat パッケージは、現在の日付のシステムアクティビティーに関する情報を収集して報告するシステムアクティビティーレポーター (sar) ユーティリティーを提供します。
  • perf は、ハードウェアパフォーマンスカウンターとカーネルトレースポイントを使用して、システム上の他のコマンドやアプリケーションの影響を追跡します。
  • bcc-tools は、Berkeley Packet Filter (BPF) Compiler Collection (BCC) をベースに構築されたパフォーマンス分析ユーティリティー群です。カーネルアクティビティーを監視する 100 を超える Extended BPF (eBPF) スクリプトを提供します。各ツールの詳細は、ツールの使用方法と、ツールが実行する機能を説明する man ページを参照してください。
  • kernel-tools パッケージは、Intel 64 プロセッサーのプロセッサートポロジー、周波数、アイドル電力状態の統計情報、温度、電力使用量を報告する turbostat ユーティリティーを提供します。
  • sysstat パッケージは、システムの I/O デバイスの負荷を監視および報告する iostat ユーティリティーを提供します。これは、物理ディスク間の I/O 負荷を分散する方法を管理者が決定する際に役立ちます。
  • irqbalance ユーティリティーは、ハードウェア割り込みをプロセッサー全体に分散して、システムパフォーマンスを向上させます。
  • numactl パッケージは、numastat ユーティリティーを提供します。デフォルトでは、numastat は、カーネルメモリーアロケーターからの Non-Uniform Memory Access (NUMA) ヒットおよびミスに関するシステム統計情報をノードごとに表示します。numa_hit 値が高く、numa_miss 値が低い場合、パフォーマンスが最適であると言えます。
  • numad は NUMA アフィニティーの自動管理デーモンです。NUMA リソースの割り当て、管理、システムのパフォーマンスを動的に改善するシステム内の NUMA トポロジーとリソースの使用状況を監視します。
  • SystemTap は、カーネルとユーザー空間用のプログラム可能なトレース/プローブ/デバッグシステムであり、多くの簡単なスクリプトが含まれています。
  • valgrind は、計装されていないユーザー空間プログラムを監視下で実行し、メモリーのエラー、割り当ての統計情報、同時実行の違反を検出します。
  • intel-cmt-cat パッケージは、最新の Intel プロセッサー上の CPU キャッシュとメモリー帯域幅を監視および制御するための pqos ユーティリティーを提供します。

第2章 TuneD によるシステムパフォーマンスの最適化

TuneD は、定義済みまたはカスタムのプロファイルを使用してシステムのパフォーマンスと電力消費を最適化するように設計されたシステムチューニングサービスです。高スループット、低レイテンシー、省電力など、さまざまなワークロードに適した定義済みプロファイルが含まれています。

2.1. RHEL とともに配布される TuneD プロファイル

インストール中に、TuneD はシステムタイプに基づき最適なプロファイルを自動的に選択します。たとえば、コンピュートノードには throughput-performance が選択され、仮想マシンには virtual-guest が選択され、一般的なシステムには balanced が選択され、環境に最適なパフォーマンスが確保されます。プロファイルは主に次の 2 つのカテゴリーに分けられます。

  • パフォーマンスへの影響を最小限に抑えながら消費電力を削減する省電力プロファイル
  • システムリソースを最適化して速度と応答性を向上させるパフォーマンス強化プロファイル

以下は、システム負荷に基づき選択できる、RHEL で配布されるプロファイルのリストです。

balanced
パフォーマンスと電力消費のバランスをとるための、デフォルトの省電力プロファイルです。可能な限り、自動スケーリングと自動チューニングを使用します。
powersave

最大限の省電力パフォーマンスを実現するプロファイルであり、パフォーマンスを調整して実際の電力消費を最小限に抑えることができます。USB 自動サスペンド、Wi-Fi 省電力、SATA ホストアダプターのアグレッシブリンク電源管理 (ALPM) の省電力を有効にし、ウェイクアップレートが低いシステムのマルチコア省電力をスケジューリングし、ondemand ガバナーをアクティブ化します。さらに、AC97 音声省電力と、システムに応じて HDA-Intel 省電力 (10 秒のタイムアウト) が有効になります。KMS が有効なサポート対象の Radeon グラフィックカードがシステムに搭載されている場合、このプロファイルによってシステムが自動省電力に設定されます。このプロファイルは、energy_performance_preference 属性を powersave または power energy 設定に変更します。また、scaling_governor ポリシー属性を ondemand または powersave CPU ガバナーのいずれかに変更します。

注記

場合によっては、powersave よりも balanced プロファイルの方が効率的です。ビデオトランスコーディングなどのタスクでは、フルパワーで実行するとジョブがより速く完了し、マシンは効率的な省電力モードに早いタイミングで切り替わることができます。マシンのスロットルを調整すると、タスク中の電力は抑制されますが、タスクの継続時間が長くなり、全体的なエネルギー使用量が増加する可能性があります。したがって、balanced プロファイルを選択する方が適切な場合がよくあります。

throughput-performance
高スループットに最適化されたサーバープロファイル。省電力メカニズムを無効にし、ディスクとネットワーク IO のスループットパフォーマンスを高める sysctl 設定を有効にします。
accelerator-performance
throughput-performance プロファイルと同じチューニングが含まれるプロファイル。さらに、CPU を低い C 状態にロックし、レイテンシーが 100us 未満になるようにします。これにより、GPU などの特定のアクセラレーターのパフォーマンスが向上します。
latency-performance
低レイテンシーに最適化され、省電力メカニズムを無効にし、レイテンシーを改善する sysctl 設定を有効にするサーバープロファイル。CPU ガバナーは performance に設定され、CPU は低い C 状態にロックされます (PM QoS を使用)。
network-latency
低レイテンシーネットワークチューニング向けプロファイル。これは latency-performance プロファイルに基づいています。さらに、transparent huge page と NUMA バランシングを無効にし、他のネットワーク関連の sysctl パラメーターをいくつか調整します。
hpc-compute
高パフォーマンスコンピューティング向けに最適化されたプロファイル。これは latency-performance プロファイルに基づいています。
network-throughput
スループットネットワークチューニング向けプロファイル。これは throughput-performance プロファイルに基づいています。また、カーネルネットワークバッファーが増加されます。
virtual-guest
throughput-performance プロファイルに基づく Red Hat Enterprise 仮想マシンおよび VMWare ゲスト向けプロファイル。仮想メモリーのスワップの減少や、ディスクの readahead 値の増加などが行われます。ディスクバリアは無効になりません。
virtual-host
throughput-performance プロファイルに基づいて仮想ホスト用に設計されたプロファイル。他のタスクの中でも特に、仮想メモリーのスワップを減らし、ディスクの先読み値を増やし、ダーティーページの書き戻しに対してより積極的な値を有効にします。
oracle
throughput-performance プロファイルに基づいて Oracle データベースの負荷に最適化されたプロファイル。さらに、transparent huge page を無効にし、他のパフォーマンス関連のカーネルパラメーターを変更します。このプロファイルは、tuned-profiles-oracle パッケージで利用できます。
desktop
balanced プロファイルに基づく、デスクトップに最適化されたプロファイル。対話型アプリケーションの応答を向上させるスケジューラーオートグループが有効になります。
optimize-serial-console

printk 値を減らすことで、シリアルコンソールへの I/O アクティビティーを調整するプロファイル。これにより、シリアルコンソールの応答性が向上します。このプロファイルは、他のプロファイルのオーバーレイとして使用することが意図されています。以下に例を示します。

# tuned-adm profile throughput-performance optimize-serial-console
mssql
Microsoft SQL Server に提供されるプロファイル。これは throughput-performance プロファイルに基づいています。
intel-sst

ユーザー定義の Intel Speed Select Technology 設定で最適化されたプロファイル。このプロファイルは、他のプロファイルのオーバーレイとして使用することが意図されています。以下に例を示します。

# tuned-adm profile cpu-partitioning intel-sst
aws

AWS EC2 インスタンスに最適化されたプロファイル。これは throughput-performance プロファイルに基づいています。

これらのプロファイルの詳細は、システム上の tuned-profiles man ページを参照してください。

2.2. RHEL とともに配布されるリアルタイムの TuneD プロファイル

RHEL には、リアルタイムカーネルを実行するシステム専用のプロファイルがいくつか付属しています。特殊なカーネルビルドなしでは、システムはリアルタイムになりません。RHEL では、追加のリポジトリーでこのプロファイルを利用できます。

realtime
ベアメタルのリアルタイムシステムで使用します。これは、RT または NFV リポジトリーから入手できる tuned-profiles-realtime パッケージによって提供されます。
realtime-virtual-host
リアルタイムに設定された仮想ホストで使用します。NFV リポジトリーから利用できる tuned-profiles-nfv-host パッケージにより提供されます。
realtime-virtual-guest
リアルタイムに設定された仮想化ゲストで使用します。NFV リポジトリーから利用できる tuned-profiles-nfv-guest パッケージにより提供されます。

2.3. TuneD のインストールと有効化

システム管理者は、TuneD デーモンを使用して、さまざまなユースケースに合わせてシステムのパフォーマンスプロファイルを最適化できます。使用を開始するには、TuneD をインストールして有効にする必要があります。

インストール後、/usr/lib/tuned/profiles ディレクトリーにディストリビューション固有のプロファイルが保存されます。各プロファイルは独自のサブディレクトリーに保存されます。プロファイルには、tuned.conf という名前のプロファイル設定ファイルと、オプションでヘルパースクリプトなどのその他のファイルが含まれます。プロファイルをカスタマイズする場合は、カスタムプロファイルに関連するファイルが格納されている /etc/tuned/profiles にプロファイルディレクトリーをコピーします。同じ名前のプロファイルが存在する場合は、/etc/tuned/profiles にあるカスタムプロファイルが優先されます。

前提条件

  • 管理者権限がある。

手順

  1. TuneD パッケージをインストールします。

    # dnf install tuned
  2. TuneD サービスを有効にして起動します。

    # systemctl enable --now tuned
  3. オプション: リアルタイムシステム用の TuneD プロファイルをインストールします。

    リアルタイムシステム用の TuneD プロファイルの場合は、rhel-10 リポジトリーを有効にします。

    # subscription-manager repos --enable=rhel-10-for-x86_64-nfv-beta-rpms
    # dnf install tuned-profiles-realtime tuned-profiles-nfv

検証

  • プロファイルがアクティブで、適用されていることを確認します。

    $ tuned-adm active
    Current active profile: throughput-performance
    $ tuned-adm verify
    Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.

2.4. TuneD プロファイルの管理

使用可能なプロファイルのリスト表示、特定のプロファイルの設定、必要に応じた TuneD の無効化など、Red Hat Enterprise Linux システムで TuneD プロファイルを管理できます。プロファイルを適切に管理すると、低レイテンシーのアプリケーションに対して cpu-partitioning プロファイルを使用するなど、特定のワークロードのシステムパフォーマンスが最適化されます。

前提条件

  • TuneD をインストールして有効化した。
  • 管理者権限がある。

手順

  1. 利用可能な定義済みの TuneD プロファイルをすべてリスト表示します。

    $ tuned-adm list
  2. オプション: 次のコマンドを使用して、TuneD がシステムに最適なプロファイルを推奨するようにします。

    # tuned-adm recommend
    throughput-performance
  3. プロファイルをアクティブ化します。

    # tuned-adm profile selected-profile

    または、複数のプロファイルを組み合わせてアクティブ化することもできます。

    # tuned-adm profile selected-profile1 selected-profile2
  4. 使用しているシステムで現在アクティブになっている TuneD プロファイルを表示します。

    # tuned-adm active
    Current active profile: selected-profile
  5. すべてのチューニングを一時的に無効にします。

    # tuned-adm off
    The tunings are applied again after the TuneD service restarts.
  6. オプション: TuneD サービスを完全に停止して無効にします。

    # systemctl disable --now tuned

2.5. プロファイルの継承とプロファイルカスタマイズ変数

TuneD は、新しいプロファイルの作成や既存のプロファイルの変更を効率よく実行するために、プロファイルの継承、変数の使用、およびビルトイン関数をサポートしています。

プリインストールされたプロファイルとカスタムプロファイルは次のディレクトリーにあります。

  • プリインストールされたプロファイル: /usr/lib/tuned/profiles/ に配置されています
  • カスタムプロファイル: /etc/tuned/profiles/ に作成されます

    プロファイルの継承

    TuneD プロファイルは、[main] セクションの include オプションを使用して他のプロファイルから設定を継承できます。プロファイルの継承とは、子プロファイルが親からすべての設定を継承し、そのうえでカスタム要件に基づき新しいパラメーターをオーバーライドまたは追加できることを意味します。たとえば、balanced プロファイルに基づき、balanced プロファイルで元々設定されている medium_power ではなく min_power に ALPM を追加で設定するプロファイルを作成するには、次のコマンドを使用します。

    [main]
    include=balanced
    
    [scsi_host]
    alpm=min_power
    プロファイルをカスタマイズする際の変数の使用

    プロファイルをカスタマイズする際に変数を定義できます。変数を使用することで繰り返しの定義を減らすことができ、設定が簡素化されます。プロファイルに [variables] セクションを作成し、以下を使用することで独自の変数を定義できます。

    [variables]
    variable_name=value

    プロファイル内の変数の値を展開するには、以下を使用します。

    ${variable_name}

    変数を別のファイルに保存し、変数ファイルにファイルパスを追加することで、プロファイルのカスタマイズ時にこれらの変数を使用することもできます。たとえば、別のファイルの変数を考慮する場合は、設定ファイルに次の行を追加できます。

    tuned.conf:
    [variables]
    include=/etc/tuned/my-variables.conf
    
    [bootloader]
    cmdline=isolcpus=${isolated_cores}

    my-variable.conf ファイルには、次のように isolated_cores=1,2 が追加されます。

    my-variable.conf:
    isolated_cores=1,2

2.6. プロファイルのカスタマイズに使用するビルトイン関数

TuneD プロファイルのビルトイン関数を使用すると、プロファイルがアクティブ化されたときに実行時に動的に展開できます。TuneD 変数とビルトイン関数を組み合わせて使用することで、プロファイル内の値を動的に変更および処理できます。さらに、カスタム Python 関数をプラグインとして作成および統合することで、カスタム関数を使用して TuneD を拡張できます。

ビルトイン関数を起動するための構文
${f:function_name:argument_1:argument_2}

プロファイルと tuned.conf ファイルが配置されているディレクトリーパスを取得するには、次の構文を必要とする PROFILE_DIR 変数を使用します。

${i:PROFILE_DIR}
ビルトイン関数を使用して CPU コアを分離する例
[variables]
non_isolated_cores=0,3-5

[bootloader]
cmdline=isolcpus=${f:cpulist_invert:${non_isolated_cores}}

この例では、${non_isolated_cores} 変数は 0,3-5 に展開されます。cpulist_invert 関数は CPU リストを反転します。6 つの CPU を搭載したシステムでは、0,3-51,2 に反転され、カーネルは isolcpus=1,2 オプションで起動します。

Expand
表2.1 利用可能なビルトイン関数:
関数名説明

assertion

2 つの引数を比較します。一致しない場合、関数は最初の引数からテキストをログに記録し、プロファイルの読み込みを中止します。

assertion_non_equal

2 つの引数を比較します。2 つの引数が一致する場合、関数は最初の引数からテキストをログに記録し、プロファイルの読み込みを中止します。

calc_isolated_cores

分離されたコアを計算して返します。引数は、ハウスキーピング用に予約するソケットあたりのコア数を指定します。指定しない場合は、ソケットごとに 1 つのコアがハウスキーピング用に予約され、残りは分離されます。

check_net_queue_count

ユーザーがネットデバイスのキューの数を指定したかどうかを確認します。指定していない場合、ハウスキーピング CPU の数が返されます。

cpuinfo_check

/proc/cpuinfo に対して正規表現をチェックします。次の形式の引数を受け入れます: REGEX1、STR1、REGEX2、STR2、…[, STR_FALLBACK]。REGEX1 が /proc/cpuinfo 内の何かと一致する場合、それは STR1 に展開されます。REGEX2 が一致する場合、それは STR2 に展開されます。最初の一致で停止します。一致する正規表現がない場合は、STR_FALLBACK に展開されます。フォールバックが指定されていない場合は、空の文字列に展開されます。

cpulist2devs

CPU リストをデバイス文字列に変換します。

cpulist2hex

CPU リストを 16 進数の CPU マスクに変換します。

cpulist2hex_invert

CPU リストを 16 進数の CPU マスクに変換し、反転します。

cpulist_invert

補完するために CPU のリストを反転します。たとえば、4 つの CPU (0-3) を搭載したシステムでは、リスト 0,2,3 の反転は 1 になります。

cpulist_online

リストからの CPU がオンラインかどうかをチェックします。オンライン CPU のみを含むリストを返します。

cpulist_pack

CPU リストを、1,2,3,5 の形式で 1-3,5 に圧縮します。

cpulist_present

リストに CPU が存在するかどうかを確認します。存在する CPU のみを含むリストを返します。

cpulist_unpack

1-3,4 形式の CPU リストを、1,2,3,4 に展開します。

exec

プロセスを実行し、その出力を返します。

hex2cpulist

16 進数の CPU マスクを CPU リストに変換します。

intel_recommended_pstate

プロセッサーコード名をチェックし、推奨される intel_pstate CPUFreq ドライバーモードを返します。PROCESSOR_NAME リストにない新しい世代のプロセッサーの場合は、"Active" が返されます。

iscpu_check

iscpu の出力に対して正規表現をチェックします。次の形式の引数を受け入れます: REGEX1、STR1、REGEX2、STR2、…[, STR_FALLBACK]。REGEX1 が出力内の何かと一致する場合、それは STR1 に展開されます。REGEX2 が一致する場合、それは STR2 に展開されます。最初の一致で停止します。一致する正規表現がない場合は、STR_FALLBACK に展開されます。フォールバックが指定されていない場合は、空の文字列に展開されます。

package2cpus

パッケージ (ソケット) の CPU デバイスリストを提供します。

package2uncores

パッケージ (ソケット) の非コアデバイスリストを提供します。

regex_search_ternary

正規表現を使用した三項演算子。STR1、REGEX、STR2、STR3 の形式の引数を受け取ります。REGEX が STR1 と一致する場合 (re.search を使用)、STR2 が返されます。それ以外の場合は STR3 が返されます。

log

引数の連結を展開し、結果をログに記録します。デバッグに役立ちます。

kb2s

KB をディスクセクターに変換します。

s2kb

ディスクセクターを KB に変換します。

strip

渡されたすべての引数から文字列を作成し、最初と最後の空白の両方を削除します。

virt_check

TuneD が仮想マシンまたはベアメタルのどちらで実行しているかを確認します。仮想マシン内では、この関数が最初の引数を返します。ベアメタルでは、この関数は、エラーが発生した場合でも 2 番目の引数を返します。

2.7. TuneD プラグイン

TuneD プロファイルはプラグインを使用して、システム上のさまざまなデバイスを監視または最適化します。TuneD では、以下の 2 つのタイプのプラグインを使用します。

監視プラグイン
CPU 負荷、ディスク I/O、ネットワークトラフィックなどのシステムデータを収集するために使用されます。監視プラグインの出力は、動的チューニング向けチューニングプラグインによって使用できます。監視プラグインは、有効ないずれかのチューニングプラグインでメトリックが必要な場合に必ず自動的にインスタンス化されます。利用可能な監視プラグインは次のとおりです。
disk
デバイスおよび測定間隔ごとのディスク負荷 (IO 操作の数) を取得します。
net
ネットワークカードおよび測定間隔ごとのネットワーク負荷 (転送済みパケットの数) を取得します。
load
CPU および測定間隔ごとの CPU 負荷を取得します。
チューニングプラグイン
各チューニングプラグインにより、個別サブシステムがチューニングされ、TuneD プロファイルから入力される複数のパラメーターが取得されます。各サブシステムには、チューニングプラグインの個別インスタンスで処理される複数のデバイス (複数の CPU やネットワークカードなど) を含めることができます。また、個別デバイスの特定の設定もサポートされます。利用可能なチューニングプラグインは次のとおりです。
acpi
ACPI ドライバーを設定します。ACPI プラットフォームプロファイル sysfs 属性を設定するには、platform_profile オプションを使用します。これは、他のドライバー用の汎用的な power/performance 設定 API です。複数のプロファイルを | で区切って指定できます。利用可能な最初のプロファイルが選択されます。
audio
音声コーデックの autosuspend タイムアウトを、timeout オプションで指定した値に設定します。現在、snd_hda_intel コーデックおよび snd_ac97_codec コーデックに対応しています。値が 0 の場合は、autosuspend が無効になります。また、ブール値オプション reset_controller を true に設定することにより、コントローラーを強制的にリセットすることもできます。
bootloader
カーネルコマンドラインにオプションを追加します。このプラグインは GRUB ブートローダーのみをサポートします。GRUB 設定ファイルのカスタマイズされた非標準の場所は、grub2_cfg_file オプションで指定できます。そのカーネルオプションは、現在の GRUB 設定とそのテンプレートに追加されます。カーネルオプションを有効にするには、システムを再起動する必要があります。
cpu
CPU ガバナーを governor オプションで指定された値に設定し、CPU 負荷に応じて電源管理サービス品質 (PM QoS) CPU ダイレクトメモリーアクセス (DMA) のレイテンシーを動的に変更することで、CPU ガバナーと電源設定を管理します。
disk
apmscheduler_quantumreadaheadreadahead_multiplyspindown などのディスク設定を管理します。
eeepc_she
CPU の負荷に応じて、フロントサイドバス (FSB) の速度を動的に設定します。
irq
個々の割り込み要求 (IRQ) をデバイスとして処理し、それぞれ異なるデバイスまたは IRQ をアドレス指定する複数のプラグインインスタンスを定義できます。プラグインで使用されるデバイス名は irq<n> です。この場合の <n> は IRQ 番号です。特殊デバイス DEFAULT は、すべての非アクティブな IRQ に適用される /proc/irq/default_smp_affinity に書き込まれる値を制御します。
irqbalance
irqbalance の設定を管理します。プラグインは、/etc/sysconfig/irqbalance で IRQ のバランスを再調整する場合にスキップする必要がある CPU を設定します。その後、以前実行されていた場合にのみ irqbalance を再起動します。
modules
カスタムカーネルモジュールオプションを適用します。カーネルモジュールにパラメーターを設定して /etc/modprobe.d/tuned.conf ファイルを作成できます。構文は module=option1=value1 option2=value2…​ を使用し、この場合の module はモジュール名、optionx=valuex は存在する可能性のあるモジュールオプションです。
mounts
マウントされたファイルシステムのバリアを有効または無効にします。
net
ethtool ユーティリティーと同じ構文を使用して、Wake-on-LAN とインターフェイス速度を設定します。インターフェイスの使用状況に応じて、インターフェイス速度も動的に変更します。
rtentsk
静的キーの有効化または無効化によって発生するプロセッサー間の割り込みを回避します。オプションはありません。これを追加すると、TuneD はタイムスタンプを有効にした状態でソケットを開放したまま維持するため、静的キーも有効な状態が維持されます。
selinux
SELinux オプションを調整します。アクセスの許可または拒否など、SELinux の決定がキャッシュされます。このキャッシュは、アクセスベクトルキャッシュ (AVC) として知られています。このように結果がキャッシュされると、確認が必要な量が減るため、SELinux ポリシーのパフォーマンスが向上します。avc_cache_threshold オプションを使用すると、AVC エントリーの最大数を調整できます。
systemd
systemd オプションを調整します。cpu_affinity オプションを使用すると、/etc/systemd/system.conf で CPUAffinity を設定できます。これにより、サービスマネージャーの CPU アフィニティーと、フォークされたすべてのプロセスのデフォルトの CPU アフィニティーが設定されます。コンマ区切りの CPU リストを追加します。必要に応じて、CPU 範囲をマイナス記号 (-) で指定します。
scsi_host
SCSI ホスト設定を調整します (例: ALPM)。
scheduler
スケジューリングの優先度、CPU コア分離、プロセスアフィニティー、スレッドアフィニティー、および IRQ アフィニティーを調整するためのさまざまなオプションを提供します。
script
プロファイルのロード時またはアンロード時に、外部スクリプトまたはバイナリーを実行します。
service
プラグインオプションで指定されたさまざまな sysvinit、sysv-rc、openrc、systemd サービスを処理します。サポートされているサービス処理コマンドは、start、stop、enable、disable です。
sysctl
カーネルパラメーターを変更します。このプラグインは、TuneD で使用可能な他のプラグインでカバーされていないシステム設定を変更する場合にのみ使用してください。構文は、name=value です。この場合の name は、sysctl ユーティリティーが指定した名前と同じです。
sysfs
プラグインオプションで指定したさまざまな sysfs 設定を設定します。構文は name=value です。この場合の name は、使用する sysfs パスです。
usb
USB 自動サスペンドのタイムアウトを調整します。値が 0 の場合は、autosuspend が無効になります。
uncore
最大および最小のアンコア周波数を制限します。max_freq_khz オプションと min_freq_khz オプションは、Intel アンコア周波数ドライバーによって公開される sysfs ファイルに対応します。値は kHz 単位、または設定可能な範囲のパーセンテージで指定できます。
video
ビデオカードのさまざまな省電力レベルを設定します。現在、Radeon カードにのみ対応しています。powersave レベルは、radeon_powersave オプションを使用して指定できます。サポートされている値は、default、auto、low、mid、high、dynpm、dpm-battery、dpm-balanced、dpm-perfomance です。
vm
transparent huge page を有効または無効にします。transparent_hugepages オプションの有効な値は、always, never, madvise です。

2.8. 新規 TuneD プロファイルの作成

新しい TuneD プロファイルを作成して、パフォーマンス最適化の要件をカスタマイズできます。

前提条件

手順

  1. /etc/tuned/profiles ディレクトリーで、作成するプロファイルと同じ名前の新しいディレクトリー作成します。

    # mkdir /etc/tuned/profiles/my-profile
  2. 新しいディレクトリーに、tuned.conf ファイルを作成します。
  3. 要件に応じて、ファイルを編集して [main] セクションとプラグイン定義を追加します。たとえば、balanced プロファイルの設定を表示します。

    [main]
    summary=General non-specialized TuneD profile
    
    [cpu]
    governor=conservative
    energy_perf_bias=normal
    
    [audio]
    timeout=10
    
    [video]
    radeon_powersave=dpm-balanced, auto
    
    [scsi_host]
    alpm=medium_power
  4. プロファイルをアクティブ化します。

    # tuned-adm profile my-profile

検証

  • プロファイルがアクティブになり、適用されていることを確認します。

    $ tuned-adm active
    Current active profile: my-profile
    $ tuned-adm verify
    Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.

2.9. 既存の TuneD プロファイルの変更

カスタム要件に合わせて既存プロファイルのパラメーターを変更できます。既存の TuneD プロファイルに基づいて変更した子プロファイルを作成できます。

前提条件

手順

  1. /etc/tuned/profiles ディレクトリーで、作成するプロファイルと同じ名前の新しいディレクトリー作成します。

    # mkdir /etc/tuned/profiles/modified-profile
  2. 新しいディレクトリーに、ファイル tuned.conf を作成し、以下のように [main] セクションを設定します。

    [main]
    include=parent-profile

    parent-profile を、変更するプロファイルの名前に置き換えます (例: throughput-performance)。

  3. プロファイルの変更を含めます。たとえば、throughput-performance プロファイルの swappiness を低減するには、次のコマンドを使用して、vm.swappiness の値をデフォルトの 10 ではなく 5 に変更します。

    [main]
    include=throughput-performance
    
    [sysctl]
    vm.swappiness=5
  4. プロファイルをアクティブ化します。

    # tuned-adm profile modified-profile

検証

  • プロファイルがアクティブになり、適用されていることを確認します。

    $ tuned-adm active
    Current active profile: modified-profile
    $ tuned-adm verify
    Verification succeeded, current system settings match the preset profile. See tuned log file ('/var/log/tuned/tuned.log') for details.

2.10. TuneD の no-daemon モードを有効にする

TuneD は、常駐メモリーを必要としない no-daemon モードで実行できます。このモードでは、TuneD が設定を適用し、終了します。ただし、このモードでは、D-Bus サポート、ホットプラグサポート、設定のロールバック機能など、特定の機能が無効になることに注意してください。

前提条件

  • システム設定を変更するためのルート権限または適切な権限を持っている。

手順

  1. 次の変更を加えて /etc/tuned/tuned-main.conf ファイルを編集します。

    sudo vi /etc/tuned/tuned-main.conf
    daemon = 0
  2. ファイルを保存してから閉じます。
  3. tuned サービスを再起動するか、プロファイルを再適用または切り替えます。

    # systemctl restart tuned
    # tuned-adm profile <tuned_profile>
  4. tuned のステータスを確認します。

    # tuned-adm active
    It seems that tuned daemon is not running, preset profile is not activated.
    Preset profile: <tuned_profile>

第3章 ディスクスケジューラーの設定

ディスクスケジューラーは、ストレージデバイスに送信された I/O 要求を順序付けます。スケジューラーは以下の複数の方法で設定できます。

注記

Red Hat Enterprise Linux では、ブロックデバイスはマルチキュースケジューリングのみをサポートします。これにより、ブロックレイヤーのパフォーマンスを高速ソリッドステートドライブ (SSD) およびマルチコアシステムで適切に拡張できます。

3.1. 利用可能なディスクスケジューラー

Red Hat Enterprise Linux では、次のマルチキューディスクスケジューラーがサポートされています。

none
FIFO (First-in First-out) スケジューリングアルゴリズムを実装します。これにより、汎用のブロック層で単純な last-hit キャッシュを介して要求がマージされます。
mq-deadline

リクエストがスケジューラーに到達した時点から、リクエストに対して保証されたレイテンシーを提供するよう試みます。mq-deadline スケジューラーは、キューに追加された I/O リクエストを読み取りまたは書き込みバッチに分類し、論理ブロックアドレス指定 (LBA) の昇順で実行するようにスケジュールします。デフォルトでは、アプリケーションは読み取り I/O 操作でブロックする可能性の方が高いため、読み取りバッチの方が書き込みバッチより優先されます。mq-deadline はバッチを 1 つ処理した後、書き込み操作にどれくらいの期間プロセッサー時間が割り当てられていないかを確認し、次の読み取りまたは書き込みバッチを適切にスケジュールします。

このスケジューラーはほとんどのユースケースに適していますが、必要に応じて特に書き込み動作より読み取り動作の方が頻繁に起こるユースケースに適しています。

bfq

デスクトップシステムおよび対話式のタスクを対象とします。bfq スケジューラーは、単一のアプリケーションがすべての帯域幅を使用しないようにします。これにより、ストレージデバイスがアイドル状態であるかのように常に応答できるようになります。デフォルトの設定では、bfq は、最大スループットを実現するのではなく、レイテンシーを最小限に抑えることに焦点を合わせています。

bfqcfq コードに基づいています。一定のタイムスライスごとにディスクを各プロセスに付与するのではなく、セクター数単位で測定されたバジェットをプロセスに割り当てます。このスケジューラーは大きなファイルをコピーする際に適しており、この場合、システムが応答しなくなることはありません。

kyber
スケジューラーは、ブロック I/O レイヤーに送信されたすべての I/O 要求のレイテンシーを計算することで、レイテンシーゴールを達成するために自身を調整します。cache-misses の場合、読み込み/同期書き込みリクエストにターゲットレイテンシーを設定できます。このスケジューラーは、NVMe、SSD などの低レイテンシーデバイスなど、高速なデバイスに適しています。
デフォルトのディスクスケジューラー
ブロックデバイスは、別のスケジューラーを指定しない限り、デフォルトのディスクスケジューラーを使用します。
注記

特に Non-Volatile Memory Express (NVMe) ブロックデバイスの場合、デフォルトのスケジューラーは none であり、Red Hat はこれを変更しないことを推奨しています。

カーネルは、デバイスのタイプに基づいてデフォルトのディスクスケジューラーを選択します。自動的に選択されたスケジューラーは、通常、最適な設定です。別のスケジューラーが必要な場合は、udev ルールまたは TuneD アプリケーションを使用して設定してください。選択したデバイスを一致させ、それらのデバイスのスケジューラーのみを切り替えます。

3.2. 各種ユースケースで異なるディスクスケジューラー

分析およびチューニング作業の前に、システムで実行されるタスクに応じて、次のディスクスケジューラーをベースラインとして使用してください。

Expand
ユースケースディスクスケジューラー

SCSI インターフェイスを備えた従来の HDD

mq-deadline または bfq を使用します。

高速ストレージで高パフォーマンスの SSD または CPU がバインドされたシステム

特にエンタープライズアプリケーションを実行する場合は none を使用します。または kyber を使用します。

デスクトップまたはインタラクティブなタスク

bfq を使用します。

仮想ゲスト

mq-deadline を使用します。マルチキューに対応しているホストバスアダプター (HBA) ドライバーでは、none を使用します。

3.3. アクティブなディスクスケジューラーの確認

特定のブロックデバイスで現在アクティブなディスクスケジューラーを表示できます。

手順

  • /sys/block/device/queue/scheduler ファイルの内容を読み取ります。

    # cat /sys/block/device/queue/scheduler
    [mq-deadline] kyber bfq none

    ファイル名の device は、ブロックデバイス名に置き換えます (例: sdc)。アクティブなスケジューラーは、角括弧 ([ ]) にリスト表示されます。

3.4. TuneD を使用したディスクスケジューラーの設定

選択したブロックデバイスに特定のディスクスケジューラーを設定する TuneD プロファイルを作成して有効にできます。この設定は、システムを再起動しても持続します。以下のコマンドと設定では、次の部分を置き換えてください。

  • device をブロックデバイスの名前に置き換えます (例: sdf)。
  • selected-scheduler を、デバイスに設定するディスクスケジューラーに置き換えます (例: bfq)。

前提条件

手順

  1. オプション: プロファイルのベースとなる既存の TuneD プロファイルを選択します。利用可能なプロファイルのリストは、RHEL とともに配布される TuneD プロファイル を参照してください。
  2. 現在アクティブなプロファイルを確認するには、次のコマンドを実行します。

    # tuned-adm active
  3. TuneD プロファイルを保存する新しいディレクトリーを作成します。

    # mkdir /etc/tuned/<new-profile>
  4. 選択したブロックデバイスのシステム固有の識別子を見つけます。

    # udevadm info --query=property --name=/dev/device | grep -E '(WWN|SERIAL)'
    ID_WWN=0x5002538d00000000_
    ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    ID_SERIAL_SHORT=20120501030900000
    注記

    この例のコマンドは、指定したブロックデバイスに関連付けられた World Wide Name (WWN) またはシリアル番号として識別されるすべての値を返します。WWN を使用することを推奨しますが、特定のデバイスで WWN が常に使用できるとは限りません。コマンド例によって返される値は、いずれもデバイスシステムの一意の ID として使用できます。

  5. /etc/tuned/my-profile/tuned.conf 設定ファイルを作成します。このファイルで、以下のオプションを設定します。

    1. 必要に応じて、既存のプロファイルを追加します。

      [main]
      include=<existing-profile>
    2. WWN 識別子に一致するデバイスに対して選択したディスクスケジューラーを設定します。

      [disk]
      devices_udev_regex=IDNAME=device system unique id
      elevator=selected-scheduler

      ここでは、以下のようになります。

      • IDNAME は、使用されている識別子の名前に置き換えます (例:ID_WWN)。
      • device system unique id は、選択した識別子の値に置き換えます (例: 0x5002538d00000000)。devices_udev_regex オプションで複数のデバイスにマッチさせるには、識別子を括弧で囲み、縦棒で区切ります。

        devices_udev_regex=(ID_WWN=0x5002538d00000000)|(ID_WWN=0x1234567800000000)
  6. プロファイルを有効にします。

    # tuned-adm profile <new-profile>

検証

  1. TuneD プロファイルがアクティブで、適用されていることを確認します。

    $ tuned-adm active
    Current active profile: <profile>
    $ tuned-adm verify
    Verification succeeded, current system settings match the preset profile.
    See TuneD log file ('/var/log/tuned/tuned.log') for details.
  2. /sys/block/device/queue/scheduler ファイルの内容を読み取ります。

    $ cat /sys/block/device/queue/scheduler
    [mq-deadline] kyber bfq none

    ファイル名の device は、ブロックデバイス名に置き換えます (例: sdc)。アクティブなスケジューラーは、角括弧 ([]) にリスト表示されます。

3.5. udev ルールを使用したディスクスケジューラーの設定

udev ルールを使用して、特定のブロックデバイスに対して特定のディスクスケジューラーを設定できます。この設定は、システムを再起動しても持続します。以下のコマンドと設定では、次の部分を置き換えてください。

  • device をブロックデバイスの名前に置き換えます (例: sdf)。
  • selected-scheduler を、デバイスに設定するディスクスケジューラーに置き換えます (例: bfq)。

手順

  1. ブロックデバイスのシステム固有の識別子を見つけます。

    # $ udevadm info --name=/dev/device | grep -E '(WWN|SERIAL)'
    E: ID_WWN=0x5002538d00000000
    E: ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    E: ID_SERIAL_SHORT=20120501030900000
    注記

    この例のコマンドは、指定したブロックデバイスに関連付けられた World Wide Name (WWN) またはシリアル番号として識別されるすべての値を返します。WWN を使用することを推奨しますが、特定のデバイスで WWN が常に使用できるとは限りません。コマンド例によって返される値は、いずれもデバイスシステムの一意の ID として使用できます。

  2. udev ルールを設定するために、次の内容の /etc/udev/rules.d/99-scheduler.rules ファイルを作成します。

    ACTION=="add|change", SUBSYSTEM=="block", ENV{IDNAME}=="device system unique id", ATTR{queue/scheduler}="selected-scheduler"

    ここでは、以下のようになります。

    • IDNAME は、使用されている識別子の名前に置き換えます (例:ID_WWN)。
    • device system unique id は、選択した識別子の値に置き換えます (例: 0x5002538d00000000)。
  3. udev ルールを再読み込みします。

    # udevadm control --reload-rules
  4. スケジューラー設定を適用します。

    # udevadm trigger --type=devices --action=change

検証

  • アクティブなスケジューラーを確認します。

    # cat /sys/block/device/queue/scheduler

3.6. 特定のディスクのスケジューラーを一時的に設定する

特定のブロックデバイスに対して特定のディスクスケジューラーを設定できます。この設定は、システムを再起動すると元に戻ります。

手順

  • 選択したスケジューラーの名前を /sys/block/device/queue/scheduler ファイルに書き込みます。

    # echo selected-scheduler > /sys/block/device/queue/scheduler

    ファイル名の device は、ブロックデバイス名に置き換えます (例: sdc)。

検証

  • スケジューラーがデバイスでアクティブになっていることを確認します。

    # cat /sys/block/device/queue/scheduler

第4章 PCP の設定

Performance Co-Pilot (PCP) は、システムレベルのパフォーマンス測定を監視、視覚化、保存、および分析するためのツール、サービス、およびライブラリーのスイートです。Python、Perl、C、および C のインターフェイスを使用したパフォーマンスメトリックを追加できます。分析ツールは、Python、C、C のクライアント API を直接使用でき、豊富な Web アプリケーションは、JSON インターフェイスを使用して利用可能なすべてのパフォーマンスデータを調べることができます。ライブ結果とアーカイブされたデータを比較して、データパターンを解析できます。

PCP の機能
  • 軽量の分散アーキテクチャー。複雑なシステムの集中分析に役に立ちます。
  • リアルタイムのデータを監視および管理する機能。
  • 履歴データをログに記録および取得する機能。
PCP には以下のコンポーネントがあります。
  • Performance Metric Collector Daemon (pmcd) は、インストールされている Performance Metric Domain Agents (PMDA) からパフォーマンスデータを収集します。PMDA は、システムで個別にロードまたはアンロードでき、同じホスト上の PMCD によって制御されます。
  • pminfopmstat などのさまざまなクライアントツールは、同じホストまたはネットワーク上でこのデータを取得、表示、アーカイブ、処理できます。
  • pcp および pcp-system-tools パッケージは、コマンドラインツールとコア機能を提供します。
  • pcp-gui パッケージは、グラフィカルアプリケーション pmchart を提供します。
  • grafana-pcp パッケージは、Grafana を使用した強力な Web ベースの視覚化機能とアラート機能を提供します。

4.1. PCP のインストールおよび有効化

必要なパッケージをインストールし、PCP 監視サービスを有効にして使用を開始します。pcp-zeroconf パッケージを使用して PCP のインストールを自動化することもできます。pcp-zeroconf を使用して PCP をインストールする方法の詳細は、pcp-zeroconf を使用した PCP の設定 を参照してください。

手順

  1. pcp パッケージをインストールします。

    # dnf install pcp
  2. ホストマシンで pmcd サービスを有効にして起動します。

    # systemctl enable pmcd
    # systemctl start pmcd

検証

  • PMCD プロセスがホストで実行されているかどうかを確認します。

    # pcp
    Performance Co-Pilot configuration on arm10.local:
    
     platform: Linux arm10.local 6.12.0-55.13.1.el10_0.aarch64 #1 SMP PREEMPT_DYNAMIC Mon May 19 07:29:57 UTC 2025 aarch64
     hardware: 4 cpus, 1 disk, 1 node, 3579MB RAM
     timezone: JST-9
     services: pmcd
         pmcd: Version 6.3.7-1, 12 agents, 6 clients
         pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm jbd2
               dm openmetrics

4.2. 最小限の PCP 設定のデプロイメント

最小 PCP 設定では、Red Hat Enterprise Linux でのパフォーマンスの統計情報が収集されます。この設定は、詳細な分析のためにデータを収集するために必要な、実稼働システムに最低限のパッケージを追加します。作成された tar.gz ファイルおよび pmlogger の出力のアーカイブは、さまざまな PCP ツールを使用して解析し、その他のソースのパフォーマンス情報と比較できます。

前提条件

手順

  1. pmlogger 設定を更新します。

    # pmlogconf -r /var/lib/pcp/config/pmlogger/config.default
  2. pmcd サービスおよび pmlogger サービスを起動します。

    # systemctl start pmcd.service
    # systemctl start pmlogger.service
  3. 必要な操作を実行して、パフォーマンスデータを記録します。
  4. 出力を保存し、ホスト名と現在の日時に基づいて名前が付けられた tar.gz ファイルに保存します。

    # cd /var/log/pcp/pmlogger/
    # tar -czf $(hostname).$(date +%F-%Hh%M).pcp.tar.gz $(hostname)
  5. このファイルを展開し、PCP ツールを使用してデータを分析します。

4.3. PCP で配布されるシステムサービスおよびツール

基本パッケージ pcp には、システムサービスと基本ツールが含まれます。pcp-system-toolspcp-guipcp-devel パッケージで提供される追加ツールをインストールできます。

PCP で配布されるシステムサービスのロール

pmcd
Performance Metric Collector Daemon。
pmie
Performance Metrics Inference Engine
pmlogger
パフォーマンスメトリックロガー。
pmproxy
リアルタイムおよびヒストリカルなパフォーマンスメトリックのプロキシー、時系列クエリー、REST API サービス。

基本 PCP パッケージで配布されるツール

+ pcp:: Performance Co-Pilot インストールの現在のステータスを表示します。

pcp-check
pmcdpmloggerpmproxy、PMDA などのコアコンポーネントとオプションコンポーネントをアクティブ化または非アクティブ化します。
pcp-vmstat
システムパフォーマンスの概要を 5 秒ごとに表示します。プロセス、メモリー、ページング、ブロック IO、トラップ、CPU のアクティビティーに関する情報を表示します。
pmconfig
設定パラメーターの値を表示します。
pmdiff
パフォーマンスのリグレッションを検索する際に重要と思われる変更について、指定された時間枠で、1 つまたは 2 つのアーカイブのすべてのメトリックの平均値を比較します。
pmdumplog
Performance Co-Pilot アーカイブファイルの制御、メタデータ、インデックス、および状態に関する情報を表示します。
pmfind
ネットワークで PCP サービスを見つけます。
pmie
一連の演算式、論理式、およびルール式を定期的に評価する推論エンジン。メトリックは、ライブシステムまたは Performance Co-Pilot アーカイブファイルのいずれかから収集されます。
pmieconf
設定可能な pmie 変数を表示または設定します。
pmiectl
pmie のプライマリー以外のインスタンスを管理します。
pminfo
パフォーマンスメトリックに関する情報を表示します。メトリックは、ライブシステムまたは Performance Co-Pilot アーカイブファイルのいずれかから収集されます。
pmlc
アクティブな pmlogger インスタンスを対話的に設定します。
pmlogcheck
Performance Co-Pilot アーカイブファイルで無効なデータを特定します。
pmlogconf
pmlogger 設定ファイルを作成および変更します。
pmlogctl
pmlogger のプライマリー以外のインスタンスを管理します。
pmloglabel
Performance Co-Pilot アーカイブファイルのラベルを検証、変更、または修復します。
pmlogsummary
Performance Co-Pilot アーカイブファイルに格納されたパフォーマンスメトリックに関する統計情報を計算します。
pmprobe
パフォーマンスメトリックの可用性を決定します。
pmsocks
ファイアウォール経由でホストされる Performance Co-Pilot へのアクセスを許可します。
pmstat
システムパフォーマンスの簡単な概要を定期的に表示します。
pmstore
パフォーマンスメトリックの値を変更します。
pmseries
PCP の機能と Valkey などの分散キー値データストアを使用する、高速でスケーラブルな時系列クエリー。
pmtrace
トレース PMDA のコマンドラインインターフェイスを提供します。
pmval
パフォーマンスメトリクスの現在の値を更新して表示します。

別途インストールする pcp-system-tools パッケージで配布されるツール

pcp-atop
パフォーマンスの観点から最も重要なハードウェアリソース (CPU、メモリー、ディスク、およびネットワーク) のシステムレベルの占有を表示します。
pcp-atopsar
さまざまなシステムリソースの使用状況に関するシステムレベルのアクティビティーレポートを生成します。このレポートは、pmlogger または pcp-atop の -w オプションを使用してあらかじめ記録された生のログファイルから生成されます。
pcp-dmcache
設定されたデバイスマッパーキャッシュターゲット (デバイスの IOP、キャッシュデバイスとメタデータデバイスの使用率、各キャッシュデバイスの読み取り/書き込みのヒット率とミス率、比率など) に関する情報を表示します。
pcp-dstat
一度に 1 台のシステムのメトリックを表示します。複数のシステムのメトリックを表示するには、--host オプションを使用します。
pcp-free
システム内の空きメモリーと使用済みメモリーを報告します。
pcp-htop
システム上で実行されているすべてのプロセスとそのコマンドライン引数を、top コマンドと同様の形式で表示しますが、縦横にスクロールしたり、マウスで操作したりすることができます。また、プロセスをツリー形式で表示したり、複数のプロセスを選択して一度に処理することもできます。
pcp-ipcs
呼び出しプロセスが読み取りアクセスできる inter-process communication (IPC) ファシリティーの情報を表示します。
pcp-mpstat
CPU および割り込み関連の統計情報を報告します。
pcp-numastat
カーネルのメモリーアロケータからの NUMA 割り当て統計を表示します。
pcp-pidstat
システム上で動作している個々のタスクやプロセスに関する情報を表示します (CPU パーセンテージ、メモリーやスタックの使用率、スケジューリング、優先度など)。デフォルトでは、ローカルホストのライブデータを報告します。
pcp-shping
pmdashping Performance Metrics Domain Agent (PMDA) がエクスポートした shell-ping サービスメトリクスをサンプリングして報告します。
pcp-ss
pmdasockets PMDA が収集したソケットの統計情報を表示します。
pcp-tapestat
テープデバイスの I/O 統計情報を報告します。
pcp-uptime
システムの稼働時間、現在ログオンしているユーザー数、過去 1 分、5 分、15 分のシステム負荷の平均値を表示します。
pcp-verify
Performance Co-Pilot コレクターのインストールのさまざまな側面を検査し、特定の動作モードに対して正しく設定されているかを報告します。
pcp-iostat
SCSI デバイス (デフォルト) またはデバイスマッパーデバイス (-x デバイスマッパーオプションを使用) の I/O 統計情報を報告します。
pmrep
選択した、簡単にカスタマイズ可能なパフォーマンスメトリック値に関するレポート。

別途インストールする pcp-gui パッケージで配布されるツール

pmchart
PCP の機能を介して利用可能なパフォーマンスメトリック値を描画します。
pmdumptext
ライブまたは PCP アーカイブから収集されたパフォーマンスメトリックの値を出力します。

別途インストールする pcp-devel パッケージで配布されるツール

pmclient
PMAPI (Performance Metrics Application Programming Interface) を使用して、高水準のシステムパフォーマンスメトリックを表示します。
pmdbg
利用可能な Performance Co-Pilot デバッグ制御フラグとその値を表示します。
pmerr
利用可能な Performance Co-Pilot エラーコードと、それに対応するエラーメッセージを表示します。
pcp-xsos
PCP アーカイブまたはそのシステムのライブメトリクス値から取得した単一のサンプルを使用して、システムの迅速な概要レポートを提供します。

別パッケージとして配布されるその他のツール

pcp-geolocate
コレクターシステムの地理ラベルを検出します。
pcp2openmetrics
PCP から Open Metrics 形式へのカスタマイズ可能なパフォーマンスメトリクスエクスポーターツール。コマンドライン引数または設定ファイルを使用して、エクスポート用に、ライブまたはアーカイブされたシステムとアプリケーションなど、使用可能な任意のパフォーマンスメトリクスを選択できます。

4.4. PCP デプロイメントのアーキテクチャー

PCP は、PCP デプロイメントの規模に基づき、複数のデプロイメントアーキテクチャーをサポートし、高度なセットアップを実現するための多くのオプションを提供します。利用可能なスケーリングデプロイメントセットアップバリアント (サイジング係数と設定オプションによって決定) は次のとおりです。

Localhost
各サービスは監視対象のマシン上でローカルに動作します。設定を変更せずにサービスを開始すると、ローカルホストにデフォルトのスタンドアロンデプロイメントが行われます。このセットアップでは、単一のノードを超えるスケーリングはサポートされません。ただし、Valkey は、データが複数のホスト間で共有される、可用性が高くスケーラブルなクラスターモードで実行することもできます。また、クラウドに Valkey クラスターをデプロイしたり、クラウドプロバイダーからマネージド Valkey クラスターを使用したりすることもできます。
Decentralized
ローカルホストと分散型のセットアップの唯一の違いは、集中型の Valkey サービスです。このモデルでは、ホストは監視対象の各ホスト上で pmlogger サービスを実行し、ローカルの pmcd インスタンスからメトリクスを取得します。その後、ローカルの pmproxy サービスは、パフォーマンスメトリクスを中央の Valkey インスタンスにエクスポートします。

図4.1 分散型ロギング

分散型ロギング
集中型ロギング - pmlogger ファーム
監視対象ホストのリソース使用量が制限されている場合、pmlogger ファームというデプロイメントオプションもあります。これは集中型ロギングとも呼ばれます。この設定では、1 つのロガーホストが複数の pmlogger プロセスを実行し、それぞれが異なるリモート pmcd ホストからパフォーマンスメトリクスを取得するように設定されます。集中ロガーのホストは pmproxy サービスを実行するように設定され、このサービスは、結果として生じる PCP アーカイブズのログを検出し、メトリクスデータを Valkey インスタンスに読み込みます。

図4.2 集中型ロギング - pmlogger ファーム

集中型ロギング - pmlogger ファーム
統合型 - 複数の pmlogger ファーム
大規模なデプロイメントの場合は、複数の pmlogger ファームをフェデレーション方式でデプロイします。例えば、ラックやデータセンターごとに 1 つの pmlogger ファームをデプロイします。各 pmlogger ファームは、メトリックを中央の Valkey インスタンスに読み込みます。

図4.3 統合型 - 複数の pmlogger ファーム

統合型 - 複数の pmlogger ファーム
注記

デフォルトでは、Valkey のデプロイメント設定は、スタンドアロン、localhost となっています。しかし、Valkey はオプションとして、データを複数のホストで共有する、高可用性と高スケーラビリティを備えたクラスター形態で実行できます。また、クラウド上に Valkey クラスターをデプロイしたり、クラウドベンダーが提供するマネージド Valkey クラスターを利用したりすることも可能です。

4.5. PCP ロギングのスケーリングに影響を与える要因

Performance Co-Pilot (PCP) ロギングに影響を与える主な要因は、ハードウェアリソース、ログに記録されたメトリクス、ロギング間隔、およびアップグレード後のアーカイブ管理です。

Remote system size
リモートシステムのハードウェア設定 (CPU、ディスク、ネットワークインターフェイスの数など) は、集中型のロギングホスト上の各 pmlogger インスタンスが収集するデータの量に直接影響します。
ログに記録されるメトリクス
ログに記録されるメトリクスの数と種類は、ストレージ要件に大きな影響を与えます。特に、per-process proc.* メトリクスは大量のディスク領域を必要とします。たとえば、標準の pcp-zeroconf セットアップと 10 秒のロギング間隔の場合、proc メトリクスがなければ 11 MB ですが、proc メトリクスを有効にすると 155 MB に増加します (10 倍の差)。さらに、各メトリックのインスタンス数 (たとえば CPU、ブロックデバイス、ネットワークインターフェイスの数など) も、必要なストレージ容量に影響を与えます。
ロギング間隔
ストレージ使用量は、メトリクスロギングの頻度により異なります。各 pmlogger インスタンスの予想される毎日の PCP アーカイブファイルサイズは、pmlogger.log ファイルに記録されます。これらの推定値は圧縮されていないデータを表していますが、PCP アーカイブは通常 10:1 の圧縮率になるため、長期的なディスク容量要件はそれに応じて計算できます。
pmlogrewrite によるアーカイブ更新の管理
PCP をアップグレードするたびに、バージョン間でメトリクスメタデータの変更が検出されると、pmlogrewrite ツールは既存のアーカイブを更新します。このプロセスに必要な時間は、保存されているアーカイブの数に比例して増加します。

第5章 pmda-openmetrics の設定

Performance Co-Pilot (PCP) は、システムパフォーマンスを監視および管理するための柔軟で拡張可能なシステムです。これには、Performance Metric Domain Agents (PMDA) と呼ばれるビルトインエージェントがいくつか含まれています。PMDA は、PostgreSQL、Apache HTTPD、KVM 仮想マシンなどの一般的に使用されるアプリケーションやサービスからメトリクスを収集します。

5.1. pmda-openmetrics の概要

Red Hat リポジトリーにすぐに使用できる PMDA が存在しないカスタムアプリケーションやあまり一般的ではないアプリケーションを実行できます。このようなシナリオでは、pmda-openmetrics エージェントがギャップを埋めるのに役立ちます。pmda-openmetrics PMDA は、OpenMetrics-style 形式のテキストファイルを PCP 互換メトリクスに変換して、任意のアプリケーションのパフォーマンスメトリクスを公開します。OpenMetrics は、Prometheus やその他の監視ツールで広く使用されている形式であり、容易に統合できます。

pmda-openmetrics を実行すると、次のタスクを実行できます。

  • 既存の PMDA でカバーされていないカスタムアプリケーションを監視します。
  • 既存の OpenMetrics または Prometheus-exported メトリクスを PCP フレームワークに統合します。
  • 診断またはデモンストレーションのために、クイックモデルまたはテストメトリクスを作成します。

5.2. pmda-openmetrics のインストールと設定

使用を開始する前に、pmda-openmetrics をインストールして設定する必要があります。次の例は、pmda-openmetrics を使用して、テキストファイルから単一の数値を PCP メトリクスとして公開する方法を示しています。

前提条件

手順

  1. pmda-openmetrics PMDA をインストールします。

    # dnf -y install pcp-pmda-openmetrics
    # cd /var/lib/pcp/pmdas/openmetrics/
    # ./Install
  2. サンプルの OpenMetrics ファイルを作成します。

    # echo 'var1 {var2="var3"} 42' > /tmp/example.txt

    example.txt を目的のファイル名に置き換えます。

  3. ファイルが正しく作成されていることを確認します。

    # cat /tmp/example.txt
  4. メトリクスファイルパスを OpenMetrics エージェントに登録します。

    # echo "file:///tmp/example.txt" > /etc/pcp/openmetrics/example.url
  5. 設定が正しく作成されていることを確認します。

    # cat /etc/pcp/openmetrics/example.url
  6. 必要なシンボリックリンクを作成するために systemd-tmpfiles を設定します。

    # echo 'L+ /var/lib/pcp/pmdas/openmetrics/config.d/example.url - - - - ../../../../../../etc/pcp/openmetrics/example.url' \ > /usr/lib/tmpfiles.d/pcp-pmda-openmetrics-cust.conf
  7. シンボリックリンクが正しく設定されていることを確認します。

    # cat /usr/lib/tmpfiles.d/pcp-pmda-openmetrics-cust.conf
  8. tmpfiles 設定を適用してシンボリックリンクを作成します。

    # systemd-tmpfiles --create --remove /usr/lib/tmpfiles.d/pcp-pmda-openmetrics-cust.conf
  9. シンボリックリンクが正しく作成されていることを確認します。

    # ls -al /var/lib/pcp/pmdas/openmetrics/config.d/
  10. メトリクスが正しく報告されていることを確認します。

    # pminfo -f openmetrics.example.var1
        inst [0 or "0 var2:var3"] value 42

検証

  • pcp を実行し、openmetrics がリストされていることを確認します。
  • systemd-analyze cat-config tmpfiles.d を実行し、出力に example.url が表示されることを確認します。
  • pminfo を使用して、メトリクスが存在することと、その値を確認します。

第6章 pmlogger でのパフォーマンスデータのロギング

PCP ツールを使用してパフォーマンスのメトリック値をログに記録すると、後で再生できます。これにより、遡及的なパフォーマンス解析を実行できます。pmlogger ツールを使用すると、以下が可能になります。

  • 選択したメトリックのアーカイブログをシステムに作成する
  • システムに記録されるメトリックとその頻度を指定する

6.1. pmlogconf で pmlogger 設定ファイルの変更

pmlogger サービスの実行中、PCP はホストでメトリックのデフォルトセットをログに記録します。pmlogconf ユーティリティーを使用してデフォルト設定を確認します。pmlogger 設定ファイルが存在しない場合は、pmlogconf がデフォルトのメトリック値で作成します。

前提条件

手順

  1. pmlogger 設定ファイルを作成または変更します。

    # pmlogconf -r /var/lib/pcp/config/pmlogger/config.default
  2. pmlogconf のプロンプトに従って、関連するパフォーマンスメトリクスのグループを有効または無効にし、有効になっている各グループのロギング間隔を制御します。以下に例を示します。

    # pmlogconf -r /var/lib/pcp/config/pmlogger/config.default
    Group: per logical block device activity
    Log this group? [y]
    Logging interval? [default]

6.2. pmlogger を手動で設定する

指定したメトリックと間隔でカスタマイズしたロギング設定を作成する場合は、pmlogger 設定ファイルを手動で編集します。デフォルトの pmlogger 設定ファイルは /var/lib/pcp/config/pmlogger/config.default です。設定ファイルでは、プライマリーのロギングインスタンスによって記録されるメトリックを指定します。

手動の設定では、以下が可能になります。

  • 自動設定のリストに記載されていないメトリックを記録する。
  • カスタムロギングの周波数を選択する。
  • アプリケーションのメトリックを使用して PMDA を追加する。

前提条件

手順

  • /var/lib/pcp/config/pmlogger/config.default ファイルを開いて編集し、特定のメトリックを追加します。

    # It is safe to make additions from here on ...
    #
    log mandatory on every 5 seconds {
        xfs.write
        xfs.write_bytes
        xfs.read
        xfs.read_bytes
    }
    log mandatory on every 10 seconds {
        xfs.allocs
        xfs.block_map
        xfs.transactions
        xfs.log
    }
    [access]
    disallow * : all;
    allow localhost : enquire;

6.3. pmlogger サービスの有効化

ローカルマシンでメトリック値のログを記録するには、pmlogger サービスを開始して有効にする必要があります。

前提条件

手順

  • pmlogger サービスを開始して、有効にします。

    # systemctl start pmlogger
    # systemctl enable pmlogger

検証

  • pmlogger サービスが有効になっていることを確認します。

    # pcp
     platform: Linux arm10.local 6.12.0-55.13.1.el10_0.aarch64 #1 SMP PREEMPT_DYNAMIC Mon May 19 07:29:57 UTC 2025 aarch64
     hardware: 4 cpus, 1 disk, 1 node, 3579MB RAM
     timezone: JST-9
     services: pmcd
         pmcd: Version 6.3.7-1, 12 agents, 6 clients
         pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm jbd2
               dm openmetrics
     pmlogger: primary logger: /var/log/pcp/pmlogger/arm10.local/20250529.15.49
         pmie: primary engine: /var/log/pcp/pmie/arm10.local/pmie.log

    詳細は、/var/lib/pcp/config/pmlogger/config.default ファイルを参照してください。

6.4. メトリクス収集のためのクライアントシステムの設定

セントラルサーバーが PCP を実行しているクライアントからパフォーマンスメトリクスを収集できるようにクライアントシステムを設定できます。

前提条件

手順

  1. pcp-system-tools パッケージをインストールします。

    # dnf install pcp-system-tools
  2. pmcd の IP アドレスを設定します。

    # echo "-i 192.168.4.62" >>/etc/pcp/pmcd/pmcd.options

    192.168.4.62 を、クライアントがリッスンする IP アドレスに置き換えます。デフォルトでは、pmcd は、ローカルホストをリッスンします。

  3. パブリック zone を永続的に追加するように、ファイアウォールを設定します。

    # firewall-cmd --permanent --zone=public --add-port=44321/tcp
    success
    # firewall-cmd --reload
    success
  4. SELinux ブール値を設定します。

    # setsebool -P pcp_bind_all_unreserved_ports on
  5. pmcd サービスおよび pmlogger サービスを有効にします。

    # systemctl enable pmcd pmlogger
    # systemctl restart pmcd pmlogger

検証

  • pmcd が、設定した IP アドレスを正しくリッスンしていることを確認します。

    # ss -tlp | grep 44321
    LISTEN   0   5     127.0.0.1:44321   0.0.0.0:*   users:(("pmcd",pid=151595,fd=6))
    LISTEN   0   5  192.168.4.62:44321   0.0.0.0:*   users:(("pmcd",pid=151595,fd=0))
    LISTEN   0   5         [::1]:44321      [::]:*   users:(("pmcd",pid=151595,fd=7))

6.5. データ収集用の中央サーバーの設定

PCP を実行しているクライアントからメトリクスを収集するためのセントラルサーバーを作成できます。

前提条件

手順

  1. pcp-system-tools パッケージをインストールします。

    # dnf install pcp-system-tools
  2. 以下の内容で /etc/pcp/pmlogger/control.d/remote ファイルを作成してください。

    # DO NOT REMOVE OR EDIT THE FOLLOWING LINE
    $version=1.1
    192.168.4.13 n n PCP_ARCHIVE_DIR/rhel7u4a -r -T24h10m -c config.rhel7u4a
    192.168.4.14 n n PCP_ARCHIVE_DIR/rhel6u10a -r -T24h10m -c config.rhel6u10a
    192.168.4.62 n n PCP_ARCHIVE_DIR/rhel8u1a -r -T24h10m -c config.rhel8u1a

    192.168.4.13192.168.4.14、および 192.168.4.62 を、クライアントの IP アドレスに置き換えます。

  3. pmcd サービスおよび pmlogger サービスを有効にします。

    # systemctl enable pmcd pmlogger
    # systemctl restart pmcd pmlogger

検証

  • 各ディレクトリーから最新のアーカイブファイルにアクセスできることを確認します。

    # for i in /var/log/pcp/pmlogger/rhel*/*.0; do pmdumplog -L $i; done
    Log Label (Log Format Version 2)
    Performance metrics from host rhel6u10a.local
      commencing Mon Nov 25 21:55:04.851 2019
      ending     Mon Nov 25 22:06:04.874 2019
    Archive timezone: JST-9
    PID for pmlogger: 24002
    Log Label (Log Format Version 2)
    Performance metrics from host rhel7u4a
      commencing Tue Nov 26 06:49:24.954 2019
      ending     Tue Nov 26 07:06:24.979 2019
    Archive timezone: CET-1
    PID for pmlogger: 10941
    [..]

    /var/log/pcp/pmlogger/ ディレクトリーのアーカイブファイルは、詳細な分析とグラフ作成に使用できます。

6.6. systemd ユニットと pmlogger

pmlogger サービスを、それ自体を監視する単一のホストとして、または複数のリモートホストからメトリクスを収集する単一のホストを含む pmlogger ファームとしてデプロイすると、関連する systemd サービスとタイマーユニットがいくつか自動的にデプロイされます。これらのサービスとタイマーは、pmlogger インスタンスが実行していることを確認するための定期的なチェックを提供し、不足しているインスタンスを再起動し、ファイル圧縮などのアーカイブ管理を実行します。通常は pmlogger によってデプロイされるチェックおよびハウスキーピングサービスは次のとおりです。

pmlogger_daily.service
デフォルトでは、毎日、深夜直後に実行され、1 つ以上の PCP アーカイブセットを集約、圧縮、およびローテートします。また、制限 (デフォルトでは 2 週間) よりも古いアーカイブも削除されます。pmlogger.service ユニットに必要な pmlogger_daily.timer ユニットによってトリガーされます。
pmlogger_check
pmlogger インスタンスが実行中であるかどうかを 30 分ごとにチェックします。不足しているインスタンスを再起動し、必要な圧縮タスクを実行します。pmlogger.service ユニットに必要な pmlogger_check.timer ユニットによってトリガーされます。
pmlogger_farm_check
設定されたすべての pmlogger インスタンスのステータスを確認します。不足しているインスタンスを再起動します。すべての非プライマリーインスタンスを pmlogger_farm サービスに移行します。pmlogger_farm_check.timer によってトリガーされます。これは、pmlogger_farm.service ユニットによって必要とされ、pmlogger_farm.service ユニット自体は pmlogger.service ユニットによって必要とされます。

これらのサービスは一連の肯定的な依存関係を通じて管理されます。つまり、プライマリー pmlogger インスタンスをアクティブ化すると、すべて有効になります。pmlogger_daily.service はデフォルトで無効になっていますが、pmlogger.service との依存関係によって pmlogger_daily.timer がアクティブになると、pmlogger_daily.service の実行がトリガーされることに注意してください。

pmlogger_daily は、マージ前にアーカイブを自動的に書き換えるために pmlogrewrite とも統合されています。これにより、実稼働環境や PMDA が変化する中でもメタデータの一貫性を確保できます。たとえば、ログ記録間隔中に監視対象ホストの 1 台で pmcd が更新されると、ホスト上の一部のメトリクスのセマンティクスが更新され、新しいアーカイブがそのホストから以前に記録されたアーカイブと互換性がなくなる可能性があります。詳細は、システム上の pmlogrewrite(1) man ページを参照してください。

6.7. pmlogger によってトリガーされる systemd サービスの管理

制御ファイルを使用して、pmlogger インスタンスによって収集されたデータの自動カスタムアーカイブ管理システムを作成できます。

注記

プライマリー pmlogger インスタンスは、接続先の pmcd と同じホストで実行している必要があります。プライマリーインスタンスは必要ありません。また、1 つのセントラルホストが、リモートホストで実行されている pmcd インスタンスに接続された複数の pmlogger インスタンスでデータを収集している場合は、設定でプライマリーインスタンスが必要ない場合もあります。

手順

  • 次のいずれかを行います。

    • プライマリー pmlogger インスタンスの場合は、/etc/pcp/pmlogger/control.d/local を使用します。
    • リモートホストの場合は、/etc/pcp/pmlogger/control.d/remote を使用します。

      remote を希望のファイル名に置き換えます。

      ファイルには、ログに記録するホストごとに 1 行が含まれている必要があります。自動的に作成されるプライマリーロガーインスタンスのデフォルトの形式は次のようになります。

      # === LOGGER CONTROL SPECIFICATIONS ===
      #
      #Host   	 P?  S?    directory   		 args
      # local primary logger
      LOCALHOSTNAME    y   n    PCP_ARCHIVE_DIR/LOCALHOSTNAME    -r -T24h10m -c config.default -v 100Mb

      フィールドの詳細は次のとおりです。

      Host
      ログに記録するホストの名前。
      P?
      “Primary?" の略です。このフィールドは、ホストがプライマリーロガーインスタンスである (y) か、そうでない (n) かを示します。設定内のすべてのファイルにわたってプライマリーロガーは 1 つだけ存在でき、接続先の pmcd と同じホスト上で実行している必要があります。
      S?
      "Socks?" の略です。このフィールドは、このロガーインスタンスがファイアウォール経由で pmcd に接続するために SOCKS プロトコルを使用する必要がある (y) か、必要ない (n) かを示します。
      directory
      この行に関連付けられたすべてのアーカイブがこのディレクトリーに作成されます。
      args
      pmlogger に渡される引数。args フィールドのデフォルト値は次のとおりです。
      -r
      アーカイブのサイズと増加率を報告します。
      T24h10m
      各日のログ記録を終了するタイミングを指定します。これは通常、pmlogger_daily.service が実行する時間です。デフォルト値の 24h10m は、ログ記録が開始してから遅くとも 24 時間 10 分後に終了することを示します。
      -c config.default
      使用する設定ファイルを指定します。これは基本的に、記録するメトリクスを定義します。
      -v 100Mb
      1 つのデータボリュームがいっぱいになり、別のボリュームが作成されるサイズを指定します。新しいアーカイブに切り替わった後、以前に記録されたものは pmlogger_daily または pmlogger_check のいずれかによって圧縮されます。

6.8. pmrep で PCP ログアーカイブの再生

メトリックデータの記録後、PCP ログアーカイブを再生できます。ログをテキストファイルにエクスポートして、スプレッドシートにインポートするには、pcp2csvpcp2xmlpmrep または pmlogsummary などの PCP ユーティリティーを使用します。pmrep ツールを使用すると、以下が可能になります。

  • ログファイルを表示する。
  • 選択した PCP ログアーカイブを解析し、値を ASCII テーブルにエクスポートする。
  • アーカイブログ全体を展開するか、コマンドラインで個々のメトリクスを指定してログから一部のメトリクス値のみを展開する。

前提条件

手順

  • メトリックのデータを表示します。

    $ pmrep --start @3:00am --archive 20211128 --interval 5seconds --samples 10 --output csv disk.dev.write
    Time,"disk.dev.write-sda","disk.dev.write-sdb"
    2021-11-28 03:00:00,,
    2021-11-28 03:00:05,4.000,5.200
    2021-11-28 03:00:10,1.600,7.600
    2021-11-28 03:00:15,0.800,7.100
    2021-11-28 03:00:20,16.600,8.400
    2021-11-28 03:00:25,21.400,7.200
    2021-11-28 03:00:30,21.200,6.800
    2021-11-28 03:00:35,21.000,27.600
    2021-11-28 03:00:40,12.400,33.800
    2021-11-28 03:00:45,9.800,20.600

    この例では、5 秒間隔でアーカイブに収集された disk.dev.write メトリクスのデータを、comma-separated-value 形式で表示します。この例の 20211128 を、データを表示する pmlogger アーカイブを含むファイル名に置き換えます。

第7章 Performance Co-Pilot によるパフォーマンスの監視

Performance Co-Pilot (PCP) は、システムレベルのパフォーマンス測定を監視、視覚化、保存、および分析するためのツール、サービス、およびライブラリーのスイートです。システム管理者は、Red Hat Enterprise Linux の PCP を使用してシステムのパフォーマンスを監視できます。

7.1. pmda-postfix での postfix の監視

pmda-postfix を使用して、postfix メールサーバーのパフォーマンスメトリクスを監視できます。これは、1 秒間に受信した電子メールの数を確認するのに役立ちます。

前提条件

手順

  1. 以下のパッケージをインストールします。

    1. pcp-system-tools をインストールします。

      # dnf install pcp-system-tools
    2. pmda-postfix パッケージをインストールして、postfix を監視します。

      # dnf install pcp-pmda-postfix postfix
    3. logging デーモンをインストールします。

      # dnf install rsyslog
    4. テスト用にメールクライアントをインストールします。

      # dnf install mutt
  2. postfix サービスおよび rsyslog サービスを有効にします。

    # systemctl enable postfix rsyslog
    # systemctl restart postfix rsyslog
  3. SELinux ブール値を有効にして、pmda-postfix が必要なログファイルにアクセスできるようにします。

    # setsebool -P pcp_read_generic_logs=on
  4. PMDA をインストールします。

    # cd /var/lib/pcp/pmdas/postfix/
    # ./Install
    Updating the Performance Metrics Name Space (PMNS) ...
    Terminate PMDA if already installed ...
    Updating the PMCD control file, and notifying PMCD ...
    Waiting for pmcd to terminate ...
    Starting pmcd ...
    Check postfix metrics have appeared ... 7 metrics and 58 values

検証

  • pmda-postfix 操作を確認します。

    echo testmail | mutt root
    Verify the available metrics:
    # pminfo postfix
    postfix.received
    postfix.sent
    postfix.queues.incoming
    postfix.queues.maildrop
    postfix.queues.hold
    postfix.queues.deferred
    postfix.queues.active

7.2. PCP Charts アプリケーションを使用した PCP ログアーカイブの視覚的なトレース

メトリックデータの記録後、PCP ログアーカイブをグラフとして再生できます。メトリックは、PCP ログアーカイブのメトリックデータを履歴データのソースとして使用する代替オプションを持つ 1 台または複数のライブホストから提供されます。PCP Charts アプリケーションインターフェイスをカスタマイズしてパフォーマンスメトリックのデータを表示するには、ラインプロット、バーグラフ、または使用状況グラフを使用します。

PCP Charts アプリケーションを使用すると、以下が可能になります。

  • PCP Charts アプリケーションのデータを再生し、グラフを使用して、システムのライブデータとともに遡及データを視覚化する。
  • パフォーマンスメトリック値をグラフに描画する。
  • 複数のチャートを同時に表示する。

前提条件

手順

  1. コマンドラインで PCP Charts アプリケーションを起動します。

    # pmchart

    pmtime サーバー設定は下部にあります。start ボタンと pause ボタンで以下を制御できます。

    • PCP がメトリックデータをポーリングする間隔
    • 履歴データのメトリックの日付および時間
  2. File をクリックしてから、New Chart をクリックして、ホスト名またはアドレスを指定して、ローカルマシンおよびリモートマシンの両方からメトリックを選択します。高度な設定オプションには、チャートの軸値を手動で設定する機能、およびプロットの色を手動で選択する機能が含まれます。
  3. PCP Charts アプリケーションで作成したビューを記録します。

    以下は、PCP Charts アプリケーションで作成したイメージを撮影したり、ビューを記録するためのオプションです。

    • File をクリックしてから Export をクリックして、現在のビューのイメージを保存します。
    • Record をクリックしてから Start をクリックし、録画を開始します。
    • Record をクリックしてから Stop をクリックし、録画を停止します。録画の停止後、記録されたメトリックは後で表示できるようにアーカイブが作成されます。
  4. 必要に応じて、PCP Charts アプリケーションでは、ビューと呼ばれるメインの設定ファイルによって、1 つ以上のチャートに関連付けられたメタデータを保存できます。このメタデータでは、使用されるメトリックや、チャート列など、チャート側面をすべて記述します。
  5. オプション: File をクリックし、Save View をクリックしてカスタムビュー設定を保存し、後でビュー設定を読み込みます。

    以下の PCP Charts アプリケーションビューの設定ファイルの例では、指定の XFS ファイルシステム loop1 に対して読み書きされた合計バイト数を示す積み上げチャートグラフを説明します。

    # pmchart
    version 1
    chart title "Filesystem Throughput /loop1" style stacking antialiasing off
        plot legend Read rate   metric xfs.read_bytes   instance  loop1
        plot legend Write rate  metric xfs.write_bytes  instance  loop1

7.3. PCP を使用した SQL Server からのデータの収集

PCP の SQL Server エージェントは、データベースのパフォーマンス問題を監視および分析するために役立ちます。システム上の PCP を介して Microsoft SQL Server のデータを収集できます。

前提条件

  • Red Hat Enterprise Linux に Microsoft SQL Server をインストールし、SQL Server への trusted 接続を確立している。
  • Red Hat Enterprise Linux 用の SQL Server の Microsoft ODBC ドライバーがインストールされている。

手順

  1. PCP をインストールします。

    # dnf install pcp-zeroconf
  2. pyodbc ドライバーに必要なパッケージをインストールします。

    # dnf install gcc-c++ python3-devel unixODBC-devel
    # dnf install python3-pyodbc
  3. mssql エージェントをインストールします。

    1. PCP の Microsoft SQL Server ドメインエージェントをインストールします。

      # dnf install pcp-pmda-mssql
    2. /etc/pcp/mssql/mssql.conf ファイルを編集して、mssql エージェントの SQL サーバーアカウントのユーザー名およびパスワードを設定します。設定するアカウントに、パフォーマンスデータに対するアクセス権限があることを確認します。

      username: user_name
      password: user_password

      user_name を SQL Server アカウントのユーザー名に置き換え、user_password をこのアカウントの SQL Server ユーザーパスワードに置き換えます。

  4. エージェントをインストールします。

    # cd /var/lib/pcp/pmdas/mssql
    # ./Install
    Updating the Performance Metrics Name Space (PMNS) ...
    Terminate PMDA if already installed ...
    Updating the PMCD control file, and notifying PMCD ...
    Check mssql metrics have appeared ... 168 metrics and 598 values
    [...]

    検証

    • pcp コマンドを使用して、SQL Server PMDA (mssql) が読み込まれて実行されていることを確認します。

      $ pcp
      Performance Co-Pilot configuration on rhel.local:
      platform: Linux rhel.local 4.18.0-167.el8.x86_64 #1 SMP Sun Dec 15 01:24:23 UTC 2019 x86_64
       hardware: 2 cpus, 1 disk, 1 node, 2770MB RAM
       timezone: PDT+7
       services: pmcd pmproxy
           pmcd: Version 5.0.2-1, 12 agents, 4 clients
           pmda: root pmcd proc pmproxy xfs linux nfsclient mmv kvm mssql
                 jbd2 dm
       pmlogger: primary logger: /var/log/pcp/pmlogger/rhel.local/20200326.16.31
          pmie: primary engine: /var/log/pcp/pmie/rhel.local/pmie.log
    • PCP が SQL Server から収集できるメトリックの完全なリストを表示します。

      # pminfo mssql
    • メトリックのリストを表示した後は、トランザクションのレートを報告できます。たとえば、5 秒間の時間枠で、1 秒あたりの全体的なトランザクション数を報告するには、以下のコマンドを実行します。

      # pmval -t 1 -T 5 mssql.databases.transactions
    • pmchart コマンドを使用して、システムでこれらのメトリックのグラフィックチャートを表示します。詳細は、PCP Charts アプリケーションを使用した PCP ログアーカイブの視覚的なトレース およびシステム上の pcp(1)pminfo(1)pmval(1)pmchart(1)、および pmdamssql(1) man ページを参照してください。

第8章 PCP メトリックのグラフィカル表示の設定

pcpgrafanavalkeypcp bpftracepcp vector を組み合わせて使用すると、ライブデータまたは PCP によって収集されたデータがグラフィカルに表現されます。

8.1. pcp-zeroconf を使用した PCP の設定

pcp-zeroconf パッケージを使用してシステムに PCP を設定できます。pcp-zeroconf パッケージがインストールされると、システムはメトリックのデフォルトセットをアーカイブファイルに記録します。

手順

  • pcp-zeroconf パッケージをインストールします。

    # dnf install pcp-zeroconf

検証

  • pmlogger サービスがアクティブであることを確認し、メトリックのアーカイブを開始します。

    # pcp | grep pmlogger
    pmlogger: primary logger: /var/log/pcp/pmlogger/localhost.localdomain/20200401.00.12

8.2. grafana-server の設定

Grafana は、ブラウザーからアクセスできるグラフを生成します。grafana-server は、Grafana ダッシュボードのバックエンドサーバーです。これは、デフォルトですべてのインターフェイスでリッスンし、Web ブラウザーからアクセスする Web サービスを提供します。grafana-pcp プラグインは、バックエンドの pmproxy デーモンと対話します。

前提条件

手順

  1. 以下のパッケージをインストールします。

    # dnf install grafana grafana-pcp
  2. grafana-server を再起動して有効にします。

    # systemctl restart grafana-server
    # systemctl enable grafana-server
  3. Grafana サービスへのネットワークトラフィック用にサーバーのファイアウォールを開きます。

    # firewall-cmd --permanent --add-service=grafana
    success
    # firewall-cmd --reload
    success

検証

  • grafana-server がリッスンし、要求に応答していることを確認します。

    # ss -ntlp | grep 3000
    LISTEN  0  128  :3000 *:  users:(("grafana-server",pid=19522,fd=7))
  • grafana-pcp プラグインがインストールされていることを確認します。

    # grafana-cli plugins ls | grep performancecopilot-pcp-app
    performancecopilot-pcp-app @ 5.2.2

8.3. valkey の設定

Valkey データソースを使用すると、以下が可能になります。

  • データアーカイブの表示
  • pmseries 言語を使用したクエリー時系列
  • 複数のホストにまたがるデータの分析

前提条件

  • PCP が設定されている。詳細は、pcp-zeroconf を使用した PCP の設定 を参照してください。
  • grafana-server が設定されている。詳細は、grafana-server の設定 を参照してください。
  • メール転送エージェント (例: postfix) がインストールおよび設定されている。

手順

  1. valkey パッケージをインストールします。

    # dnf install valkey
  2. pmproxy および valkey サービスを起動して有効にします。

    # systemctl start pmproxy valkey
    # systemctl enable pmproxy valkey
  3. grafana-server を再起動します。

    # systemctl restart grafana-server

検証

  • pmproxyvalkey が動作していることを確認します。

    # pmseries disk.dev.read
    2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df

    valkey パッケージがインストールされていない場合は、このコマンドはデータを返しません。

    詳細は、システム上の pmseries(1) man ページを参照してください。

8.4. Grafana Web UI へのアクセス

Grafana Web インターフェイスにアクセスできます。Grafana Web インターフェイスを使用すると、以下が可能になります。

  • Valkey、PCP bpftrace、PCP Vector データソースを追加する
  • ダッシュボードを作成する
  • 有用なメトリックの概要の表示
  • Valkey でアラートを作成する

前提条件

手順

  1. クライアントシステムで http://192.0.2.0:3000 リンクを使用してブラウザーを開き、ポート 3000 の grafana-server にアクセスします。

    リモートマシンから Grafana Web UI にアクセスする場合は 192.0.2.0 を自分のマシンの IP に置き換え、ローカルで Web UI にアクセスする場合は localhost に置き換えます。

  2. 初回ログイン時は、Email または username、および username の 2 つのフィールドに admin と入力します。
  3. Grafana は、新しいパスワード を設定してセキュアなアカウントを作成するようにプロンプトを表示します。後で設定する場合は、Skip をクリックします。
  4. 左上のハンバーガーアイコン (☰) から、Administration > Plugins をクリックします。
  5. プラグイン タブで、Search by name or type テキストボックスに performance co-pilot と入力し、Performance Co-Pilot (PCP) プラグインをクリックします。
  6. Plugins / Performance Co-Pilot ペインで、Enable をクリックします。
  7. Grafana アイコンをクリックします。Grafana Home ページ が表示されます。

    図8.1 Home ダッシュボード

    grafana home dashboard
    注記

    画面上部の隅には同様の Settings アイコンがありますが、これは一般的な ダッシュボード設定 を制御します。

  8. Grafana Home ページで、Add your first data source をクリックして Valkey、PCP bpftrace、PCP Vector データソースを追加します。

  9. オプション: メニューから、admin プロファイルアイコンにカーソルを合わせ、Edit ProfileChange Password などの Preferences を変更するか、Sign out を選択します。

    詳細は、システム上の grafana-cli および grafana-server man ページを参照してください。

8.5. Valkey と PCP のセキュアな接続の設定

Performance Co-Pilot (PCP)、Grafana、Valkey の間でセキュアな接続を確立できます。これらのコンポーネント間にセキュアな接続を確立すると、収集および監視対象のデータへの、権限のない第三者によるアクセスや変更を防ぐことができます。

前提条件

  • PCP がインストールされている。詳細は PCP のインストールおよび有効化 を参照してください。
  • Grafana サーバーが設定されている。詳細は、grafana-server の設定 を参照してください。
  • Valkey がインストールされている。詳細は、Valkey の設定 を参照してください。
  • クライアントの秘密鍵が /etc/valkey/client.key ファイルに保存されている。別のパスを使用する場合は、この手順の該当するステップのパスを変更してください。秘密鍵および証明書署名要求 (CSR) を作成する方法と、認証局 (CA) からの証明書を要求する方法は、CA のドキュメントを参照してください。
  • TLS クライアント証明書が /etc/valkey/client.crt ファイルに保存されている。別のパスを使用する場合は、この手順の該当するステップのパスを変更してください。
  • TLS サーバー鍵が /etc/valkey/valkey.key ファイルに保存されている。別のパスを使用する場合は、この手順の該当するステップのパスを変更してください。
  • TLS サーバー証明書が /etc/valkey/valkey.crt ファイルに保存されている。別のパスを使用する場合は、この手順の該当するステップのパスを変更してください。
  • CA 証明書が /etc/valkey/ca.crt ファイルに保存されている。別のパスを使用する場合は、この手順の該当するステップのパスを変更してください。
  • pmproxy デーモンの場合、サーバーの秘密鍵は /etc/pcp/tls/server.key ファイルに保存されます。別のパスを使用する場合は、この手順の該当するステップのパスを変更してください。

手順

  1. root ユーザーとして /etc/valkey/valkey.conf ファイルを開き、次のプロパティーを反映するように TLS/SSL オプションを調整します。

    port 0
    tls-port 6379
    tls-cert-file /etc/valkey/valkey.crt
    tls-key-file /etc/valkey/valkey.key
    tls-client-key-file /etc/valkey/client.key
    tls-client-cert-file /etc/valkey/client.crt
    tls-ca-cert-file /etc/valkey/ca.crt
  2. valkey が TLS 証明書にアクセスできることを確認します。

    # su valkey -s /bin/bash -c \
      'ls -1 /etc/valkey/ca.crt /etc/valkey/valkey.key /etc/valkey/valkey.crt'
    /etc/valkey/ca.crt
    /etc/valkey/valkey.crt
    /etc/valkey/valkey.key
  3. valkey サーバーを再起動して、設定の変更を適用します。

    # systemctl restart valkey

検証

  • TLS 設定が機能していることを確認します。

    # valkey-cli --tls --cert /etc/valkey/client.crt \
        --key /etc/valkey/client.key \
        --cacert /etc/valkey/ca.crt <<< "PING"
    PONG
    Unsuccessful TLS configuration might result in the following error message:
    Could not negotiate a TLS connection: Invalid CA Certificate File/Directory

8.6. PCP Valkey データソースでのパネルとアラートの作成

PCP Valkey データソースを追加した後に、ダッシュボードに有用なメトリックの概要を表示し、負荷グラフを視覚化するためのクエリーを追加して、システムに問題が発生した場合にその問題を表示する上で役立つアラートを作成できます。

前提条件

手順

  1. Grafana Web UI にログインします。
  2. Grafana Home ページで、Add your first data source をクリックします。
  3. Add data source ペインで、Filter by name or type テキストボックスに valkey と入力し、Valkey をクリックします。
  4. Data Sources / Valkey ペインで、次の操作を実行します。

    1. URL フィールドに http://localhost:44322 を追加し、Save & Test をクリックします。
    2. Dashboards タブ > Import > Valkey: Host Overview をクリックすると、有用なメトリクスの概要が含まれるダッシュボードが表示されます。

      図8.2 Valkey: ホストの概要

      PCP Redis ホストの概要
  5. 新しいパネルを追加します。

    1. メニューで、Create アイコン > Dashboard > Add new panel の順にカーソルを合わせ、パネルを追加します。
    2. Query タブで、選択した default オプションではなく、クエリーリストから Valkey を選択し、A のテキストフィールドで kernel.all.load などのメトリクスを入力して、カーネル負荷グラフを表示します。
    3. 必要に応じて、Panel titleDescription を追加し、Settings から他のオプションを更新します。
    4. Save をクリックして変更を適用し、ダッシュボードを保存します。Dashboard name を追加します。
    5. Apply をクリックして変更を適用し、ダッシュボードに戻ります。

      図8.3 Valkey クエリーパネル

      pcp redis クエリーパネル
  6. アラートルールを作成します。

    1. Valkey クエリーパネルで、Alert をクリックし、Create Alert をクリックします。
    2. RuleNameEvaluate query、および For フィールドを編集して、アラートの Conditions を指定します。
    3. Save をクリックして変更を適用し、ダッシュボードを保存します。Apply をクリックして変更を適用し、ダッシュボードに戻ります。

      図8.4 Valkey パネルでアラートを作成する

      pcp redis クエリーアラートパネル
    4. 必要に応じて、同じパネルでスクロールダウンし、Delete アイコンをクリックして作成したルールを削除します。
    5. オプション: メニューで Alerting アイコンをクリックし、作成されたアラートルールをさまざまなアラートステータスで表示したり、アラートルールを編集したり、Alert Rules タブから既存のルールを一時停止したりできます。作成したアラートルールに通知チャネルを追加して Grafana からアラート通知を受信するには、アラートの通知チャネルの追加 を参照してください。

8.7. アラートの通知チャネルの追加

通知チャネルを追加すると、アラートルールの条件が満たされ、システムのさらなる監視が必要になったときに、Grafana からアラート通知を受け取ることができます。サポートされている通知機能のリストからいずれかのタイプを選択すると、これらのアラートを受け取ることができます。通知機能には、DingDing、Discord、Email、Google Hangouts Chat、HipChat、Kafka REST Proxy、LINE、Microsoft Teams、OpsGenie、PagerDuty、Prometheus Alertmanager、Pushover、Sensu、Slack、Telegram、Threema Gateway、VictorOps および webhook が含まれます。

前提条件

  • grafana-server にアクセスできる。詳細は、Grafana Web UI へのアクセス を参照してください。
  • アラートルールが作成されている。詳細は、PCP valkey データソースでのパネルとアラートの作成 を参照してください。
  • SMTP を設定し、grafana/grafana.ini ファイルに有効な送信者のメールアドレスを追加します。

    # vi /etc/grafana/grafana.ini
    [smtp]
    enabled = true
    from_address = abc@gmail.com

    abc@gmail.com を有効なメールアドレスに置き換えます。

    grafana-server を再起動します。

    # systemctl restart grafana-server.service

手順

  1. メニューから、Alerting アイコンにカーソルを合わせ、Notification channels > Add channel をクリックします。
  2. Add notification channel details ペインで、以下を実行します。

    1. Name テキストボックスに名前を入力します。
    2. 通信 Type (例: Email) を選択し、メールアドレスを入力します。区切り文字 ; を使用して複数のメールアドレスを追加できます。
    3. オプション: Configure Optional EmailNotification を設定します。
  3. Save をクリックします。
  4. アラートルールで通知チャネルを選択します。

    1. メニューから、Alerting アイコンにカーソルを合わせ、Alert rules をクリックします。
    2. Alert Rules タブで、作成されたアラートルールをクリックします。
    3. Notifications タブで Send to オプションから通知チャネル名を選択し、アラートメッセージを追加します。
  5. Apply をクリックします。

8.8. PCP コンポーネント間の認証の設定

Simple Authentication Security Layer (SASL) フレームワークを介して PCP によってサポートされる scram-sha-256 認証メカニズムを使用して認証を設定できます。

手順

  1. scram-sha-256 認証メカニズムの SASL フレームワークをインストールします。

    # dnf install cyrus-sasl-scram cyrus-sasl-lib
  2. pmcd.conf ファイルに、サポートされている認証メカニズムとユーザーデータベースのパスを指定します。

    # vi /etc/sasl2/pmcd.conf
    mech_list: scram-sha-256
    sasldb_path: /etc/pcp/passwd.db
  3. 新しいユーザーを作成します。

    # useradd -r metrics

    metrics をユーザー名に置き換えます。

  4. 作成したユーザーをユーザーデータベースに追加します。

    # saslpasswd2 -a pmcd metrics
    Password:
    Again (for verification):

    作成したユーザーを追加するには、metrics アカウントのパスワードを入力する必要があります。

  5. ユーザーデータベースのパーミッションを設定します。

    # chown root:pcp /etc/pcp/passwd.db
    # chmod 640 /etc/pcp/passwd.db
  6. pmcd サービスを再起動します。

    # systemctl restart pmcd

検証

  • SASL 設定を確認します。

    # pminfo -f -h "pcp://127.0.0.1?username=metrics" disk.dev.read
    Password:
    disk.dev.read
    inst [0 or "sda"] value 19540

8.9. PCP bpftrace のインストール

PCP bpftrace エージェントをインストールして、システムをイントロスペクトし、カーネルおよびユーザー空間トレースポイントからメトリクスを収集できます。bpftrace エージェントは bpftrace スクリプトを使用してメトリクスを収集します。bpftrace スクリプトは、強化された Berkeley Packet Filter (eBPF) を使用します。

前提条件

手順

  1. pcp-pmda-bpftrace パッケージをインストールします。

    # dnf install pcp-pmda-bpftrace
  2. bpftrace.conf ファイルを編集し、「PCP コンポーネント間の認証の設定」で作成したユーザーを追加します。

    # vi /var/lib/pcp/pmdas/bpftrace/bpftrace.conf
    [dynamic_scripts]
    enabled = true
    auth_enabled = true
    allowed_users = root,metrics

    metrics をユーザー名に置き換えます。

  3. bpftrace PMDA をインストールします。

    # cd /var/lib/pcp/pmdas/bpftrace/
    # ./Install
    Updating the Performance Metrics Name Space (PMNS) ...
    Terminate PMDA if already installed ...
    Updating the PMCD control file, and notifying PMCD …
    Check bpftrace metrics have appeared ... 7 metrics and 6 values

    pmda-bpftrace がインストールされたため、ユーザーの認証後にのみ使用できるようになりました。詳細は PCP bpftrace システム分析ダッシュボードの表示 を参照してください。

8.10. PCP bpftrace システム分析ダッシュボードの表示

PCP bpftrace データソースを使用すると、pmlogger またはアーカイブからの通常のデータとして利用できないソースからのライブデータにアクセスできます。PCP bpftrace データソースでは、ダッシュボードに有用なメトリックの概要を表示できます。

前提条件

手順

  1. Grafana web UI にログインします。
  2. Grafana Home ページで、Add your first data source をクリックします。
  3. Add data source ペインで、Filter by name or type テキストボックスに bpftrace と入力し、PCP bpftrace をクリックします。
  4. Data Sources / PCP bpftrace ペインで、以下を実行します。

    1. URL フィールドに http://localhost:44322 を追加します。
    2. Basic Auth オプションを切り替えて、作成されたユーザーの認証情報を、User フィールドおよび Password フィールドに追加します。
    3. Save & Test をクリックします。

      図8.5 データソースへの PCP bpftrace の追加

      bpftrace auth
    4. Dashboards タブ > Import > PCP bpftrace: System Analysis をクリックし、有用なメトリクスの概要を含むダッシュボードを表示します。

      図8.6 PCP bpftrace: システム分析

      pcp bpftrace システム分析

8.11. PCP Vector のインストール

使用を開始する前に、pcp vector をインストールする必要があります。

前提条件

手順

  • bcc PMDA をインストールします。

    # cd /var/lib/pcp/pmdas/bcc
    # ./Install
    [Wed Apr  1 00:27:48] pmdabcc(22341) Info: Initializing, currently in 'notready' state.
    [Wed Apr  1 00:27:48] pmdabcc(22341) Info: Enabled modules:
    [Wed Apr  1 00:27:48] pmdabcc(22341) Info: ['biolatency', 'sysfork',
    [...]
    Updating the Performance Metrics Name Space (PMNS) ...
    Terminate PMDA if already installed ...
    Updating the PMCD control file, and notifying PMCD …
    Check bcc metrics have appeared ... 1 warnings, 1 metrics and 0 values

8.12. PCP Vector Checklist の表示

PCP Vector データソースはライブメトリクスを表示し、pcp メトリクスを使用します。各ホストのデータを分析します。PCP Vector データソースを追加した後に、ダッシュボードに有用なメトリックの概要を表示し、チェックリストで関連するトラブルシューティングまたは参照リンクを表示できます。

前提条件

手順

  1. Grafana web UI にログインします。
  2. Grafana Home ページで、Add your first data source をクリックします。
  3. Add data source ペインで、Filter by name or type テキストボックスに vector と入力してから PCP Vector をクリックします。
  4. Data Sources / PCP Vector ペインで、以下を実行します。

    1. URL フィールドに http://localhost:44322 を追加し、Save & Test をクリックします。
    2. Dashboards タブ > Import * PCP Vector: Host Overview をクリックして、有用なメトリックの概要を含むダッシュボードを表示します。

      図8.7 PCP Vector: ホストの概要

      PCP Vector ホストの概要
  5. メニューで Performance Co-Pilot プラグインにカーソルを合わせ、PCP Vector チェックリストをクリックします。

    PCP チェックリストで、ヘルプまたは警告アイコをクリックし、関連するトラブルシューティングまたは参照リンクを表示します。

    図8.8 Performance Co-Pilot / PCP Vector チェックリスト

    pcp vector checklist

8.13. Grafana のヒートマップの使用

Grafana のヒートマップを使用すると、経時的なデータのヒストグラムを表示し、データの傾向とパターンを特定し、時間の経過に伴う変化を確認できます。ヒートマップ内の各列は単一のヒストグラムを表します。それぞれのセルの色は、そのヒストグラム内における特定の値の観測密度を表します。

前提条件

手順

  1. Dashboards tab タブにカーソルを合わせて、+ New dashboard をクリックします。
  2. Add panel メニューで、Add a new panel をクリックします。
  3. Query タブで以下を実行します。

    1. 選択中のデフォルトオプションの代わりに、クエリーリストから Valkey を選択します。
    2. A のテキストフィールドに、カーネル負荷グラフを可視化するためのメトリクス (例: kernel.all.load) を入力します。
  4. 可視化ドロップダウンメニュー (デフォルトで Time series に設定されています) をクリックし、Heatmap をクリックします。
  5. オプション: Panel Options ドロップダウンメニューで、Panel TitleDescription を追加します。
  6. Heatmap ドロップダウンメニューの Calculate from data 設定で、Yes をクリックします。

    図8.9 ヒートマップ

    grafana ヒートマップ
  7. オプション: Colors ドロップダウンメニューで、Scheme をデフォルトの Orange から変更し、ステップ数 (色の濃淡) を選択します。
  8. オプション: Tooltip ドロップダウンメニューの Show histogram (Y Axis) 設定で、トグルをクリックすると、ヒートマップ内のセルの上にカーソルを置いたときに、特定のヒストグラム内でのセルの位置が表示されます。以下に例を示します。

    Show histogram (Y Axis) cell display

8.14. Grafana の SELinux ブール値の管理

grafana-selinux サブパッケージには、外部サービスへの Grafana のアクセスを制御するいくつかの SELinux ブール値が含まれています。これらのブール値はデフォルトではオフになっています。これらの値はシステム要件に応じて on または off に切り替えることができます。

前提条件

  • grafana-selinux サブパッケージがインストールされている。
  • root 権限がある。

手順

  1. Grafana 関連の SELinux ブール値をすべて表示します。

    # semanage boolean -l | grep grafana
  2. SELinux ブール値を有効にします。

    # setsebool [-P] <boolean_name> on
    • <boolean_name> は、有効にする SELinux ブール値の名前に置き換えます。
    • -P オプションを使用すると、システムの再起動後も変更が維持されます。
  3. オプション: SELinux オプションをオフにします。

    # setsebool [-P] <boolean_name> off

8.15. Grafana に関する問題のトラブルシューティング

Grafana にデータが表示されない、ダッシュボードが黒くなる、または同様の問題など、Grafana の問題のトラブルシューティングが必要になる場合があります。

手順

  • 以下のコマンドを実行して、pmlogger サービスが起動していることを確認します。

    $ systemctl status pmlogger
  • 以下のコマンドを実行して、ディスクにファイルが作成または変更されているかどうかを確認します。

    $ ls /var/log/pcp/pmlogger/$(hostname)/ -rlt
    total 4024
    -rw-r--r--. 1 pcp pcp   45996 Oct 13  2019 20191013.20.07.meta.xz
    -rw-r--r--. 1 pcp pcp     412 Oct 13  2019 20191013.20.07.index
    -rw-r--r--. 1 pcp pcp   32188 Oct 13  2019 20191013.20.07.0.xz
    -rw-r--r--. 1 pcp pcp   44756 Oct 13  2019 20191013.20.30-00.meta.xz
    [..]
  • 以下のコマンドを実行して、pmproxy サービスが動作していることを確認します。

    $ systemctl status pmproxy
  • /var/log/pcp/pmproxy/pmproxy.log ファイルを表示して、pmproxy が実行されていること、時系列サポートが有効になっていること、valkey への接続が確立されていることを確認し、次のテキストが含まれていることを確認します。

    pmproxy(1716) Info: valkey slots, command keys, schema version setup
    Here, 1716 is the PID of pmproxy, which will be different for every invocation of pmproxy.
    Verify if the valkey database contains any keys by executing the following command:
    $ valkey-cli dbsize
    (integer) 34837
  • 以下のコマンドを実行して、PCP メトリクスが valkey データベースに存在し、pmproxy がアクセスできるかどうかを確認します。

    $ pmseries disk.dev.read
    2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    $ pmseries "disk.dev.read[count:10]"
    2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
        [Mon Jul 26 12:21:10.085468000 2021] 117971 70e83e88d4e1857a3a31605c6d1333755f2dd17c
        [Mon Jul 26 12:21:00.087401000 2021] 117758 70e83e88d4e1857a3a31605c6d1333755f2dd17c
        [Mon Jul 26 12:20:50.085738000 2021] 116688 70e83e88d4e1857a3a31605c6d1333755f2dd17c
    [...]
    $ valkey-cli --scan --pattern "*$(pmseries 'disk.dev.read')"
    pcp:metric.name:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:values:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:desc:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:labelvalue:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:instances:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
    pcp:labelflags:series:2eb3e58d8f1e231361fb15cf1aa26fe534b4d9df
  • 以下のコマンドを実行して、Grafana のログにエラーがあるかどうかを確認します。

    $ journalctl -e -u grafana-server
    -- Logs begin at Mon 2021-07-26 11:55:10 IST, end at Mon 2021-07-26 12:30:15 IST. --
    Jul 26 11:55:17 localhost.localdomain systemd[1]: Starting Grafana instance...
    Jul 26 11:55:17 localhost.localdomain grafana-server[1171]: t=2021-07-26T11:55:17+0530 lvl=info msg="Starting Grafana" logger=server version=7.3.6 c>
    Jul 26 11:55:17 localhost.localdomain grafana-server[1171]: t=2021-07-26T11:55:17+0530 lvl=info msg="Config loaded from" logger=settings file=/usr/s>
    Jul 26 11:55:17 localhost.localdomain grafana-server[1171]: t=2021-07-26T11:55:17+0530 lvl=info msg="Config loaded from" logger=settings file=/etc/g>
    [...]

第9章 PowerTOP を使用した電力消費の管理

コンピューターシステム全体の消費電力を削減することで、コストを削減できます。各システムコンポーネントのエネルギー消費を効果的に最適化するには、システムが実行するさまざまなタスクを検討し、各コンポーネントのパフォーマンスがそのジョブに対して正しいことを確認するように設定します。特定コンポーネントやシステム全体の消費電力を下げると、熱およびパフォーマンスが低下します。

電源管理を適切に行うと、次の結果が得られます。

  • サーバーやコンピューティングセンターにおける熱の削減
  • 冷却、空間、ケーブル、発電機、無停電電源装置 (UPS) などの二次コストの削減
  • ノートパソコンのバッテリー寿命の延長
  • 二酸化炭素排出量の削減
  • Energy Star など、グリーン IT に関する政府の規制や法的要件への対応
  • 新システムに関する企業ガイドラインの遵守

9.1. 電源管理の基本

効果的な電源管理は、以下の原則に基づいて行われます。

アイドル状態の CPU は必要なときだけ起動する

Red Hat Enterprise Linux 6 以降、カーネルはティックレスで実行されます。つまり、以前の定期的なタイマー割り込みが、オンデマンド割り込みに置き換えられました。そのため、新しいタスクが処理のキューに追加されるまで、アイドル状態の CPU はアイドル状態を維持できます。低電力状態にある CPU は、この状態を持続できます。ただし、システムに、不要なタイマーイベントを作成するアプリケーションが存在する場合は、この機能の利点が相殺される可能性があります。ボリュームの変更やマウスの動きの確認などのポーリングイベントは、このようなイベントの例です。

Red Hat Enterprise Linux には、CPU 使用率に基づいてアプリケーションを特定および監査するためのツールが含まれています。詳細は、監査と分析の概要 および 監査ツール を参照してください。

使用されていないハードウェアとデバイスは完全に無効にする
これは、ハードディスクなどの可動部品を持つデバイスに当てはまります。さらに、アプリケーションにより、使用されていないが有効なデバイスが "オープン" なままになることがあります。このような状況が発生すると、カーネルがデバイスが使用中であると想定し、デバイスが省電力状態に移行できなくなる可能性があります。
負荷が低いときは消費電力を抑える
電力効率は、特に x86 以外のアーキテクチャーでは、最新のハードウェアと適切な BIOS または UEFI 設定に依存することがよくあります。システムで最新の公式ファームウェアが実行されていること、および BIOS またはデバイス設定で電源管理機能が有効になっていることを確認してください。

以下のような機能を確認してください。

  • ARM64 用の CPPC (Collaborative Processor Performance Controls) のサポート
  • IBM Power Systems の PowerNV サポート
  • Cool'n'Quiet
  • ACPI (C-state)
  • Smart

ハードウェアがこれらの機能をサポートしており、BIOS で有効になっている場合、Red Hat Enterprise Linux はデフォルトでそれらを使用します。

Different forms of CPU states and their effects

最新の CPU は、ACPI (Advanced Configuration and Power Interface) とともに、さまざまな電源状態を提供します。3 つの異なる状態は以下のとおりです。

  • スリープ (C-state)
  • 周波数と電圧 (P-state)
  • 熱の出力 (T-states または thermal state)

    最も深いスリープ状態で動作している CPU は、消費エネルギーが最も少なくなります。しかし、必要なときにその状態からウェイクアップさせるのに、はるかに多くの時間がかかります。まれに、スリープ状態に切り替わるたびに CPU が即座にウェイクアップしなければならなくなることがあります。この状況は、実質的に永続的に CPU がビジー状態になり、別の状態を使用すると潜在的な省電力の一部が失われます。

電源を切ったマシンは電力使用量が最も少ない
電力を節約する最善の方法の 1 つは、システムの電源を切ることです。たとえば、会社では、昼休みや帰宅時にマシンをオフにするガイドラインを使用して、"green IT" を意識することに焦点をあてた企業文化を育成できます。また、複数の物理サーバーを 1 台の大きなサーバーに統合し、Red Hat Enterprise Linux に付属する仮想化テクノロジーを使用して仮想化することもできます。

9.2. 監査と分析の概要

通常、1 つのシステムで詳細な手動の監査、分析、およびチューニングを行う場合は例外となります。これは、このようなシステム調整の最後の部分から得られる利点よりも、その実行にかかる時間とコストの方が長いためです。ただし、すべてのシステムで同じ設定を再利用できるほぼ同一のシステムでこれらのタスクを 1 回実行することは、非常に便利です。たとえば、数千ものデスクトップシステムや、マシンがほぼ同一の HPC クラスターをデプロイメントする場合を考えてください。

監査と分析を行うもう 1 つの理由は、将来のシステム動作のリグレッションや変化を特定するための比較基準を提供することです。この分析の結果は、ハードウェア、BIOS、またはソフトウェアの更新が定期的に行われ、消費電力に関する予期しない事態を回避したい場合に非常に役立ちます。通常、徹底的な監査と分析により、特定システムで実際に起こっていることをより的確に把握できます。

利用可能な最新のシステムを使用しても、消費電力に関するシステムの監査と分析は比較的困難です。ほとんどのシステムでは、ソフトウェアを使用して電力使用量を測定するのに必要な手段が提供されていません。ただし、例外があります。

  • Hewlett Packard サーバーシステムの iLO 管理コンソールには、Web からアクセスできる電源管理モジュールがあります。
  • IBM は、BladeCenter 電源管理モジュールで同様のソリューションを提供します。
  • 一部の Dell システムでは、IT Assistant が電源監視機能を提供します。

他のベンダーも自社のサーバープラットフォームで同様の機能を提供している可能性がありますが、すべてのベンダーでサポートされている単一のソリューションは存在しません。

9.3. 監査用ツール

Red Hat Enterprise Linux は、システム監査および分析のためのツールを備えています。ほとんどのツールは、すでに発見した事柄を確認する場合や、特定の部分についてより詳細な情報が必要な場合に、補足的な情報源として使用できます。これらのツールの多くはパフォーマンスチューニングに使用されます。ツールには次のものがあります。

PowerTOP
PowerTOP は、CPU を頻繁にウェイクアップするカーネルおよびユーザー空間アプリケーションの特定のコンポーネントを特定します。Intel CPU の Intel Hardware P-State (HWP) は、CPU 周波数と電圧を調整して、電力効率とパフォーマンスを調整します。PowerTOP ツールを起動するには、root として powertop コマンドを使用します。電力推定エンジンをキャリブレーションするには、powertop --calibrate を使用します。
diskdevstatnetdevstat

これらは、システム上で実行されているすべてのアプリケーションのディスクおよびネットワークアクティビティーに関する詳細情報を収集する SystemTap ツールです。これらのツールによって収集された統計を使用すると、少数の大規模な操作ではなく、多くの小規模な I / O 操作で電力を浪費するアプリケーションを特定できます。dnf install tuned-utils-systemtap kernel-debuginfo コマンドを root として使用して、diskdevstat および netdevstat ツールをインストールします。ディスクおよびネットワークアクティビティーに関する詳細情報を表示するには、次のコマンドを使用します。

# diskdevstat

PID   UID   DEV   WRITE_CNT   WRITE_MIN   WRITE_MAX   WRITE_AVG   READ_CNT   READ_MIN   READ_MAX   READ_AVG   COMMAND

3575  1000  dm-2   59          0.000      0.365        0.006        5         0.000        0.000      0.000      mozStorage #5
3575  1000  dm-2    7          0.000      0.000        0.000        0         0.000        0.000      0.000      localStorage DB
[...]
# netdevstat

PID   UID   DEV       XMIT_CNT   XMIT_MIN   XMIT_MAX   XMIT_AVG   RECV_CNT   RECV_MIN   RECV_MAX   RECV_AVG   COMMAND
3572  991  enp0s31f6    40       0.000      0.882       0.108        0         0.000       0.000       0.000     openvpn
3575  1000 enp0s31f6    27       0.000      1.363       0.160        0         0.000       0.000       0.000     Socket Thread
[...]

このコマンドでは、update_intervaltotal_duration、および display_histogram の 3 つのパラメーターを指定できます。

TuneD
これは、udev デバイスマネージャーを使用して、接続されたデバイスを監視し、システム設定の静的チューニングおよび動的チューニングの両方を有効にするプロファイルベースのシステムチューニングツールです。tuned-adm recommend コマンドを使用すると、Red Hat が推奨する、特定の製品に最も適したプロファイルを確認できます。TuneD の詳細は、TuneD によるシステムパフォーマンスの最適化 を参照してください。powertop2tuned ユーティリティーを使用すると、PowerTOP の提案に基づくカスタム TuneD プロファイルを作成できます。powertop2tuned ユーティリティーの詳細は、電力消費の最適化 を参照してください。
仮想メモリー統計 (vmstat)

procps-ng パッケージによって提供されるツールで、プロセス、メモリー、ページング、ブロック I/O、トラップ、CPU アクティビティーに関する詳細情報を表示できます。この情報は次のコマンドを使用して表示できます。

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b  swpd  free    buff   cache   si   so  bi   bo   in  cs  us  sy id  wa  st
1  0   0   5805576 380856 4852848   0    0  119  73  814  640  2   2 96   0   0

vmstat -a コマンドを使用して、アクティブなメモリーと非アクティブなメモリーを表示します。

iostat

sysstat パッケージによって提供されるこのツールは、vmstat に似ていますが、ブロックデバイスの I/O を監視するためだけに使用されます。より詳細な出力と統計を提供します。次のコマンドを使用してシステムの I/O を監視できます。

$ iostat
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.05    0.46    1.55    0.26    0.00   95.67

Device     tps     kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
nvme0n1    53.54     899.48     616.99      3445229     2363196
dm-0       42.84     753.72     238.71      2886921      914296
dm-1        0.03       0.60       0.00         2292           0
dm-2       24.15     143.12     379.80       548193     1454712
blktrace

I/O サブシステムで費やされている時間に関する詳細な情報を提供します。この情報を人間が読める形式で表示するには、次のコマンドを使用できます。

# blktrace -d /dev/dm-0 -o - | blkparse -i -

253,0   1    1   0.000000000  17694  Q   W 76423384 + 8 [kworker/u16:1]
253,0   2    1   0.001926913     0   C   W 76423384 + 8 [0]
[...]

最初の列 253,0 は、デバイスのメジャー番号とマイナー番号のタプルです。2 番目の列 (1) には CPU に関する情報が示されます。その後には IO プロセスを発行したプロセスの timestampsPID の列が続きます。6 列目の Q はイベントタイプ、7 列目の W は書き込み操作、8 列目の 76423384 はブロック番号、+ 8 は要求されたブロックの数を示します。最後のフィールド [kworker/u16:1] はプロセス名です。初期設定では、プロセスが明示的に強制終了されるまで、blktrace は永続的に実行されます。-w オプションを使用すると、実行時間を指定できます。

turbostat

これは、kernel-tools により提供されます。x86-64 プロセッサーで、プロセッサーのトポロジー、周波数、アイドル電力状態の統計、温度、および電力使用量を報告します。次のコマンドを使用して概要を表示できます。

# turbostat

CPUID(0): GenuineIntel 0x16 CPUID levels; 0x80000008 xlevels; family:model:stepping 0x6:8e:a (6:142:10)
CPUID(1): SSE3 MONITOR SMX EIST TM2 TSC MSR ACPI-TM HT TM
CPUID(6): APERF, TURBO, DTS, PTM, HWP, HWPnotify, HWPwindow, HWPepp, No-HWPpkg, EPB
[...]

デフォルトでは、turbostat は、画面全体のカウンター結果の概要を出力し、その後に 5 秒間隔でカウンター結果を出力します。-i オプションでカウンター結果の出力間隔を指定します。たとえば、代わりに 10 秒ごとに結果を出力するには、turbostat -i 10 を実行します。turbostat は、電力使用量やアイドル時間の点で非効率なサーバーを特定するのにも役立ちます。また、発生しているシステム管理割り込み (SMI) の比率を特定する場合にも便利です。また、これを使用して、電源管理の調整の効果を検証することもできます。

cpupower

cpupower パッケージには、プロセッサーの省電力関連機能を調査および調整するためのツール群が含まれています。cpupower コマンドに、frequency-infofrequency-setidle-infoidle-setsetinfo、および monitor オプションを付けて使用すると、プロセッサー関連の値を表示および設定できます。

たとえば、利用可能な cpufreq ガバナーを表示するには、次のコマンドを使用します。

$ cpupower frequency-info --governors
analyzing CPU 0:
  available cpufreq governors: performance powersave
GNOME Power Manager
これは、GNOME デスクトップ環境にインストールされるデーモンです。GNOME Power Manager は、バッテリーから AC 電源への変更など、システムの電源状態の変化を通知します。また、バッテリーのステータスを報告し、バッテリー残量が少なくなると警告を表示します。
pmda-denki
pmda-denki は電力消費を監視します。これは Performance Co-Pilot スイートの一部であり、経時的な消費量を監視および視覚化するのに役立ちます。詳細は、pmda-denki を使用した RHEL システムの電力消費の制御 を参照してください。

9.4. PowerTOP の目的

PowerTOP は、電力消費に関連する問題を診断し、バッテリー寿命を延ばす方法を提案するプログラムです。PowerTOP ツールは、システム全体の電力使用量の推定値と、各プロセス、デバイス、カーネルワーカー、タイマー、割り込みハンドラーの各電力使用量の推定値を提供できます。このツールは、CPU を頻繁にウェイクアップするカーネルおよびユーザー空間アプリケーションの特定のコンポーネントを識別することもできます。Red Hat Enterprise Linux は PowerTOP バージョン 2.x を使用します。

9.5. PowerTOP のインストール

PowerTop をインストールして使用を開始し、電力消費に関連する問題を診断できます。

手順

  • ターミナルを開いて次のように入力します。

    # dnf install powertop

9.6. PowerTOP の起動

システムにインストールしたら、PowerTop の使用を開始できます。

前提条件

  • ラップトップをバッテリー電源で稼働させている。

手順

  • PowerTOP を実行するには、次のコマンドを使用します。

    # powertop

9.7. PowerTOP のキャリブレーション

PowerTOP のキャリブレーションプロセスを使用すると、ラップトップの電力消費測定の精度を向上させることができます。

手順

  • ラップトップでは、次のコマンドを実行して電力推定エンジンをキャリブレーションできます。

    # powertop --calibrate

    プロセス中にマシンを操作せずに、キャリブレーションを完了させます。キャリブレーションには時間がかかります。このプロセスでは、さまざまなテストが実行されて、輝度が周期的に変更され、デバイスのオン/オフが切り替えられるためです。キャリブレーションプロセスが完了すると、PowerTOP が通常どおり起動します。データを収集するために約 1 時間実行します。

    十分なデータが収集されると、出力テーブルの最初の列に電力予測マークが表示されます。

9.8. 測定間隔の設定

デフォルトでは、PowerTOP は 20 秒間隔で測定を行います。ただし、この測定頻度は要件に応じて変更できます。

手順

  • 測定頻度を変更するには、--time オプションを指定して powertop コマンドを実行します。

    # powertop --time=<time_in_seconds>

9.9. CPU 周波数ドライバーとモードの制御

Intel P-State ドライバーの使用中は、ドライバーがパッシブモードの場合にのみ、PowerTOP は Frequency Stats タブに値を表示します。しかし、その場合も、値が不完全なことがあります。Intel P-State ドライバーには全部で次の 3 つのモードがあります。

  • Hardware P-States (HWP) を使用したアクティブモード
  • HWP を使用しないアクティブモード
  • パッシブモード

ACPI CPUfreq ドライバーに切り替えると、PowerTOP で完全な情報が表示されます。ただし、システムをデフォルト設定にしておくことを推奨します。

手順

  1. どのドライバーがどのモードでロードされているかを表示します。

    # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
    • Intel P-State ドライバーがロードされ、アクティブモードになっている場合は intel_pstate が返されます。
    • Intel P-State ドライバーがロードされ、パッシブモードになっている場合は、intel_cpufreq が返されます。
    • ACPI CPUfreq ドライバーがロードされている場合は、acpi-cpufreq が返されます。
  2. Intel P-State ドライバーの使用中に、以下を実行します。

    1. ドライバーをパッシブモードで強制的に実行するには、カーネルブートコマンドラインに次の引数を追加します。

      intel_pstate=passive
    2. Intel P-State ドライバーを無効にして ACPI CPUfreq ドライバーを使用するには、カーネルブートコマンドラインに次の引数を追加します。

      intel_pstate=disable

9.10. HTML 出力の生成

ターミナルで、powertop の出力とは別に HTML レポートを生成することもできます。

手順

  • --html オプションを指定して powertop コマンドを実行します。

    # powertop --html=<htmlfile.html>

    <htmlfile.html> パラメーターは、必要な出力ファイル名に置き換えます。

9.11. 電力消費の最適化

電力消費を最適化するには、powertop サービスまたは powertop2tuned ユーティリティーのいずれかを使用できます。

9.11.1. powertop サービスで消費電力の最適化

powertop サービスを使用すると、ブート時の Tunables タブから PowerTOP のすべての提案を自動的に有効にできます。

手順

  • powertop サービスを有効にします。

    # systemctl enable powertop

9.11.2. powertop2tuned ユーティリティー

powertop2tuned ユーティリティーを使用して、PowerTOP の提案からカスタムの TuneD プロファイルを作成します。デフォルトでは、powertop2tuned/etc/tuned/ ディレクトリーにプロファイルを作成し、現在選択されている TuneD プロファイルに基づいてカスタムプロファイルを作成します。安全上の理由から、新しいプロファイルでは、すべての PowerTOP チューニングが最初は無効になっています。/etc/tuned/profiles/profile_name/tuned.conf ファイルでコメントを解除することで、チューニングを有効にできます。

PowerTOP によって提案されるチューニングのほとんどを有効にする新しいプロファイルを生成するには、--enable または -e オプションを使用します。USB の autosuspend など、問題が発生する可能性のある一部のチューニングは、デフォルトで無効になっており、手動でコメントを解除する必要があります。

9.11.3. powertop2tuned ユーティリティーで電力消費の最適化

powertop2tuned ユーティリティーを使用すると、システムの電力消費を最適化するのに役立つカスタムの TuneD プロファイルを生成できます。

前提条件

  • powertop2tuned ユーティリティーがシステムにインストールされている。

    # dnf install tuned-utils

手順

  1. カスタムプロファイルを作成するには、次のコマンドを使用します。

    # powertop2tuned <new_profile_name>
  2. 新しいプロファイルをアクティベートします。

    # tuned-adm profile <new_profile_name>

9.11.4. powertop2tuned と powertop.service の使用量の比較

次の理由により、powertop.service よりも powertop2tuned を使用して電力消費を最適化することを推奨します。

  • powertop2tuned ユーティリティーは、PowerTOP を TuneD に統合したものです。これにより、両方のツールの利点を活かすことができます。
  • powertop2tuned ユーティリティーを使用すると、有効になっているチューニングをきめ細かく制御できます。
  • powertop2tuned では、潜在的に危険なチューニングが自動的に有効になりません。
  • powertop2tuned を使用すると、再起動せずにロールバックを行うことができます。

第10章 perf の使用

システム管理者は、perf ツールを使用して、システムのパフォーマンスデータを収集および分析できます。perf ユーザー空間ツールは、カーネルベースのサブシステムである Performance Counters for Linux (PCL) と連携します。perf は、Performance Monitoring Unit (PMU) を使用して、さまざまなハードウェアおよびソフトウェアイベントを測定、記録、監視するツールです。perf は、tracepointskprobesuprobes もサポートしています。

10.1. perf のインストール

perf ツールの使用を開始するには、perf ユーザー空間ツールをインストールする必要があります。

手順

  • perf ツールをインストールします。

    # dnf install perf

10.2. 一般的な perf コマンド

次の一般的な perf コマンドを使用して、パフォーマンスデータを収集および分析できます。

perf stat
実行された命令や消費されたクロックサイクルなど、一般的なパフォーマンスイベントの全体的な統計情報を提供します。オプションを指定すると、デフォルトの測定イベント以外のイベントを選択できます。
perf record
パフォーマンスデータを perf.data ファイルに記録します。このデータは、後で perf report コマンドを使用して分析できます。
perf report
perf record コマンドによって作成された perf.data ファイルからパフォーマンスデータを読み取り、表示します。
perf list
特定のマシンで利用可能なイベントをリスト表示します。このイベントは、システムのパフォーマンス監視ハードウェアおよびソフトウェア設定によって異なります。
perf top
top ユーティリティーと同様の機能を実行します。パフォーマンスカウンタープロファイルをリアルタイムで生成して表示します。
perf trace
strace ツールと同様の機能を実行します。指定されたスレッドまたはプロセスによって使用されるシステムコールとそのアプリケーションが受信するすべてのシグナルを監視します。
perf help
perf コマンドの全リストを表示します。

第11章 perf top を使用した、リアルタイムでの CPU 使用率のプロファイリング

perf top コマンドを使用すると、さまざまな関数の CPU 使用率をリアルタイムで測定できます。

11.1. perf top の目的

perf top コマンドは、リアルタイムのシステムプロファイリングに使用され、top ユーティリティーと同様に機能します。ただし、top ユーティリティーは通常、特定のプロセスまたはスレッドが使用している CPU 時間を表示しますが、perf top は各関数が使用している CPU 時間を表示します。デフォルト状態では、perf top は、ユーザー空間とカーネル空間のすべての CPU で使用されている関数を通知します。perf top を使用するには、root アクセス権が必要です。

11.2. perf top を使用した CPU 使用率のプロファイリング

perf top を使用すると、リアルタイムの CPU 使用率を監視し、最も処理時間を消費している関数を特定できます。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。
  • root アクセス権がある。

手順

  • perf top の監視インターフェイスを起動します。

    # perf top
    The monitoring interface looks similar to the following:
    Samples: 8K of event 'cycles', 2000 Hz, Event count (approx.): 4579432780 lost: 0/0 drop: 0/0
    Overhead  Shared Object       Symbol
       2.20%  [kernel]            [k] do_syscall_64
       2.17%  [kernel]            [k] module_get_kallsym
       1.49%  [kernel]            [k] copy_user_enhanced_fast_string
       1.37%  libpthread-2.29.so  [.] pthread_mutex_lock 1.31% [unknown] [.] 0000000000000000 1.07% [kernel] [k] psi_task_change 1.04% [kernel] [k] switch_mm_irqs_off 0.94% [kernel] [k] fget
       0.74%  [kernel]            [k] entry_SYSCALL_64
       0.69%  [kernel]            [k] syscall_return_via_sysret
       0.69%  libxul.so           [.] 0x000000000113f9b0
       0.67%  [kernel]            [k] kallsyms_expand_symbol.constprop.0
       0.65%  firefox             [.] moz_xmalloc
       0.65%  libpthread-2.29.so  [.] __pthread_mutex_unlock_usercnt
       0.60%  firefox             [.] free
       0.60%  libxul.so           [.] 0x000000000241d1cd
       0.60%  [kernel]            [k] do_sys_poll
       0.58%  [kernel]            [k] menu_select
       0.56%  [kernel]            [k] _raw_spin_lock_irqsave
       0.55%  perf                [.] 0x00000000002ae0f3

    この例では、カーネル関数 do_syscall_64 が最も多くの CPU 時間を使用しています。

11.3. perf の出力とシンボル解決について

perf top の監視インターフェイスは、CPU 使用率と関数のアクティビティーをリアルタイムで表示します。出力を理解することで、パフォーマンスのボトルネックを特定し、システムの動作を最適化することができます。

perf top の出力の主な列
インターフェイスには次のいくつかの列が表示されます。
Overhead
特定の関数によって消費された CPU 時間の割合を表示します。これは、最も resource-intensive な (多くのリソースを消費する) 操作を特定するのに役立ちます。
Shared Object
関数が存在するプログラムまたはライブラリーの名前を示します。
Symbol

関数またはシンボルの名前を表示します。

  • カーネル空間で実行される関数には [k] のマークが付きます。
  • ユーザー空間で実行される関数には [.] のマークが付きます。
perf の出力でシンボルが解決されない原因

カーネル関数は、perf/proc/kallsyms ファイルの情報を使用して、サンプルをそれぞれの関数名またはシンボルにマッピングします。ただし、ユーザー空間で実行される関数は、バイナリーから一部の情報が取り除かれているため、生の関数アドレスが表示される場合があります。

この情報は、対応する debuginfo パッケージをインストールするか、gcc-g オプションを使用するなどしてデバッグを有効にしてアプリケーションをコンパイルすることによって含めることができます。必要なデバッグ情報が利用可能になると、perf はレポート作成時に、サンプリングされたアドレスを人間が判読できる関数名に正確にマッピングできるようになります。

注記

デバッグ情報を利用可能にした後、perf record コマンドを再実行する必要はありません。perf report コマンドを再度実行すれば、解決されたシンボルが反映されます。

11.4. デバッグおよびソースリポジトリーの有効化

Red Hat Enterprise Linux の標準インストールでは、デバッグリポジトリーとソースリポジトリーは有効になりません。このリポジトリーには、システムコンポーネントのデバッグとパフォーマンスの測定に必要な情報が含まれます。

手順

  • ソースおよびデバッグの情報パッケージチャンネルを有効にします。

    # subscription-manager repos --enable rhel-10-for-$(uname -m)-baseos-debug-rpms
    # subscription-manager repos --enable rhel-10-for-$(uname -m)-baseos-source-rpms
    # subscription-manager repos --enable rhel-10-for-$(uname -m)-appstream-debug-rpms
    # subscription-manager repos --enable rhel-10-for-$(uname -m)-appstream-source-rpms

    $(uname -m) の部分は、システムのアーキテクチャーに一致する値に自動的に置き換えられます。

Expand

アーキテクチャー名

64 ビット Intel および AMD

x86_64

64 ビット ARM

aarch64

IBM POWER

ppc64le

64 ビット IBM Z

s390x

11.5. GDB を使用したアプリケーションまたはライブラリーの debuginfo パッケージの取得

デバッグ情報は、コードをデバッグするために必要です。パッケージからインストールされるコードの場合、GNU デバッガー (GDB) は足りないデバッグ情報を自動的に認識し、パッケージ名を解決し、パッケージの取得方法に関する具体的なアドバイスを提供します。

前提条件

手順

  1. デバッグするアプリケーションまたはライブラリーに割り当てられた GDB を起動します。GDB は、足りないデバッグ情報を自動的に認識し、実行するコマンドを提案します。

    $ gdb -q /bin/ls
    Reading symbols from /bin/ls...Reading symbols from .gnu_debugdata for /usr/bin/ls...(no debugging symbols found)...done.
    (no debugging symbols found)...done.
    Missing separate debuginfos, use: dnf debuginfo-install coreutils-9.5-6.el10.x86_64
    (gdb)
  2. GDB を終了するには、q と入力して Enter で確定します。

    (gdb) q
  3. GDB が提案するコマンドを実行して、必要な debuginfo パッケージをインストールします。

    # dnf debuginfo-install coreutils-9.5-6.el10.x86_64

    dnf パッケージ管理ツールにより、変更の概要が表示され、確認を求められます。確認すると、必要なファイルがすべてダウンロードされてインストールされます。GDB が debuginfo パッケージを提案できない場合は、手動でのアプリケーションまたはライブラリーの debuginfo パッケージの取得 で説明されている手順に従ってください。

第12章 perf stat を使用したプロセス実行中のイベントのカウント

perf stat コマンドを使用すると、プロセス実行中のハードウェアイベントとソフトウェアイベントをカウントできます。

12.1. perf stat の目的

perf stat コマンドは、指定されたコマンドを実行し、コマンドの実行中に発生したハードウェアおよびソフトウェアイベントの発生回数を記録し、これらの回数の統計情報を生成します。イベントを指定しないと、perf stat は共通のハードウェアおよびソフトウェアのイベントセットをカウントします。

12.2. perf stat を使用したイベントのカウント

perf stat を使用すると、コマンドの実行中に発生したハードウェアおよびソフトウェアのイベントをカウントし、これらのカウントの統計を生成できます。デフォルトでは、perf stat はスレッドごとのモードで動作します。

前提条件

  • perf のインストール で説明されているように、perf ユーザー空間ツールがインストールされている。
  • ユーザー空間とカーネル空間の両方のイベントをカウントするための root アクセス権がある。

手順

  • イベントをカウントします。

    • root アクセス権なしで perf stat コマンドを実行すると、ユーザー空間で発生するイベントのみがカウントされます。

      $ perf stat ls
      Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
      
       Performance counter stats for 'ls':
      
                    1.28 msec task-clock:u               #    0.165 CPUs utilized
                       0      context-switches:u         #    0.000 M/sec
                       0      cpu-migrations:u           #    0.000 K/sec
                     104      page-faults:u              #    0.081 M/sec
               1,054,302      cycles:u                   #    0.823 GHz
               1,136,989      instructions:u             #    1.08  insn per cycle
                 228,531      branches:u                 #  178.447 M/sec
                  11,331      branch-misses:u            #    4.96% of all branches
      
          0.007754312 seconds time elapsed
          0.000000000 seconds user
      	0.007717000 seconds sys

      上記の例では、perf stat は root アクセス権なしで実行され、イベント名の後に :u が付いています。これは、これらのイベントがユーザー空間でのみカウントされたことを示しています。

    • ユーザー空間イベントとカーネル空間イベントの両方をカウントするには、次のコマンドを実行します。

      # perf stat ls
      Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
       Performance counter stats for 'ls':
      
                    3.09 msec task-clock                #    0.119 CPUs utilized
                      18      context-switches          #    0.006 M/sec
                       3      cpu-migrations            #    0.969 K/sec
                     108      page-faults               #    0.035 M/sec
               6,576,004      cycles                    #    2.125 GHz
               5,694,223      instructions              #    0.87  insn per cycle
               1,092,372      branches                  #  352.960 M/sec
                  31,515      branch-misses             #    2.89% of all branches
      
      0.026020043 seconds time elapsed
      0.000000000 seconds user
      0.014061000 seconds sys
  • デフォルトでは、perf stat はスレッドごとのモードで動作します。CPU 全体のイベントカウントに変更するには、-a オプションを perf stat に渡します。CPU 全体のイベントをカウントするには、root アクセスが必要です。

    # perf stat -a ls

12.3. perf stat 出力の解釈

perf stat は指定されたコマンドを実行し、コマンドの実行中にイベントの発生をカウントし、これらのカウントの統計を 3 列で表示します。

  • カウントされた特定のイベントの発生回数。
  • カウントされたイベントの名前。
  • 関連するメトリクスが利用可能な場合は、右端の列でハッシュ記号 (#) の後に比率またはパーセンテージが表示されます。たとえば、デフォルトモードで実行した場合、perf stat はサイクルと命令の両方をカウントするため、サイクルあたりの命令数を計算して右端の列に表示します。分岐ミスに関しても同様の動作が見られます。デフォルトで両方のイベントがカウントされるため、全分岐数に対する分岐ミスの割合が表示されます。

12.4. 実行中のプロセスに perf stat を割り当てる

perf stat を実行中のプロセスに割り当てることができます。これにより、コマンドの実行中に、指定したプロセス内でのみイベントの発生をカウントするように perf stat に指示できます。

前提条件

  • perf のインストール で説明されているように、perf ユーザー空間ツールがインストールされている。

手順

  • perf stat を実行中のプロセスに割り当てます。

    $ perf stat -p ID1,ID2 sleep seconds

    上記の例では、sleep コマンドを使用して指定した seconds 秒間、ID が ID1 および ID2 のプロセス内のイベントをカウントします。

第13章 perf によるパフォーマンスプロファイルの記録および分析

perf ツールを使用すると、パフォーマンスデータを記録し、後で分析することができます。

13.1. perf record の目的

perf record コマンドはパフォーマンスデータをサンプリングし、perf.data ファイルに保存します。その後、他の perf コマンドを使用してデータを読み取って視覚化できます。perf.data はカレントディレクトリーに生成され、後で別のマシンからアクセスできるようになります。perf record -a を実行すると、システム全体をプロファイリングできます。これを実行すると、Ctrl+C を押すまで、または特定のコマンドが実行されている間、パフォーマンスデータが記録されます。同様に、perf record ./your_app を実行するか、perf record -p PID を使用してすでに実行中のアプリケーション/プロセスに接続することで、1 つのアプリケーション/プロセスをプロファイリングできます。

13.2. パフォーマンスプロファイルの記録

perf record を使用すると、パフォーマンスデータをサンプリングして記録できます。取得されるデータのレベルはアクセスレベルによって異なります。

  • root アクセス権なし: perf record はユーザー空間でのみデータを収集します。
  • root アクセス権あり: perf record はユーザー空間とカーネル空間の両方でデータを収集します。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。
  • ユーザー空間およびカーネル空間のデータを収集する場合、root アクセス権がある。

手順

  • 次のいずれかを行います。

    • ユーザー空間のパフォーマンスデータをサンプリングして記録するには、次のコマンドを実行します。

      $ perf record command
    • カーネル空間のパフォーマンスデータをサンプリングして記録するには、次のコマンドを実行します (root または sudo アクセス権を使用)。

      # perf record command

      command は、プロファイリングする実際のコマンドに置き換えます。コマンドを指定しない場合は、Ctrl+C を押して手動で停止するまで、perf record によってデータがサンプリングされます。

13.3. CPU ごとのモードでのパフォーマンスプロファイルの記録

perf record を CPU ごとのモードで使用すると、監視対象の CPU 上の全スレッドを対象に、ユーザー空間とカーネル空間の両方で同時にパフォーマンスデータをサンプリングして記録できます。デフォルトでは、CPU ごとのモードはすべてのオンライン CPU を監視します。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  • パフォーマンスデータのサンプルと記録:

    # perf record -a command

    command は、データのサンプリングを実行するコマンドに置き換えます。コマンドを指定しない場合は、Ctrl+C を押して手動で停止するまで、perf record によってデータがサンプリングされます。

13.4. perf record を使用したコールグラフデータの取得

perf record ツールを設定して、パフォーマンスプロファイルでどの関数が他の関数を呼び出すかを記録することができます。これは、複数のプロセスが同じ関数を呼び出す場合にボトルネックを特定するのに役立ちます。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  • --call-graph オプションを使用して、パフォーマンスデータのサンプルと記録を行います。

    $ perf record --call-graph method command
    • command は、データのサンプリングを実行するコマンドに置き換えます。コマンドを指定しない場合は、Ctrl+C を押して手動で停止するまで、perf record によってデータがサンプリングされます。
    • method は、次のいずれかのアンワインドメソッドに置き換えます。

      fp
      フレームポインターメソッドを使用します。GCC オプション --fomit-frame-pointer を使用してビルドされたバイナリーの場合など、コンパイラーの最適化によっては、スタックをアンワインドできない場合があります。
      dwarf
      DWARF 呼び出し情報を使用してスタックのアンワインドを行います。
      lbr
      Intel プロセッサーで最後のブランチレコードハードウェアを使用します。

13.5. perf report を使用した perf.data の分析

perf report を使用して、perf.data ファイルのデータを表示および分析できます。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。
  • カレントディレクトリーに perf.data ファイルがある。
  • perf.data ファイルが root アクセス権で作成されている場合は、perf report も root アクセス権で実行する必要があります。

手順

  • 詳細な分析のために、perf.data ファイルの内容を表示します。

    # perf report
    This command displays output similar to the following:
    Samples: 2K of event 'cycles', Event count (approx.): 235462960
    Overhead  Command          Shared Object                     Symbol
       2.36%  kswapd0          [kernel.kallsyms]                 [k] page_vma_mapped_walk
       2.13%  sssd_kcm         libc-2.28.so                      [.] memset_avx2_erms 2.13% perf [kernel.kallsyms] [k] smp_call_function_single 1.53% gnome-shell libc-2.28.so [.] strcmp_avx2
       1.17%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_hash_table_lookup
       0.93%  Xorg             libc-2.28.so                      [.] memmove_avx_unaligned_erms 0.89% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_object_unref 0.87% kswapd0 [kernel.kallsyms] [k] page_referenced_one 0.86% gnome-shell libc-2.28.so [.] memmove_avx_unaligned_erms
       0.83%  Xorg             [kernel.kallsyms]                 [k] alloc_vmap_area
       0.63%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_slice_alloc
       0.53%  gnome-shell      libgirepository-1.0.so.1.0.0      [.] g_base_info_unref
       0.53%  gnome-shell      ld-2.28.so                        [.] _dl_find_dso_for_object
       0.49%  kswapd0          [kernel.kallsyms]                 [k] vma_interval_tree_iter_next
    0.48%  gnome-shell      libpthread-2.28.so                [.] pthread_getspecific 0.47% gnome-shell libgirepository-1.0.so.1.0.0 [.] 0x0000000000013b1d 0.45% gnome-shell libglib-2.0.so.0.5600.4 [.] g_slice_free1 0.45% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_type_check_instance_is_fundamentally_a 0.44% gnome-shell libc-2.28.so [.] malloc 0.41% swapper [kernel.kallsyms] [k] apic_timer_interrupt 0.40% gnome-shell ld-2.28.so [.] _dl_lookup_symbol_x 0.39% kswapd0 [kernel.kallsyms] [k] raw_callee_save___pv_queued_spin_unlock

    詳細は、システム上の perf-record(1) man ページを参照してください。

13.6. 実行中のプロセスに perf レコードを割り当てる

実行中のプロセスに perf レコードを割り当てることができます。これにより、指定されたプロセスのパフォーマンスデータのみをサンプリングして記録するように perf record に指示します。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  • 実行中のプロセスに perf record を割り当てます。

    $ perf record -p ID1,ID2 sleep seconds

    このコマンドにより、sleep コマンドで指定した seconds 数間、プロセス ID が ID1 および ID2 のプロセスのパフォーマンスデータをサンプリングして記録します。perf を設定して、イベントを特定のスレッドに記録することもできます。

    $ perf record -t ID1,ID2 sleep seconds
    注記

    -t フラグを使用し、スレッド ID をログに記録する場合、perf はデフォルトで継承を無効にします。--inherit オプションを追加して継承を有効にできます。

13.7. perf report 出力の解釈

perf report コマンドを実行すると表示されるテーブルでは、データが次の複数の列に分類されます。

Overhead
その特定の関数で収集されたサンプル全体の割合を示します。
コマンド
サンプルが収集されたプロセスを通知します。
Shared Object
サンプルの送信元である ELF イメージの名前を表示します (サンプルがカーネルからのものである場合に [kernel.kallsyms] という名前が使用されます)。
Symbol
関数名またはシンボルを表示します。デフォルトモードでは、関数は、オーバーヘッドの最も高いものが最初に表示される順に降順でソートされます。

13.8. 別のデバイスで読み取り可能な perf.data ファイルの生成

perf ツールを使用してパフォーマンスデータを perf.data ファイルに記録し、異なるデバイスで分析することができます。

前提条件

手順

  1. さらに調査する予定のパフォーマンスデータを取得します。

    # perf record -a --call-graph fp sleep <seconds>

    この例では、sleep コマンドで指定した seconds 秒間、システム全体の perf.data を生成します。また、フレームポインターメソッドを使用してコールグラフデータを取得します。

  2. 記録されたデータのデバッグシンボルを含むアーカイブファイルを生成します。

    # perf archive

検証

  • アーカイブファイルが現在のアクティブなディレクトリーで生成されたことを確認します。

    # ls perf.data*

    出力には、perf.data で始まる現在のディレクトリーのすべてのファイルが表示されます。アーカイブファイルの名前は、perf.data.tar.gz または perf.data.tar.bz2 のいずれかになります。

13.9. 別のデバイスで生成された perf.data ファイルの分析

perf ツールを使用して、別のデバイスで生成された perf.data ファイルを分析することができます。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。
  • 使用中の現在のデバイスに、別のデバイスで生成された perf.data ファイルと関連アーカイブファイルが存在する。

手順

  1. perf.data ファイルとアーカイブファイルの両方を現在のアクティブなディレクトリーにコピーします。
  2. アーカイブファイルを ~/.debug に展開します。

    # mkdir -p ~/.debug
    # tar xf perf.data.tar.bz2 -C ~/.debug
    注記

    アーカイブファイルの名前は perf.data.tar.gz になることもあります。

  3. perf.data ファイルを開いて詳細な分析を行います。

    # perf report

第14章 perf を使用したビジーな CPU の調査

システムでパフォーマンスの問題を調査する際には、perf ツールを使用して最もビジー状態の CPU を特定し、監視することで、作業に集中することができます。

14.1. perf stat でカウントした CPU イベントの表示

CPU カウントの集約を無効にすると、perf stat を使用して、どの CPU イベントがカウントされたかを表示できます。この機能を使用するには、-a フラグを使用してシステム全体モードでイベントをカウントする必要があります。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  • CPU カウントアグリゲーションが無効になっているイベントをカウントします。

    # perf stat -a -A sleep seconds

    このコマンドは、sleep コマンドで指定した seconds 秒間に記録された一般的なハードウェアイベントとソフトウェアイベントのデフォルトセットの数を、CPU ごとに CPU0 から昇順で表示します。そのため、cycles などのイベントを指定すると便利な場合があります。

    # perf stat -a -A -e cycles sleep seconds

14.2. perf report で取得した CPU サンプルの表示

perf record コマンドはパフォーマンスデータをサンプリングし、perf.data ファイルに保存します。このファイルは、perf report コマンドを使用して読み取ることができます。perf record コマンドは、各サンプルが取得された CPU も記録します。この情報を表示するには、perf report コマンドを適切に設定してください。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。
  • カレントディレクトリーに、perf record で作成した perf.data ファイルがある。perf.data ファイルが root アクセス権で作成されている場合は、perf report も root アクセス権で実行する必要があります。

手順

  • CPU でソートしながら、詳細な分析のために perf.data ファイルの内容を表示します。

    # perf report --sort cpu
    • CPU およびコマンドでソートすると、CPU 時間が費やされている場所に関する詳細情報を表示できます。

      # perf report --sort cpu,comm

      この例では、監視対象の全 CPU からのコマンドを、オーバーヘッド使用量の降順で合計オーバーヘッド別にリスト表示し、コマンドが実行された CPU を特定します。

14.3. perf top を使用したプロファイリング中の特定の CPU の表示

perf top を設定すると、システムをリアルタイムでプロファイリングしながら、特定の CPU とその相対的な使用率を表示できます。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  • CPU で並べ替えた状態で perf top インターフェイスを起動します。

    # perf top --sort cpu

    このコマンドは、CPU とそれぞれのオーバーヘッドを、オーバーヘッド使用量の降順でリアルタイムにリスト表示します。CPU とコマンドで並べ替えることで、CPU 時間が費やされている場所に関する詳細な情報を取得できます。

    # perf top --sort cpu,comm

    このコマンドは、オーバーヘッド使用量の降順で合計オーバーヘッド別にコマンドをリスト表示し、コマンドが実行された CPU をリアルタイムで特定します。

14.4. perf record と perf report を使用した特定の CPU の監視

perf ツールを使用して、特定の CPU からパフォーマンスデータをサンプリングし、その結果を分析して CPU 固有の動作やボトルネックを特定できます。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  1. 特定の CPU のパフォーマンスデータを記録します。

    特定の CPU をターゲットにするには、perf record-C オプションを使用します。次の例は、個々の CPU または範囲を指定する方法を示しています。

    • 選択した CPU (コンマ区切り) からデータをサンプリングするには、次のコマンドを実行します。

      # perf record -C 0,1 sleep <seconds>

      このコマンドは、指定した秒数にわたって CPU 01 からパフォーマンスデータをサンプリングして記録します。

    • CPU の範囲からデータをサンプリングするには、次のコマンドを実行します。

      # perf record -C 0-2 sleep <seconds>

      このコマンドは、指定した期間にわたって CPU 01、および 2 からパフォーマンスデータをサンプリングして記録します。

  2. 記録されたパフォーマンスデータを分析します。

    perf report コマンドを使用して、perf.data ファイルを読み取って分析します。

    # perf report

    このコマンドは、perf.data ファイルの内容を表示します。

    注記

    各サンプルがどの CPU で記録されたかを確認するには、「perf report を使用してサンプルがどの CPU で取得されたかを表示する」を参照してください。

第15章 perf を使用した uprobes の作成

uprobes (ユーザー空間プローブ) は、ソースコードの変更や再コンパイルを必要とせずに、実行時にユーザー空間アプリケーション内の特定のポイントを監視する動的な計装メカニズムです。

uprobes が役立つ主なユースケースは 2 つあります。

デバッグとパフォーマンス分析
uprobes はウォッチポイントと同様に機能します。アプリケーション内の特定の場所に挿入して、そのコードパスが実行される頻度をカウントできます。さらに、コールスタックや変数値などの豊富なコンテキストを取得できるため、パフォーマンスのボトルネックの特定やバグの追跡に役立ちます。
イベントベースのデータ収集
uprobes は、循環バッファーなどのメカニズムに対する切り替えイベントとして機能し、ユーザー空間での実行トリガーに基づいてデータが記録またはフラッシュされるタイミングを制御するのに役立ちます。

uprobesperf とシームレスに統合するため、既存の uprobes を使用することも、新しい uprobes を作成することもできます。このような柔軟性を (kprobes による) カーネル空間の計装と併せて利用することで、ユーザー空間の動作を、効果的かつ非侵入的な方法で観測およびプロファイリングすることが可能になります。

15.1. perf を使用して関数レベルで uprobes を作成する

perf ツールを使用すると、プロセスまたはアプリケーション内の任意の点に動的なトレースポイントを作成できます。その後、このトレースポイントを perf statperf record などの他の perf ツールと併用すると、プロセスやアプリケーションの動作をよりよく理解できるようになります。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  • プロセスまたはアプリケーション内の対象の場所で、監視対象のプロセスまたはアプリケーションに uprobe を作成します。

    # perf probe -x /path/to/executable -a function
    
    Added new event:
      probe_executable:function   (on function in /path/to/executable)
    
    You can now use it in all perf tools, such as:
        perf record -e probe_executable:function -aR sleep 1

15.2. perf を使用して関数内の行に uprobes を作成する

トレースポイントを perf statperf record などの他の perf ツールと組み合わせて使用すると、プロセスまたはアプリケーションの動作をより深く理解できます。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。
  • 実行可能ファイルのデバッグシンボルを取得した。

    # objdump -t ./your_executable | head
    注記

    これを行うには、実行ファイルの debuginfo パッケージをインストールする必要があります。または、実行ファイルがローカルで開発したアプリケーションの場合は、デバッグ情報 (GCC の -g オプション) を使用してアプリケーションをコンパイルする必要があります。

手順

  1. uprobe を配置できる関数の行を表示します。

    $ perf probe -x ./your_executable -L main
  2. このコマンドの出力は、以下のようになります。

    <main@/home/user/my_executable:0>
                  0  int main(int argc, const char *argv) 1 { int err; const char *cmd; char sbuf[STRERR_BUFSIZE]; / libsubcmd init */
                  7         exec_cmd_init("perf", PREFIX, PERF_EXEC_PATH, EXEC_PATH_ENVIRONMENT);
    8         pager_init(PERF_PAGER_ENVIRONMENT);
  3. 必要な関数の行の uprobe を作成します。

    # perf probe -x ./my_executable main:8
    Added new event:
              probe_my_executable:main_L8   (on main:8 in /home/user/my_executable)
    
    you can now use it in all perf tools, such as:
    
    Perf record -e probe_my_executable:main_L8 -aR sleep 1

15.3. uprobes で記録されたデータの perf script の出力

uprobes で収集されたデータを分析する一般的な方法は、perf script コマンドを実行することです。このコマンドは、perf.data ファイルを読み取り、記録されたワークロードの詳細なトレースを表示します。

perf script の出力例
  • my_prog というプログラムの isprime() 関数に uprobe が追加されます。
  • auprobe に追加される関数の引数です。または、a を、uprobe を追加するコードスコープで表示される任意の変数にすることもできます。

    # perf script
        my_prog  1367 [007] 10802159.906593: probe_my_prog:isprime: (400551) a=2
        my_prog  1367 [007] 10802159.906623: probe_my_prog:isprime: (400551) a=3
        my_prog  1367 [007] 10802159.906625: probe_my_prog:isprime: (400551) a=4
        my_prog  1367 [007] 10802159.906627: probe_my_prog:isprime: (400551) a=5
        my_prog  1367 [007] 10802159.906629: probe_my_prog:isprime: (400551) a=6
        my_prog  1367 [007] 10802159.906631: probe_my_prog:isprime: (400551) a=7
        my_prog  1367 [007] 10802159.906633: probe_my_prog:isprime: (400551) a=13
        my_prog  1367 [007] 10802159.906635: probe_my_prog:isprime: (400551) a=17
        my_prog  1367 [007] 10802159.906637: probe_my_prog:isprime: (400551) a=19

第16章 perf mem によるメモリーアクセスのプロファイリング

perf mem コマンドを使用して、システム上でメモリーアクセスのサンプリングを行うことができます。perf ツールの mem サブコマンドは、メモリーアクセスのサンプリング (読み込みおよ格納) を可能にします。perf mem コマンドは、メモリーのレイテンシー、メモリーアクセスの種類、キャッシュヒットとミスを引き起こす関数に関する情報を提供します。また、データシンボルを記録することで、これらのヒットとミスが発生するメモリーの場所に関する情報も提供します。

16.1. perf mem によるメモリーアクセスのサンプリング

perf mem コマンドを使用して、システム上でメモリーアクセスのサンプリングを行うことができます。このコマンドは、perf record および perf report と同じオプションに加えて、mem サブコマンド専用のいくつかのオプションを受け付けます。記録されたデータは、後で分析するために、現在のディレクトリーの perf.data ファイルに保存されます。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  1. メモリーアクセスをサンプリングします。

    # perf mem record -a sleep <seconds>

    このコマンドは、sleep コマンドで指定した <seconds> 秒間、すべての CPU のメモリーアクセスをサンプリングします。sleep コマンドは、メモリーアクセスデータをサンプルしたいコマンドに置き換えることができます。デフォルトでは、perf mem は、メモリーロードおよびストアの両方をサンプルします。-t オプションを使用し、perf memrecord の間に load または store のいずれかを指定することにより、メモリー操作を 1 つだけ選択できます。ロードすると、メモリー階層レベルに関する情報、TLB メモリーアクセス、バススヌーピング、およびメモリーロックがキャプチャーされます。

  2. 分析用に perf.data ファイルを開きます。

    # perf mem report

    上記のコマンド例を使用すると、以下のような出力になります。

    Available samples
    35k cpu/mem-loads,ldlat=30/P
    54k cpu/mem-stores/P

    cpu/mem-loads,ldlat=30/P の行は、メモリーロードで収集されるデータを示し、cpu/mem-stores/P の行はメモリーストアで収集されるデータを示します。対象のカテゴリーを強調表示し、Enter を押してデータを表示します。

    Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 4067062
    Overhead       Samples  Local Weight  Memory access             Symbol                                                                 Shared Object                 Data Symbol                                                     Data Object                            Snoop         TLB access              Locked
       0.07%            29  98            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.06%            26  97            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.06%            25  96            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.06%             1  2325          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e9084                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
       0.06%             1  2247          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e8164                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
       0.05%             1  2166          L1 or L1 hit              [.] 0x00000000038140d6                                                 libxul.so                     [.] 0x00007ffd7b84b4a8                                          [stack]                                None          L1 or L2 hit            No
       0.05%             1  2117          Uncached or N/A hit       [k] check_for_unclaimed_mmio                                           [kernel.kallsyms]             [k] 0xffffb092c1842300                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
       0.05%            22  95            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.05%             1  1898          L1 or L1 hit              [.] 0x0000000002a30e07                                                 libxul.so                     [.] 0x00007f610422e0e0                                          anon                                   None          L1 or L2 hit            No
       0.05%             1  1878          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e8164                                          [kernel.kallsyms]                      None          L2 miss                 No
       0.04%            18  94            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.04%             1  1593          Local RAM or RAM hit      [.] 0x00000000026f907d                                                 libxul.so                     [.] 0x00007f3336d50a80                                          anon                                   Hit           L2 miss                 No
       0.03%             1  1399          L1 or L1 hit              [.] 0x00000000037cb5f1                                                 libxul.so                     [.] 0x00007fbe81ef5d78                                          libxul.so                              None          L1 or L2 hit            No
       0.03%             1  1229          LFB or LFB hit            [.] 0x0000000002962aad                                                 libxul.so                     [.] 0x00007fb6f1be2b28                                          anon                                   None          L2 miss                 No
       0.03%             1  1202          LFB or LFB hit            [.] __pthread_mutex_lock                                               libpthread-2.29.so            [.] 0x00007fb75583ef20                                          anon                                   None          L1 or L2 hit            No
       0.03%             1  1193          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e9164                                          [kernel.kallsyms]                      None          L2 miss                 No
    0.03%             1  1191          L1 or L1 hit              [k] azx_get_delay_from_lpib                                            [kernel.kallsyms]             [k] 0xffffb092ca7efcf0                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
  3. オプション: データを表示するときに、結果を並べ替えて、関心のあるさまざまな側面を調査します。たとえば、サンプリング期間中に発生したメモリーアクセスの種類ごとに、主な原因となるオーバーヘッドの降順で、メモリー負荷でデータを分類するには、以下を行います。

    # perf mem -t load report --sort=mem

    たとえば、以下のような出力になります。

    Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 40670
    Overhead       Samples  Memory access
      31.53%          9725  LFB or LFB hit
      29.70%         12201  L1 or L1 hit
      23.03%          9725  L3 or L3 hit
      12.91%          2316  Local RAM or RAM hit
       2.37%           743  L2 or L2 hit
       0.34%             9  Uncached or N/A hit
       0.10%            69  I/O or N/A hit
       0.02%           825  L3 miss

16.2. perf mem 出力の解釈

修飾子なしで perf mem report コマンドを実行すると、データが複数の列に分類されます。

Overhead
特定の関数で収集された全体のサンプルの割合を示します。
Samples
その行でアカウントを指定したサンプル数を表示します。
Local Weight
プロセッサーのコアサイクルでアクセスレイテンシーを表示します。
Memory Access
発生したメモリーアクセスのタイプを表示します。
Symbol
関数名またはシンボルを表示します。
Shared Object
サンプルの取得元である ELF イメージの名前を表示します (サンプルがカーネルから取得される場合は、[kernel.kallsyms] という名前が使用されます)。
Data Symbol

行がターゲットとしていたメモリーの場所のアドレスを表示します。

重要

Data Symbol 列には、メモリーの動的割り当てや、スタックメモリーへのアクセスが原因で、生のアドレスが表示される場合があります。

Snoop
バストランザクションを表示します。
TLB Access
TLB メモリーアクセスを表示します。
Locked
関数がメモリーがロックされたか否かを示します。デフォルトモードでは、関数は、オーバーヘッドの最も高いものが最初に表示される順に降順でソートされます。

第17章 偽共有の検出

偽共有は、対称型マルチプロセッシング (SMP) システムにおいて、あるプロセッサーコアが特定のキャッシュライン上のデータ項目を変更した際に、他のプロセッサーが、プロセッサー間では共有されていない別のデータ項目にアクセスするために、そのキャッシュラインを使用している場合に発生します。

この最初のデータ変更により、そのキャッシュラインを使用している他のプロセッサーは、変更されたデータ項目の更新版を必要としていなかったり、アクセス権すら持っていないにもかかわらず、自身のコピーを無効化し、更新版を要求せざるを得なくなります。

perf c2c コマンドを使用して、偽共有を検出できます。

17.1. perf c2c の目的

perf ツールの c2c サブコマンドは、Shared Data Cache-to-Cache (C2C) 分析を有効にします。perf c2c コマンドを使用して、キャッシュライン競合を検査し、true と false の両方の共有を検出できます。

キャッシュラインの競合は、対称型マルチプロセッシング (SMP) システムのプロセッサーコアが、他のプロセッサーによって使用されている同じキャッシュラインにあるデータオブジェクトを修正すると発生します。このキャッシュラインを使用する他のプロセッサーはすべて、コピーを無効にして更新されたものを要求します。これにより、パフォーマンスが低下する可能性があります。

perf c2c コマンドは、以下の情報を提供します。

  • 競合が検出されたキャッシュライン
  • データの読み取りおよび書き込みのプロセス
  • 競合の原因となった命令
  • 競合に関連する NUMA (Non-Uniform Memory Access) ノード

17.2. perf c2c を使用したキャッシュライン競合の検出

perf c2c コマンドを使用すると、システム内のキャッシュライン競合を検出できます。perf c2c コマンドは、perf record と同じオプションに加えて、c2c サブコマンド専用のいくつかのオプションをサポートしています。記録されたデータは、後で分析するために、現在のディレクトリーの perf.data ファイルに保存されます。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  • perf c2c を使用してキャッシュラインの競合を検出します。

    # perf c2c record -a sleep <seconds>

    このコマンドは、sleep コマンドで指定した <seconds> 期間にわたって、すべての CPU のキャッシュライン競合データをサンプリングして記録します。sleep コマンドは、キャッシュライン競合データを収集するコマンドに置き換えることができます。

17.3. perf c2c record で記録した perf.data ファイルの視覚化

perf c2c コマンドで記録した perf.data ファイルを視覚化できます。

前提条件

手順

  1. 分析用に perf.data ファイルを開きます。

    # perf c2c report --stdio

    このコマンドは、perf.data ファイルを端末内の複数のグラフに可視化します。

    =================================================
               Trace Event Information
    =================================================
     Total records                     :     329219
     Locked Load/Store Operations      :      14654
     Load Operations                   :      69679
     Loads - uncacheable               :          0
     Loads - IO                        :          0
     Loads - Miss                      :       3972
     Loads - no mapping                :          0
     Load Fill Buffer Hit              :      11958
     Load L1D hit                      :      17235
     Load L2D hit                      :         21
     Load LLC hit                      :      14219
     Load Local HITM                   :       3402
     Load Remote HITM                  :      12757
     Load Remote HIT                   :       5295
     Load Local DRAM                   :        976
     Load Remote DRAM                  :       3246
     Load MESI State Exclusive         :       4222
     Load MESI State Shared            :          0
     Load LLC Misses                   :      22274
     LLC Misses to Local DRAM          :        4.4%
     LLC Misses to Remote DRAM         :       14.6%
     LLC Misses to Remote cache (HIT)  :       23.8%
     LLC Misses to Remote cache (HITM) :       57.3%
     Store Operations                  :     259539
     Store - uncacheable               :          0
     Store - no mapping                :         11
     Store L1D Hit                     :     256696
     Store L1D Miss                    :       2832
     No Page Map Rejects               :       2376
     Unable to parse data source       :          1
    
    =================================================
       Global Shared Cache Line Event Information
    =================================================
     Total Shared Cache Lines          :         55
     Load HITs on shared lines         :      55454
     Fill Buffer Hits on shared lines  :      10635
     L1D hits on shared lines          :      16415
     L2D hits on shared lines          :          0
     LLC hits on shared lines          :       8501
     Locked Access on shared lines     :      14351
     Store HITs on shared lines        :     109953
     Store L1D hits on shared lines    :     109449
     Total Merged records              :     126112
    
    =================================================
                     c2c details
    =================================================
     Events                            : cpu/mem-loads,ldlat=30/P
    	                                    : cpu/mem-stores/P
     Cachelines sort on                : Remote HITMs
     Cacheline data grouping          : offset,pid,iaddr
    
    =================================================
    	   Shared Data Cache Line Table
    =================================================
    #
    #                              Total      Rmt  ----- LLC Load Hitm -----  ---- Store Reference ----  --- Load Dram ----      LLC    Total  ----- Core Load Hit -----  -- LLC Load Hit --
    # Index           Cacheline  records     Hitm    Total      Lcl      Rmt    Total    L1Hit   L1Miss       Lcl       Rmt  Ld Miss    Loads       FB       L1       L2       Llc       Rmt
    # .....  ..................  .......  .......  .......  .......  .......  .......  .......  .......  ........  ........  .......  .......  .......  .......  .......  ........  ........
    #
          0            0x602180   149904   77.09%    12103     2269     9834   109504   109036      468       727      2657    13747    40400     5355    16154        0      2875       529
          1            0x602100    12128   22.20%     3951     1119     2832        0        0        0        65       200     3749    12128     5096      108        0      2056       652
          2  0xffff883ffb6a7e80      260    0.09%       15        3       12      161      161        0         1         1       15       99       25       50        0         6         1
          3  0xffffffff81aec000      157    0.07%        9        0        9        1        0        1         0         7       20      156       50       59        0        27         4
          4  0xffffffff81e3f540      179    0.06%        9        1        8      117       97       20         0        10       25       62       11        1        0        24         7
    
    =================================================
          Shared Cache Line Distribution Pareto
    =================================================
    #
    #        ----- HITM -----  -- Store Refs --        Data address                               ---------- cycles ----------       cpu                                     Shared
    #   Num      Rmt      Lcl   L1 Hit  L1 Miss              Offset      Pid        Code address  rmt hitm  lcl hitm      load       cnt               Symbol                Object                  Source:Line  Node{cpu list}
    # .....  .......  .......  .......  .......  ..................  .......  ..................  ........  ........  ........  ........  ...................  ....................  ...........................  ....
    #
      -------------------------------------------------------------
          0     9834     2269   109036      468            0x602180
      -------------------------------------------------------------
              65.51%   55.88%   75.20%    0.00%                 0x0    14604            0x400b4f     27161     26039     26017         9  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:144   0{0-1,4}  1{24-25,120}  2{48,54}  3{169}
    	   0.41%    0.35%    0.00%    0.00%                 0x0    14604            0x400b56     18088     12601     26671         9  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:145   0{0-1,4}  1{24-25,120}  2{48,54}  3{169}
    	   0.00%    0.00%   24.80%  100.00%                 0x0    14604            0x400b61         0         0         0         9  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:145   0{0-1,4}  1{24-25,120}  2{48,54}  3{169}
    	   7.50%    9.92%    0.00%    0.00%                0x20    14604            0x400ba7      2470      1729      1897         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:154   1{122}  2{144}
    	  17.61%   20.89%    0.00%    0.00%                0x28    14604            0x400bc1      2294      1575      1649         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:158   2{53}  3{170}
    	   8.97%   12.96%    0.00%    0.00%                0x30    14604            0x400bdb      2325      1897      1828         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:162   0{96}  3{171}
    
      -------------------------------------------------------------
          1     2832     1119        0        0            0x602100
      -------------------------------------------------------------
    	  29.13%   36.19%    0.00%    0.00%                0x20    14604            0x400bb3      1964      1230      1788         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:155   1{122}  2{144}
    	  43.68%   34.41%    0.00%    0.00%                0x28    14604            0x400bcd      2274      1566      1793         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:159   2{53}  3{170}
    27.19%   29.40%    0.00%    0.00%                0x30    14604            0x400be7      2045      1247      2011         2  [.] read_write_func  no_false_sharing.exe  false_sharing_example.c:163   0{96}  3{171}

17.4. perf c2c 出力の解釈

perf c2c report --stdio コマンドを実行して表示される視覚化は、データを複数のテーブルに分類します。

Trace Events Information
perf c2c record コマンドによって収集されたすべての負荷およびストアサンプルの概要を示します。
Global Shared Cache Line Event Information
共有キャッシュラインの統計情報を示します。
c2c Details
サンプリングされたイベントと、視覚表示内で perf c2c report のデータがどのように編成されているかに関する情報を示します。
Shared Data Cache Line Table
偽共有が検出された最もアクセスの多いキャッシュラインに関する 1 行の概要を示します。デフォルトでは、キャッシュラインごとに検出されたリモート Hitm の量が多い順に並べ替えられます。
Shared Cache Line Distribution Pareto

競合が発生している各キャッシュラインに関するさまざまな情報を示します。

  • キャッシュラインは NUM 列で番号 0 から始まる番号です。
  • 各キャッシュラインの仮想アドレスは Data address Offset の列に含まれます。また、その後に異なるアクセスが発生したキャッシュラインにオフセットが続きます。
  • Pid 列にはプロセス ID が含まれます。
  • Code Address 列には、インストラクションポインターコードアドレスが含まれます。
  • cycles ラベル下の列には、平均負荷のレイテンシーが表示されます。
  • cpu cnt 列には、サンプルが何個の CPU から取得されたかが表示されます。つまり、特定の場所でインデックス付けされたデータを待機していた CPU の数を示しています。
  • Symbol 列には関数名またはシンボルが表示されます。
  • Shared Object 列には、サンプルの取得元である ELF イメージの名前が表示されます (サンプルがカーネルから取得される場合は、[kernel.kallsyms] という名前が使用されます)。
  • Source:Line 列には、ソースファイルと行番号が表示されます。
  • Node{cpu list} 列には、各ノードに対して、どの特定の CPU サンプルが生成されたかが表示されます。

17.5. perf c2c を使用した偽共有の検出

perf c2c コマンドを使用して、偽共有を検出できます。

前提条件

手順

  1. perf.data ファイルを開きます。

    # perf c2c report --stdio

    これにより、端末で perf.data ファイルが開きます。

  2. Trace Event Information の表で、LLC Misses to Remote Cache (HITM) の値を含む行を見つけます。

    LLC Misses to Remote Cache (HITM) 行の値列のパーセンテージは、変更されたキャッシュラインにおいて NUMA ノード全体で発生していた LLC ミスのパーセンテージを表すものであり、偽共有が発生したことを示す重要な指標です。

    =================================================
                Trace Event Information
    =================================================
      Total records                     :     329219
      Locked Load/Store Operations      :      14654
      Load Operations                   :      69679
      Loads - uncacheable               :          0
      Loads - IO                        :          0
      Loads - Miss                      :       3972
      Loads - no mapping                :          0
      Load Fill Buffer Hit              :      11958
      Load L1D hit                      :      17235
      Load L2D hit                      :         21
      Load LLC hit                      :      14219
      Load Local HITM                   :       3402
      Load Remote HITM                  :      12757
      Load Remote HIT                   :       5295
      Load Local DRAM                   :        976
      Load Remote DRAM                  :       3246
      Load MESI State Exclusive         :       4222
      Load MESI State Shared            :          0
      Load LLC Misses                   :      22274
      LLC Misses to Local DRAM          :        4.4%
      LLC Misses to Remote DRAM         :       14.6%
      LLC Misses to Remote cache (HIT)  :       23.8%
      LLC Misses to Remote cache (HITM) : 57.3%
      Store Operations                  :     259539
      Store - uncacheable               :          0
      Store - no mapping                :         11
      Store L1D Hit                     :     256696
      Store L1D Miss                    :       2832
      No Page Map Rejects               :       2376
      Unable to parse data source       :          1
  3. Shared Data Cache Line TableLLC Load Hitm フィールドの Rmt 列を確認します。

    =================================================
                 Shared Data Cache Line Table
    =================================================
      #
      #                              Total      Rmt  ----- LLC Load Hitm -----  ---- Store Reference ----  --- Load Dram ----      LLC    Total  ----- Core Load Hit -----  -- LLC Load Hit --
      # Index           Cacheline  records     Hitm    Total      Lcl      Rmt    Total    L1Hit   L1Miss       Lcl       Rmt  Ld Miss    Loads       FB       L1       L2       Llc       Rmt
      # .....  ..................  .......  .......  .......  .......  .......  .......  .......  .......  ........  ........  .......  .......  .......  .......  .......  ........  ........
      #
            0            0x602180   149904   77.09%    12103     2269     9834   109504   109036      468       727      2657    13747    40400     5355    16154        0      2875       529
            1            0x602100    12128   22.20%     3951     1119     2832        0        0        0        65       200     3749    12128     5096      108        0      2056       652
            2  0xffff883ffb6a7e80      260    0.09%       15        3       12      161      161        0         1         1       15       99       25       50        0         6         1
            3  0xffffffff81aec000      157    0.07%        9        0        9        1        0        1         0         7       20      156       50       59        0        27         4
            4  0xffffffff81e3f540      179    0.06%        9        1        8      117       97       20         0        10       25       62       11        1        0        24         7

    この表は、キャッシュラインごとに検出されたリモート Hitm の量が多い順に並べ替えられます。LLC Load Hitm セクションの Rmt 列の数値が大きい場合は、偽共有を示しており、偽共有アクティビティーをデバッグするには、それが発生したキャッシュラインをさらに検査する必要があります。

第18章 flamegraphs の使用

システム管理者は、flamegraphs を使用して、perf ツールで記録されたシステムパフォーマンスデータの視覚化を作成できます。ソフトウェア開発者は、flamegraphs を使用して、perf ツールで記録されたアプリケーションパフォーマンスデータの視覚化を作成できます。スタックトレースのサンプリングは、perf ツールを使用して CPU パフォーマンスをプロファイリングするための一般的な方法です。ただし、perf を使用したプロファイリングスタックトレースの結果は、極めて詳細にわたるので、分析の工数がかなりかかる可能性があります。flamegraphs は、perf で記録されたデータから作成された視覚化で、より早く、簡単にホットコードパスを特定できるようにします。

18.1. flamegraphs のインストール

flamegraphs の使用を開始するには、必要なパッケージをインストールする必要があります。

手順

  • flamegraphs パッケージをインストールします。

    # dnf install js-d3-flame-graph

18.2. システム全体でのフレームグラフの作成

flamegraphs を使用すると、システム全体で記録されたパフォーマンスデータを視覚化できます。

前提条件

手順

  • データを記録し、視覚化を作成します。

    # perf script flamegraph -a -F 99 sleep 60

    このコマンドは、sleep コマンドで指定されているように、システム全体のパフォーマンスデータを 60 秒間サンプリングして記録し、現在のアクティブディレクトリーに flamegraph.html として保存される視覚化を作成します。このコマンドは、デフォルトでコールグラフデータをサンプリングし、perf ツールと同じ引数を取ります。この例では、次の引数が指定されています。

    -a
    システム全体でデータを記録するように調整します。
    -F
    1 秒あたりのサンプリング頻度を設定します。

検証

  • 分析するには、生成された視覚化を表示します。

    # xdg-open flamegraph.html

    このコマンドにより、デフォルトのブラウザーで視覚化が開きます。

flamegraph allcpus

18.3. 特定プロセスにおけるフレームグラフの作成

flamegraphs を使用して、特定の実行中のプロセスで記録されたパフォーマンスデータを視覚化できます。

前提条件

手順

  • データを記録し、視覚化を作成します。

    # perf script flamegraph -a -F 99 -p ID1,ID2 sleep 60

    このコマンドは、sleep コマンドで指定されているように、プロセス ID が ID1 および ID2 のプロセスのパフォーマンスデータを 60 秒間サンプリングして記録し、現在のアクティブディレクトリーに flamegraph.html として保存される視覚化を作成します。このコマンドは、デフォルトでコールグラフデータをサンプリングし、perf ツールと同じ引数を取ります。この例では、次の引数が指定されています。

    -a
    システム全体でデータを記録するように調整します。
    -F
    1 秒あたりのサンプリング頻度を設定します。
    -p
    特定のプロセス ID をシュミュレートし、データをサンプリングして記録します。

検証

  • 分析するには、生成された視覚化を表示します。

    # xdg-open flamegraph.html

    このコマンドにより、デフォルトのブラウザーで視覚化が開きます。

flamegraph

18.4. flamegraphs の解釈

flamegraph 内の各ボックスは、スタック内の異なる機能を表します。y-axis はスタックの深さを示しています。各スタックの一番上のボックスは、実際に CPU 上で実行されていた関数です。その下にあるものは、すべてその関数の呼び出し元です。x-axis は、サンプリングされたコールグラフデータの母集団を示します。

特定の行にあるスタックの子要素は、x-axis に沿って、各関数のサンプル数が多い順に表示されます。x-axis は時間の経過を表すものではありません。ボックスが広いほど、データがサンプリングされていたときに、CPU 上または CPU 上の一部での頻度が高いことを意味します。

手順

  • これまで表示されていなかった関数の名前を表示し、データをさらに調査するには、フレームグラフ内のボックスをクリックして、その箇所のスタックを拡大します。

    拡大したフレームグラフ
  • フレームグラフのデフォルトの表示に戻るには、Reset Zoom をクリックします。

    重要

    フレームグラフでは、ユーザー空間関数を表すボックスに Unknown と表示されることがあります。これは関数のバイナリーから一部の情報が取り除かれているためです。実行可能ファイルの debuginfo パッケージがインストールされている必要があります。また、実行可能ファイルがローカルで開発したアプリケーションである場合は、アプリケーションをデバッグ情報を付きでコンパイルする必要があります。このような場合に関数名またはシンボルを表示するには、GCC の -g オプションを使用してください。

    flamegraph

システムで実行されている特定のプロセスまたはアプリケーションの一部のパフォーマンスのボトルネックを監視するために、perf ツールを使用してデータのイベント固有のスナップショットを取得する循環バッファーを作成できます。このような場合には、perf は、指定されたイベントが検出されると、後で分析するために perf.data ファイルにデータのみを書き込みます。

19.1. perf を使用した循環バッファーおよびイベント固有のスナップショット

perf を使用してプロセスやアプリケーションのパフォーマンス問題を調査する際、注目している特定のイベントが発生する前の何時間にもわたってデータを記録することは、リソースの面で現実的でなかったり、調査方法として適切でなかったりする場合があります。このような場合は、perf record を使用して、特定のイベントの後にスナップショットを取得するカスタムの循環バッファーを作成できます。

--overwrite オプションを指定すると、perf record はすべてのデータを上書き可能な循環バッファーに保存します。バッファーがいっぱいになると、perf record は最も古いレコードを自動的に上書きします。そのため、上書きされたレコードが perf.data ファイルに書き込まれることはありません。

--overwrite および --switch-output-event オプションを一緒に使用すると、--switch-output-event トリガーイベントが検出されるまでデータを継続的に記録およびダンプする循環バッファーが設定されます。トリガーイベントは、ユーザーにとって重要なイベントが発生したことを perf record に通知し、循環バッファー内のデータを perf.data ファイルに書き込みます。これにより、ユーザーにとって重要な特定のデータが収集されると同時に、不要なデータを perf.data ファイルに書き込まないことで、実行中の perf プロセスのオーバーヘッドが削減されます。

perf ツールを使用すると、循環バッファーを作成できます。循環バッファーは、ユーザーにとって重要なデータのみを収集するために指定したイベントによってトリガーされます。イベント固有のデータを収集する循環バッファーを作成するには、perf--overwrite および --switch-output-event オプションを使用します。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。
  • 監視対象とするプロセスまたはアプリケーション内の対象の場所に uprobe を配置した。

    # perf probe -x </path/to/executable> -a function
    
    Added new event:
      probe_executable:function   (on function in /path/to/executable)
    
    You can now use it in all perf tools, such as:
    
        perf record -e probe_executable:function -aR sleep 1

手順

  • uprobe をトリガーイベントとして循環バッファーを作成します。

    # perf record --overwrite -e cycles --switch-output-event probe_executable:function ./executable
    [ perf record: dump data: Woken up 1 times ]
    [ perf record: Dump perf.data.2021021012231959 ]
    [ perf record: dump data: Woken up 1 times ]
    [ perf record: Dump perf.data.2021021012232008 ]
    ^C[ perf record: dump data: Woken up 1 times ]
    [ perf record: Dump perf.data.2021021012232082 ]
    [ perf record: Captured and wrote 5.621 MB perf.data.<timestamp> ]

    このコマンドは、実行可能ファイルを起動し、--switch-output-event オプションの後に指定されたトリガーイベントである uprobeperf が検出するまで、-e オプションの後に指定された CPU サイクルを収集します。この時点で、perf は循環バッファーにあるすべてのデータのスナップショットを取得し、タイムスタンプで識別される一意の perf.data ファイルに保存します。この例では、合計 2 つのスナップショットが生成されました。最後の perf.data ファイルは、Ctrl+C を押して強制的に生成したものです。

第20章 perf を再起動せずに perf コレクターを使用してトレースポイントを管理する方法

コントロールパイプインターフェイスを使用して、実行中の perf コレクターで異なるトレースポイントを有効化および無効化することで、perf を停止または再起動せずに、収集するデータを動的に調整できます。これにより、プロセスの停止または再起動中に記録されたはずのパフォーマンスデータが失われることはありません。

制御パイプインターフェイスを使用して実行中の perf コレクターにトレースポイントを追加し、記録するデータを調整します。perf を停止する必要がないため、パフォーマンスデータが失われません。

前提条件

  • perf ユーザー空間ツールがインストールされている。詳細は、perf のインストール を参照してください。

手順

  1. 制御パイプインターフェイスを設定します。

    # mkfifo control ack perf.pipe
  2. コントロールファイル設定と、有効にするイベントで perf record を実行します。

    # perf record --control=fifo:control,ack -D -1 --no-buffering -e 'sched:*' -o - > perf.pipe

    この例では、-e オプションの後に 'sched:*' を宣言すると、スケジューラーイベントで perf record が開始されます。

  3. 2 つ目の端末で、制御パイプの読み取り側を起動します。

    # cat perf.pipe | perf --no-pager script -i -
  4. コントロールパイプの読み取り側を起動すると、最初の端末で以下のメッセージがトリガーされます。

    Events disabled
  5. 3 番目のターミナルで、制御ファイルを使用してトレースポイントを有効にします。

    # echo 'enable sched:sched_process_fork' > control

    このコマンドは perf をトリガーし、宣言されたイベントについて制御ファイル内の現在のイベントリストをスキャンします。イベントが存在する場合は、トレースポイントが有効になり、次のメッセージが最初の端末に表示されます。

    event sched:sched_process_fork enabled
  6. トレースポイントを有効にすると、2 番目のターミナルにトレースポイントを検出した perf からの出力が表示されます。

    bash 33349 [034] 149587.674295: sched:sched_process_fork: comm=bash pid=33349 child_comm=bash child_pid=34056

制御パイプインターフェイスを使用して実行中の perf コレクターからトレースポイントを削除し、収集するデータの範囲を縮小します。perf を停止する必要がないため、パフォーマンスデータが失われません。

前提条件

手順

  • トレースポイントを削除します。

    # echo 'disable sched:sched_process_fork' > control

    この例では、以前にスケジューラーイベントをコントロールファイルに読み込み、トレースポイント sched:sched_process_fork を有効にしていることを前提としています。

    このコマンドは perf をトリガーし、宣言されたイベントについて制御ファイル内の現在のイベントリストをスキャンします。イベントが存在する場合は、トレースポイントが無効になり、制御パイプの設定に使用する端末に以下のメッセージが表示されます。

    # event sched:sched_process_fork disabled

第21章 Web コンソールを使用したシステムパフォーマンスの最適化

以下では、RHEL Web コンソールでパフォーマンスプロファイルを設定し、選択したタスクに対してシステムのパフォーマンスを最適化できます。

21.1. Web コンソールでのパフォーマンスチューニングオプション

Red Hat Enterprise Linux は、以下のシステムを最適化するためのパフォーマンスプロファイルを提供します。

  • デスクトップを使用するシステム
  • スループットパフォーマンス
  • レイテンシーパフォーマンス
  • ネットワークパフォーマンス
  • 低消費電力
  • 仮想マシン

TuneD サービスは、選択したプロファイルに一致するようにシステムオプションを最適化します。Web コンソールでは、システムのパフォーマンスプロファイルを設定できます。

21.2. Web コンソールでのパフォーマンスプロファイルの設定

実行するタスクに応じて、Web コンソールを使用して適切なパフォーマンスプロファイルを設定することでシステムパフォーマンスを最適化できます。

前提条件

手順

  1. RHEL 10 Web コンソールにログインします。
  2. Overview をクリックします。
  3. Configuration セクションで、現在のパフォーマンスプロファイルをクリックします。

    Performance profile in the Overview pane of the web console

  4. Change performance profile ダイアログボックスで、必要なプロファイルを設定します。
  5. Change profile をクリックします。

21.3. Web コンソールを使用したローカルシステムのパフォーマンスの監視

RHEL Web コンソールは、トラブルシューティングに Utilization Saturation および Errors (USE) メソッドを使用します。新しいパフォーマンスメトリックページには、データの履歴ビューが時系列に整理されており、最新のデータが上部に表示されます。Metrics and history ページでは、イベント、エラー、リソースの使用率と飽和状態のグラフィカル表示を表示できます。

前提条件

  • RHEL 10 Web コンソールがインストールされている。

    手順は、Web コンソールのインストールおよび有効化 を参照してください。

  • cockpit-pcp パッケージがインストールされている。
  • Performance Co-Pilot (PCP) サービス pmlogger.servicepmproxy.service が有効になっていて実行されている。

手順

  1. RHEL 10 Web コンソールにログインします。
  2. Overview をクリックします。
  3. Usage セクションで、View metrics and history をクリックします。

    Web コンソールの Overview ペインでメトリクスを表示する

    Metrics and history セクションが開きます。現在のシステム設定と使用状況: ユーザーが指定した時間間隔で、グラフ形式のパフォーマンスメトリクスが表示されます。

21.4. Web コンソールと Grafana を使用して複数のシステムのパフォーマンスを監視する

Grafana を使用すると、一度に複数のシステムからデータを収集し、収集した Performance Co-Pilot (PCP) メトリックのグラフィカル表現を確認できます。Web コンソールインターフェイスで、複数のシステムのパフォーマンスメトリックの監視およびエクスポートを設定できます。

前提条件

  • RHEL 10 Web コンソールがインストールされている。

    手順は、Web コンソールのインストールおよび有効化 を参照してください。

  • cockpit-pcp パッケージがインストールされている。
  • Performance Co-Pilot (PCP) サービス pmlogger.servicepmproxy.service が有効になっていて実行されている。
  • Grafana ダッシュボードが設定されている。詳細は、grafana-server の設定 を参照してください。
  • valkey パッケージがインストールされている。

    または、手順の後半で Web コンソールインターフェイスからパッケージをインストールすることもできます。

手順

  1. RHEL 10 Web コンソールにログインします。
  2. Overview ページで、Usage テーブルの View metrics and history をクリックします。
  3. Metrics settings ボタンをクリックします。
  4. Export to network スライダーをアクティブな位置に移動します。

    valkey パッケージがインストールされていない場合は、Web コンソールでインストールするように求められます。

  5. pmproxy サービスを開くには、ドロップダウンリストからゾーンを選択し、Add pmproxy ボタンをクリックします。
  6. Save をクリックします。

検証

  1. Networking をクリックします。
  2. Firewall テーブルで、Edit rules and zones ボタンをクリックします。
  3. 選択したゾーンで pmproxy を検索します。

    重要

    パフォーマンスを監視するすべてのシステムでこの手順を繰り返してください。

第22章 BPF Compiler Collection を使用したシステムパフォーマンスの分析

BPF Compiler Collection (BCC) は、Berkeley Packet Filter (BPF) の機能を組み合わせてシステムパフォーマンスを分析します。BPF を使用すると、カーネル内でカスタムプログラムを安全に実行して、パフォーマンス監視、トレース、およびデバッグ用のシステムイベントとデータにアクセスできます。BCC は、ユーザーがシステムから重要な詳細情報を抽出するための BPF プログラムの開発とデプロイを、ツールとライブラリーを使用して簡素化します。

22.1. bcc-tools パッケージのインストール

BPF Compiler Collection (BCC) ライブラリーと関連ツールを取得するには、bcc-tools パッケージをインストールします。

手順

  • bcc-tools をインストールします。

    # dnf install bcc-tools

    BCC ツールは、/usr/share/bcc/tools/ ディレクトリーにインストールされます。

検証

  • インストールされたツールを調べます。

    # ls -l /usr/share/bcc/tools/

    インストールされているツールのリストが表示されます。リスト内の doc ディレクトリーには、各ツールのドキュメントがあります。

22.2. execsnoop を使用したシステムプロセスの調査

BCC スイートの execsnoop ツールは、新しいプロセス実行イベントをリアルタイムで取得して表示します。これは、システム上で実行されているコマンドやバイナリーを監視し、デバッグ、監査、セキュリティー監視を行うのに役立ちます。

手順

  1. 1 つのターミナルで execsnoop プログラムを実行します。

    # /usr/share/bcc/tools/execsnoop
  2. ls コマンドの短期的なプロセスを作成するために、別のターミナルで次のように入力します。

    $ ls /usr/share/bcc/tools/doc/

    execsnoop を実行している端末に、次のような出力が表示されます。

    PCOMM	PID    PPID   RET ARGS
    ls   	8382   8287     0 /usr/bin/ls --color=auto /usr/share/bcc/tools/doc/

    execsnoop プログラムは、システムリソースを消費する新しいプロセスごとに 1 つの行を出力します。また、ls などの非常に短期間に実行されるプログラムのプロセスを検出します。なお、ほとんどの監視ツールはそれらを登録しません。execsnoop 出力には以下のフィールドが表示されます。

    PCOMM
    親プロセス名。(ls)
    PID
    プロセス ID。(8382)
    PPID
    親プロセス ID。(8287)
    RET
    新しいプロセスにプログラムコードをロードする exec() システムコールの戻り値 (0)。
    ARGS

    引数を使用して起動したプログラムの場所。

    詳細は、システム上の /usr/share/bcc/tools/doc/execsnoop_example.txt ファイルと exec(3) man ページを参照してください。

22.3. opensnoop を使用してコマンドによって開かれたファイルを追跡する

BCC (BPF Compiler Collection) の opensnoop ツールを使用すると、特定のコマンドによるファイルアクセスをリアルタイムで監視および記録できます。これは、アプリケーションの実行時の動作をデバッグ、監査、または理解するのに役立ちます。

手順

  1. 1 つのターミナルで opensnoop プログラムを実行し、uname コマンドのプロセスによってのみ開かれたファイルを出力します。

    # /usr/share/bcc/tools/opensnoop -n uname
  2. 別のターミナルで、特定のファイルを開くコマンドを入力します。

    $ uname
    The terminal running opensnoop shows the output similar to the following:
    PID    COMM 	FD ERR PATH
    8596   uname 	3  0   /etc/ld.so.cache
    8596   uname 	3  0   /lib64/libc.so.6
    8596   uname 	3  0   /usr/lib/locale/locale-archive
    ...

    opensnoop プログラムは、システム全体の open() システムコールを監視し、その過程で uname が開こうとしたファイルごとに行を出力します。opensnoop の出力には次のフィールドが表示されます。

    PID
    プロセス ID。(8596)
    COMM
    プロセス名。(uname)
    FD
    ファイル記述子 - 開いているファイルを参照するために open() が返す値。(3)
    ERR
    すべてのエラー。
    PATH

    open() が開こうとしたファイルの場所。

    コマンドが存在しないファイルを読み取ろうとすると、FD 列に -1 が返され、ERR 列に関連するエラーに対応する値が出力されます。opensnoop を使用すると、正常に動作しないアプリケーションを特定できます。詳細は、システム上の /usr/share/bcc/tools/doc/opensnoop_example.txt ファイルと open(2) man ページを参照してください。

22.4. biotop を使用して、ディスク上で I/O 操作を実行している上位のプロセスを監視する

biotop ツールは、最も多くのディスク I/O アクティビティーを生成するプロセスをリアルタイムで表示します。このユーティリティーは、ディスクの読み取りや書き込みを頻繁に行うアプリケーションを特定できるため、パフォーマンスの監視やトラブルシューティングに役立ちます。

手順

  1. 1 つのターミナルで、引数として 30 を指定して biotop プログラムを実行し、30 秒のサマリーを生成します。

    # /usr/share/bcc/tools/biotop 30

    引数を指定しない場合、出力画面がデフォルトで 1 秒ごとに更新されます。

  2. 別のターミナルで、次のコマンドを入力して、ローカルハードディスクデバイスからコンテンツを読み取り、出力を /dev/zero ファイルに書き込みます。

    # dd if=/dev/vda of=/dev/zero

    このステップでは、biotop の機能がわかるように、特定の I/O トラフィックを生成します。biotop を実行しているターミナルには、次のような出力が表示されます。

    PID    COMM             D MAJ MIN DISK       I/O  Kbytes     AVGms
    9568   dd               R 252 0   vda      16294 14440636.0  3.69
    48     kswapd0          W 252 0   vda       1763 120696.0    1.65
    7571   gnome-shell      R 252 0   vda        834 83612.0     0.33
    1891   gnome-shell      R 252 0   vda       1379 19792.0     0.15
    7515   Xorg             R 252 0   vda        280  9940.0     0.28
    7579   llvmpipe-1       R 252 0   vda        228  6928.0     0.19
    9515   gnome-control-c  R 252 0   vda         62  6444.0     0.43
    8112   gnome-terminal-  R 252 0   vda         67  2572.0     1.54
    7807   gnome-software   R 252 0   vda         31  2336.0     0.73
    9578   awk              R 252 0   vda         17  2228.0     0.66
    7578   llvmpipe-0       R 252 0   vda        156  2204.0     0.07
    9581   pgrep            R 252 0   vda         58  1748.0     0.42
    7531   InputThread      R 252 0   vda         30  1200.0     0.48
    7504   gdbus            R 252 0   vda          3  1164.0     0.30
    1983   llvmpipe-1       R 252 0   vda         39   724.0     0.08
    1982   llvmpipe-0       R 252 0   vda         36   652.0     0.06
    ...

    biotop 出力には、以下のフィールドが表示されます。

    PID
    プロセス ID。(9568)
    COMM
    プロセス名。(dd)
    DISK
    読み取り操作を実行するディスク。(vda)
    I/O
    実行された読み取り操作の数。(16294)
    Kbytes
    読み取り操作によって読み取られたキロバイト数。(14,440,636)
    AVGms

    読み取り操作の平均 I/O 時間。(3.69)

    詳細は、システム上の /usr/share/bcc/tools/doc/biotop_example.txt ファイルと dd(1) man ページを参照してください。

22.5. xfsslower を使用して予想以上に遅いファイルシステム操作を明らかにする

xfsslower は、XFS ファイルシステムによる読み取り、書き込み、オープン、または同期 (fsync) 操作の実行に費された時間を測定します。引数 1 を指定すると、1 ミリ秒よりも遅い操作のみが表示されます。

手順

  1. 1 つのターミナルで xfsslower プログラムを実行します。

    # /usr/share/bcc/tools/xfsslower 1

    引数を指定しない場合、xfsslower はデフォルトで 10 ミリ秒より遅い操作を表示します。

  2. 別のターミナルで、vim エディターでテキストファイルを作成するコマンドを入力して、XFS ファイルシステムとのやり取りを開始します。

    $ vim text
    The terminal running xfsslower shows something similar upon saving the file from the previous step:
    TIME     COMM           PID    T BYTES   OFF_KB   LAT(ms) FILENAME
    13:07:14 b'bash'        4754   R 256     0           7.11 b'vim'
    13:07:14 b'vim'         4754   R 832     0           4.03 b'libgpm.so.2.1.0'
    13:07:14 b'vim'         4754   R 32      20          1.04 b'libgpm.so.2.1.0'
    13:07:14 b'vim'         4754   R 1982    0           2.30 b'vimrc'
    13:07:14 b'vim'         4754   R 1393    0           2.52 b'getscriptPlugin.vim'
    13:07:45 b'vim'         4754   S 0       0           6.71 b'text'
    13:07:45 b'pool'        2588   R 16      0           5.58 b'text’
    ...

    各行は、特定のしきい値よりも時間がかかったファイルシステム内の操作を表しています。xfsslower は、操作に想定以上に時間がかかるなど、ファイルシステムで発生し得る問題を検出します。xfsslower の出力には次のフィールドが表示されます。

    COMM
    プロセス名。(b’bash')
    T

    操作の種類。(R)

    • Read
    • Write
    • Open
    • Sync
    OFF_KB
    ファイルオフセット (KB)。(0)
    FILENAME

    読み取り、書き込み、または同期されるファイル。

    詳細は、システム上の /usr/share/bcc/tools/doc/xfsslower_example.txt ファイルと fsync(2) man ページを参照してください。

第23章 CPU 使用率を最適化するためのオペレーティングシステムの設定

ワークロード全体で CPU 使用率を最適化するように、オペレーティングシステムを設定できます。

23.1. プロセッサーの問題を監視および診断するためのツール

以下は、プロセッサー関連のパフォーマンス問題を監視および診断するために Red Hat Enterprise Linux で使用できるツールです。

  • numactl ユーティリティーは、プロセッサーとメモリーのアフィニティーを管理するためのさまざまなオプションを提供します。numactl パッケージには、カーネルでサポートされている NUMA ポリシーへのシンプルなプログラミングインターフェイスを提供する libnuma ライブラリーが含まれています。このパッケージは、numactl アプリケーションよりもきめ細かいチューニングに使用できます。
  • numad は NUMA アフィニティーの自動管理デーモンです。システム内の NUMA トポロジーとリソース使用状況を監視し、NUMA リソースの割り当てと管理を動的に改善します。
  • numastat ツールは、オペレーティングシステムとそのプロセスに関する NUMA ノードごとのメモリー統計情報を表示し、プロセスのメモリーがシステム全体に分散されているか、特定のノードに集中しているかを管理者に示します。このツールは、numactl パッケージで提供されます。
  • pqos ユーティリティーは intel-cmt-cat パッケージで利用できます。最新の Intel プロセッサーで CPU キャッシュとメモリー帯域幅を監視します。以下の種類の情報を監視します。

    • サイクルあたりの命令数 (IPC)
    • ラストレベルキャッシュのミス (MISSES) 回数
    • 特定の CPU で実行されるプログラムが LLC 内で占めるキロバイト単位のサイズ
    • ローカルメモリーへの帯域幅 (MBL)
    • リモートメモリーへの帯域幅 (MBR)
  • /proc/interrupts ファイルには、次の種類の情報が表示されます。

    • 割り込み要求 (IRQ) の数
    • システム内の各プロセッサーによって処理された同様の割り込み要求の数
    • 送信された割り込みの種類
    • リストされた割り込み要求に応答するデバイスのコンマ区切りリスト
  • taskset ツールは、util-linux パッケージで提供されます。これを使用すると、管理者は実行中のプロセスのプロセッサーアフィニティーを取得および設定したり、指定したプロセッサーアフィニティーでプロセスを起動したりできます。
  • turbostat ツールは、指定した間隔でカウンターの結果を出力し、過剰な電力使用量、ディープスリープ状態に入れない、システム管理割り込み (SMI) が不必要に作成されるなど、サーバーでの予期しない動作を特定するのに役立ちます。
  • X86_energy_perf_policy ツールを使用すると、パフォーマンスと電力消費効率の相対的な重要性を定義できます。この情報は、パフォーマンスと電力消費効率の間でトレードオフするオプションを選択すると、この機能をサポートするプロセッサーに影響を与えるために使用できます。

23.2. システムトポロジーの種類

現代のコンピューティングにおいて、単一の CPU という考え方は誤解を招くものです。現代のほとんどのシステムは、複数のプロセッサーを搭載しているためです。システムのトポロジーとは、これらのプロセッサーを相互に、また他のシステムリソースにどのように接続するかという接続形態のことです。これは、システムとアプリケーションのパフォーマンス、およびシステムのチューニングに関する考慮事項に影響を及ぼす可能性があります。

現代のコンピューティングで使用されるトポロジーの主なタイプを以下に示します。

Symmetric Multi-Processor (SMP) トポロジー
SMP トポロジーにより、すべてのプロセッサーが同時にメモリーにアクセスできるようになります。ただし、共有および同等のメモリーアクセスは、本質的にすべての CPU からのメモリーアクセスをシリアライズするため、SMP システムのスケーリング制約が一般的に許容できないものとして表示されます。このため、最近のサーバーシステムはすべて NUMA マシンです。
Non-Uniform Memory Access (NUMA) トポロジー

NUMA トポロジーは、SMP トポロジーよりも最近開発されました。NUMA システムでは、複数のプロセッサーが 1 つのソケット上で物理的にグループ化されます。各ソケットには専用のメモリー領域があります。そのソケット上のプロセッサーはこのメモリーにローカルにアクセスできます。ソケット、そのメモリー、および関連するプロセッサーを合わせたものが、ノードと呼ばれます。同じノード上のプロセッサーは、そのノードのメモリーバンクには高速でアクセスできますが、他のノードのメモリーバンクへのアクセスはより低速になります。

そのため、ローカル以外のメモリーにアクセスするとパフォーマンスが低下します。したがって、NUMA トポロジーを使用するシステム上のパフォーマンスに敏感なアプリケーションは、アプリケーションを実行するプロセッサーと同じノードにあるメモリーにアクセスする必要があり、可能な限りリモートメモリーにアクセスしないようにしてください。

パフォーマンスに敏感するマルチスレッドアプリケーションは、特定のプロセッサーではなく特定の NUMA ノードで実行されるように設定することで、メリットが得られます。これが適切なかどうかは、システムやアプリケーションの要件によって異なります。

  • 複数のアプリケーションスレッドが同じキャッシュされたデータにアクセスする場合、同じプロセッサーでこれらのスレッドを実行するように設定することが適切な場合があります。
  • 異なるデータにアクセスしてキャッシュする複数のスレッドが同じプロセッサー上で実行される場合、各スレッドが前のスレッドによってアクセスされたキャッシュデータを追い出す可能性があります。これは、各スレッドがキャッシュを '失い'、メモリーからデータをフェッチし、これをキャッシュで置き換えていることを意味します。perf ツールを使用して、過剰な数のキャッシュミスをチェックします。

23.3. システムトポロジーの表示

いくつかのコマンドを使用することで、システムのトポロジーを理解できます。

手順

  • システムトポロジーの概要を表示するには、以下のコマンドを実行します。

    $ numactl --hardware
    available: 4 nodes (0-3)
    node 0 cpus: 0 4 8 12 16 20 24 28 32 36
    node 0 size: 65415 MB
    node 0 free: 43971 MB
    [...]
  • CPU 数、スレッド数、コア数、ソケット数、NUMA ノード数などの CPU アーキテクチャーに関する情報を収集するには、以下を実行します。

    $ lscpu
    Architecture:          x86_64
    CPU op-mode(s):        32-bit, 64-bit
    Byte Order:            Little Endian
    CPU(s):                40
    On-line CPU(s) list:   0-39
    Thread(s) per core:    1
    Core(s) per socket:    10
    Socket(s):             4
    NUMA node(s):          4
    Vendor ID:             GenuineIntel
    CPU family:            6
    Model:                 47
    Model name:            Intel(R) Xeon(R) CPU E7- 4870  @ 2.40GHz
    Stepping:              2
    CPU MHz:               2394.204
    BogoMIPS:              4787.85
    Virtualization:        VT-x
    L1d cache:             32K
    L1i cache:             32K
    L2 cache:              256K
    L3 cache:              30720K
    NUMA node0 CPU(s):     0,4,8,12,16,20,24,28,32,36
    NUMA node1 CPU(s):     2,6,10,14,18,22,26,30,34,38
    NUMA node2 CPU(s):     1,5,9,13,17,21,25,29,33,37
    NUMA node3 CPU(s):     3,7,11,15,19,23,27,31,35,39
  • システムのグラフィカル表現を表示するには、以下のコマンドを実行します。

    # dnf install hwloc-gui
    # lstopo
    lstopo の出力
  • 詳細なテキスト出力を表示するには、次のコマンドを実行します。

    # dnf install hwloc
    # lstopo-no-graphics
    Machine (15GB)
      Package L#0 + L3 L#0 (8192KB)
        L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
            PU L#0 (P#0)
            PU L#1 (P#4)
           HostBridge L#0
        PCI 8086:5917
            GPU L#0 "renderD128"
            GPU L#1 "controlD64"
            GPU L#2 "card0"
        PCIBridge
            PCI 8086:24fd
              Net L#3 "wlp61s0"
        PCIBridge
            PCI 8086:f1a6
        PCI 8086:15d7
    Net L#4 "enp0s31f6"

23.4. カーネルティック時間の設定

デフォルトでは、Red Hat Enterprise Linux はティックレスカーネルを使用します。ティックレスカーネルはアイドル状態の CPU に割り込みを行わないため、電力使用量が削減され、新しいプロセッサーがディープスリープ状態を利用できるようになります。Red Hat Enterprise Linux には動的ティックレスオプションもあります。これは、ハイパフォーマンスコンピューティングやリアルタイムコンピューティングなど、レイテンシーの影響を受けやすいワークロードに役立ちます。デフォルトでは、動的ティックレスオプションは無効になっています。TuneD プロファイルの cpu-partitioning を使用すると、isolated_cores として指定されたコアに対して動的ティックレスオプションを有効にできます。

手順

  1. 特定のコアで動的なティックレス動作を有効にするには、nohz_full パラメーターを使用して、カーネルコマンドラインでこれらのコアを指定します。たとえば、16 コアのシステムでは、nohz_full=1-15 カーネルオプションを有効にします。

    # grubby --update-kernel=ALL --args="nohz_full=1-15"

    これにより、コア 1 から 15 までの動的なティックレス動作が有効になり、すべての時間管理が未指定のコアのみに移動します (コア 0)。

  2. システムが起動したら、rcu スレッドをレイテンシーを区別しないコア (この場合は core 0) に手動で移動します。

    # for i in pgrep rcu[^c] ; do taskset -pc 0 $i ; done
  3. オプション: カーネルコマンドラインで isolcpus パラメーターを使用して、特定のコアをユーザー空間タスクから分離します。
  4. オプション: カーネルのライトバック bdi-flush スレッドの CPU アフィニティーをハウスキーピングコアに設定します。

    echo 1 > /sys/bus/workqueue/devices/writeback/cpumask

検証

  • システムを再起動したら、dynticks が有効になっていることを確認します。

    # journalctl -xe | grep dynticks
    Mar 15 18:34:54 rhel-server kernel: NO_HZ: Full dynticks CPUs: 1-15.
  • 動的ティックレス設定が正しく機能していることを確認します。

    # perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 sleep 3

    このコマンドは、CPU 1 に 3 秒間スリープするように指示しながら、CPU 1 のティックを測定します。デフォルトのカーネルタイマーの設定では、通常の CPU で 3100 ティックが表示されます。

    # perf stat -C 0 -e irq_vectors:local_timer_entry taskset -c 0 sleep 3
    
     Performance counter stats for 'CPU(s) 0':
    
                 3,107      irq_vectors:local_timer_entry
    
      3.001342790 seconds time elapsed

    動的ティックレスカーネルを設定すると、代わりに 4 ティックが表示されるはずです。

    # perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 sleep 3
    
     Performance counter stats for 'CPU(s) 1':
    
                     4      irq_vectors:local_timer_entry
    
           3.001544078 seconds time elapsed

23.5. 割り込み要求の概要

割り込み要求 (IRQ) は、ハードウェアからプロセッサーに送信される、即時の対応を要求するシグナルです。システム内の各デバイスには 1 つ以上の IRQ 番号が割り当てられます。これにより固有の割り込みを送信できるようになります。割り込みが有効な場合、プロセッサーは割り込み要求を受信すると、割り込み要求に対応するために、現在のアプリケーションスレッドの実行を直ちに一時停止します。

割り込みにより通常の動作が停止するため、割り込み頻度が高いとシステムパフォーマンスが著しく低下する可能性があります。割り込みアフィニティーを設定するか、優先度の低い割り込みを一括して送信する (複数の割り込みをまとめる) ことによって、割り込みにかかる時間を短縮できます。

割り込み要求には、smp_affinity という関連するアフィニティープロパティーがあります。これは、割り込み要求を処理するプロセッサーを定義するものです。アプリケーションのパフォーマンスを向上させ、特定の割り込みスレッドとアプリケーションスレッドがキャッシュラインを共有できるように、次の改善策を実施できます。

  • 割り込みアフィニティーを割り当てる。
  • 同じプロセッサーまたは同じコア上のプロセッサーへのプロセスアフィニティー。

割り込みステアリングに対応するシステムでは、割り込み要求の smp_affinity プロパティーを変更するとハードウェアが設定され、カーネルを介入することなくハードウェアレベルで特定のプロセッサーに割り込みを処理させる決定が行われるようになります。

23.6. 割り込みの手動分散

BIOS が NUMA トポロジーをエクスポートする場合、irqbalance サービスは、サービスを要求するハードウェアに対してローカルとなるノードで割り込み要求を自動的に処理できます。

手順

  1. 設定する割り込み要求に対応するデバイスを確認します。
  2. プラットフォームのハードウェア仕様を見つけます。システムのチップセットが割り込みの分散に対応しているかどうかを確認します。

    • チップセットが分散をサポートしている場合は、次の手順に従って割り込みの配信を設定できます。また、チップセットが割り込みの分散に使用するアルゴリズムを確認してください。BIOS によっては割り込み配信を設定するオプションがあります。
    • チップセットが分散をサポートしていない場合は、チップセットは常にすべての割り込みを単一の静的 CPU にルーティングします。使用される CPU を設定することはできません。
  3. システムでどの Advanced Programmable Interrupt Controller (APIC) モードが使用されているかを確認します。

    $ journalctl --dmesg | grep APIC
    • システムで flat 以外のモードが使用されている場合は、Setting APIC routing to physical flat のような行が表示されます。
    • このようなメッセージが表示されない場合は、システムが flat モードを使用します。
    • システムが x2apic モードを使用する場合は、ブートローダー設定のカーネルコマンドラインに nox2apic オプションを追加してこれを無効にできます。

      非物理フラットモード (flat) だけが、複数の CPU への割り込み分散をサポートしています。このモードは、CPU が 8 個以下のシステムでのみ使用できます。

  4. smp_affinity マスクを計算します。smp_affinity マスクの計算方法の詳細は、smp_affinity マスクの設定 を参照してください。

23.7. smp_affinity マスクの設定

smp_affinity の値は、システム内のすべてのプロセッサーを表す 16 進数のビットマスクとして保存されます。各ビットは異なる CPU を設定します。最も大きなビットは CPU 0 です。マスクのデフォルト値は f で、割り込み要求をシステム内のどのプロセッサーでも処理できることを意味します。この値を 1 に設定すると、割り込み要求を処理できるのがプロセッサー 0 だけになります。

手順

  1. バイナリーで、割り込みを処理する CPU に値 1 を使用します。たとえば、CPU 0 と CPU 7 が割り込みを処理するように設定するには、バイナリーコードとして 0000000010000001 を使用します。

    Expand
    表23.1 CPU のバイナリービット

    CPU

    15

    14

    13

    12

    11

    10

    9

    8

    7

    6

    5

    4

    3

    2

    1

    0

    バイナリー

    0

    0

    0

    0

    0

    0

    0

    0

    1

    0

    0

    0

    0

    0

    0

    1

  2. バイナリーコードを 16 進数に変換します。

    たとえば、Python を使用してバイナリーコードを変換するには、次のコマンドを実行します。

    >>> hex(int('0000000010000001', 2))
    
    '0x81'

    プロセッサーが 32 個を超えるシステムでは、32 ビットグループごとに smp_affinity 値を区切る必要があります。たとえば、64 プロセッサーシステムの最初の 32 プロセッサーのみが割り込み要求を処理できるようにするには、0xffffffff,00000000 を使用します。

  3. 特定の割り込み要求の割り込みアフィニティー値は、関連付けられた /proc/irq/irq_number/smp_affinity ファイルに保存されます。このファイルで smp_affinity マスクを設定します。

    # echo mask > /proc/irq/irq_number/smp_affinity

第24章 tuna インターフェイスを使用したシステムの確認

tuna ツールは、チューニングタスクを実行する際の複雑さを軽減します。tuna を使用すると、スケジューラーの調整可能なパラメーターを調整したり、スレッドの優先度や IRQ ハンドラーを調整したり、CPU コアとソケットを分離したりできます。tuna を使用すると、次の操作を実行できます。

  • システム上の CPU の表示
  • 現在システム上で実行されている割り込み要求 (IRQ) のリスト表示
  • スレッドに関するポリシーおよび優先度の情報の変更
  • システムの現在のポリシーと優先度の表示

24.1. tuna ツールのインストール

tuna ツールは、稼働中のシステムで使用されるように設計されています。アプリケーション固有の測定ツールにより、変更後すぐにシステムパフォーマンスの分析を開始できます。

手順

  • tuna ツールをインストールします。

    # dnf install tuna

検証

  • 利用可能な tuna CLI オプションを表示します。

    # tuna -h

    詳細は、システム上の tuna(8) man ページを参照してください。

24.2. tuna ツールを使用したシステムの状態の表示

tuna コマンドラインインターフェイス (CLI) ツールを使用して、システムの状態を表示できます。

前提条件

手順

  1. 現在のポリシーおよび優先度を表示します。

    # tuna show_threads
    pid   SCHED_ rtpri affinity             cmd
    1      OTHER     0      0,1            init
    2       FIFO    99        0     migration/0
    3      OTHER     0        0     ksoftirqd/0
    4       FIFO    99        0      watchdog/0
  2. または、PID に対応する特定のスレッドやコマンド名に一致する特定のスレッドを表示します。

    # tuna show_threads -t pid_or_cmd_list

    pid_or_cmd_list 引数は、コンマ区切りの PID またはコマンド名パターンのリストです。

  3. 状況に応じて、次のいずれかの操作を実行します。

  4. 変更した設定を保存します。

    # tuna save filename

    このコマンドは、現在実行中のカーネルスレッドのみを保存します。実行していないプロセスは保存されません。

24.3. tuna ツールを使用した CPU のチューニング

tuna コマンドは個々の CPU を管理できます。tuna ツールを使用すると、次のアクションを実行できます。

Isolate CPUs
指定した CPU で実行しているすべてのタスクが、次に利用可能な CPU に移動します。CPU を分離すると、すべてのスレッドのアフィニティーマスクから CPU が削除され、CPU が利用できなくなります。
Include CPUs
指定された CPU でタスクを実行できるようにします。
Restore CPUs
指定した CPU を以前の設定に戻します。

前提条件

手順

  1. 現在実行中のすべてのプロセスをリスト表示します。

    # ps ax | awk 'BEGIN { ORS="," }{ print $1 }'
    PID,1,2,3,4,5,6,8,10,11,12,13,14,15,16,17,19
  2. tuna インターフェイスでスレッドリストを表示します。

    # tuna show_threads -t 'thread_list from above cmd'
  3. 状況に応じて、このコマンドを使用して、後述するいずれかの操作を実行してプロセスの CPU アフィニティーを管理します。

    # tuna [command] --cpus cpu_list
    • cpu_list 引数は、コンマ区切りの CPU 番号のリストです (例: --cpus 0,2)。
    • 現在の cpu_list に特定の CPU を追加するには、たとえば --cpus +0 を使用します。
  4. 状況に応じて、次のいずれかの操作を実行します。

    1. CPU を分離するには、次のように入力します。

      # tuna isolate --cpus cpu_list
    2. CPU を含めるには、次のように入力します。

      # tuna include --cpus cpu_list
  5. 4 つ以上のプロセッサーを搭載したシステムを使用する場合は、すべての ssh スレッドを CPU 01 で実行し、すべての http スレッドを CPU 23 で実行します。

    # tuna move --cpus 0,1 -t ssh*
    # tuna move --cpus 2,3 -t http\*

検証

  • 現在の設定を表示して、適用された変更を確認します。

    # tuna show_threads -t ssh*
    
    pid   SCHED_  rtpri  affinity   voluntary   nonvoluntary   cmd
    855   OTHER   0      0,1        23           15            sshd
    # tuna show_threads -t http\*
    pid   SCHED_  rtpri  affinity   voluntary   nonvoluntary   cmd
    855   OTHER   0       2,3        23           15           http

    詳細は、システム上の /proc/cpuinfo ファイルと tuna(8) man ページを参照してください。

24.4. tuna ツールを使用した IRQ のチューニング

/proc/interrupts ファイルには、IRQ ごとの割り込みの数、割り込みのタイプ、およびその IRQ にあるデバイスの名前が記録されます。

前提条件

手順

  1. 現在の IRQ とそれらのアフィニティーを表示します。

    # tuna show_irqs
    # users            affinity
    0 timer                   0
    1 i8042                   0
    7 parport0                0
  2. コマンドの影響を受ける IRQ のリストを指定します。

    # tuna <command> --irqs irq_list --cpus cpu_list
    • irq_list 引数は、コンマ区切りの IRQ 番号またはユーザー名パターンのリストです。
    • <command> は、たとえば --spread に置き換えます。
  3. 指定した CPU に割り込みを移動します。

    # tuna show_irqs --irqs <128>
    users            affinity
    128 iwlwifi           0,1,2,3
    
    # tuna move --irqs 128 --cpus 3
    • irq_list 引数を 128 に置き換え、cpu_list 引数を 3 に置き換えます。
    • cpu_list 引数は、コンマ区切りの CPU 番号のリストです (例: --cpus 0,2)。詳細は、tuna ツールを使用した CPU のチューニング を参照してください。

検証

  1. 選択した IRQ の状態を、割り込みを指定の CPU に移動してから比較します。

    # tuna show_irqs --irqs 128
         users            affinity
     128 iwlwifi                 3

    詳細は、システム上の /proc/interrupts ファイルと tuna(8) man ページを参照してください。

第25章 メモリーアクセスを最適化するためのオペレーティングシステムの設定

RHEL に含まれるツールを使用して、ワークロード全体のメモリーアクセスを最適化するようにオペレーティングシステムを設定できます。

25.1. システムメモリーの問題を監視および診断するツール

Red Hat Enterprise Linux では、システムパフォーマンスを監視し、システムメモリーに関連するパフォーマンスの問題を診断するために、次のツールを使用できます。

  • procps-ng パッケージに含まれる vmstat ツールは、システムのプロセス、メモリー、ページング、ブロック I/O、トラップ、ディスク、CPU アクティビティーのレポートを表示します。マシンが最後にオンになった時点から、または前回のレポート以降に発生したこれらのイベントの平均値を表示する即時レポートを生成します。
  • valgrind フレームワークは、ユーザー空間バイナリーへの計装を提供します。このフレームワークには、プログラムのパフォーマンスのプロファイリングと分析に使用できる次のようなツールが多数含まれています。

    • memcheck ツールは valgrind のデフォルトツールです。次のような、検出や診断が難しいさまざまなメモリーエラーを検出して報告します。

      • 無効なメモリーアクセス
      • 未定義または初期化されていない値の使用
      • 誤って解放されたヒープメモリー
      • ポインターの重複 (バッファーの重複)
      • メモリーリーク

        注記

        Memcheck はこれらのエラーを報告することしかできず、エラーの発生を防ぐことはできません。ただし、memcheck は、エラーが発生した場合すぐにエラーメッセージを記録します。

    • cachegrind ツールは、アプリケーションがシステムのキャッシュ階層および分岐予測器とどのようにやりとりするかをシミュレートします。アプリケーションの実行期間中の統計情報を収集し、コンソールに概要を表示します。
    • massif ツールは、指定されたアプリケーションによって使用されるヒープ領域を測定します。測定対象は、有用な領域および会計、調整用に割り当てられている追加領域の両方になります

      詳細は、システム上の /usr/share/doc/valgrind-version/valgrind_manual.pdf ファイルと vmstat(8) および valgrind(1) man ページを参照してください。

25.2. システムメモリーの概要

Linux カーネルは、システムメモリー (RAM) 内のリソースの使用率を最大化するように設計されています。このような設計上の特性により、またワークロードのメモリー要件に応じて、システムメモリーの一部がワークロードのためにカーネル内で使用され、メモリーのわずかな部分だけが空き状態のままになります。この空きメモリーは、特別なシステム割り当てやその他の低優先度または高優先度のシステムサービス用に予約されています。システムメモリーの残りの部分はワークロード専用であり、次の 2 つのカテゴリーに分けられます。

ファイルメモリー

このカテゴリーに追加されたページは、永続ストレージのファイルの一部を表します。このページは、ページキャッシュからのものであり、アプリケーションのアドレス空間にマッピングされたり、マッピング解除されたりします。アプリケーションでは、mmap システムコールを使用してファイルをアプリケーションのアドレス空間にマッピングしたり、バッファー付き I/O 読み取りまたは書き込みシステムコールを使用してファイルを操作したりすることができます。

バッファー付き I/O システムコールや、ページを直接マッピングするアプリケーションは、マッピングされていないページを再利用できます。その結果、カーネルは、同じページセットに対して負荷の高い I/O 操作が再発行されるのを避けるために、特にシステムがメモリーを大量に消費するタスクを実行していないときに、これらのページをキャッシュに保存します。

匿名メモリー
このカテゴリーのページは、動的に割り当てられたプロセスで使用されているか、永続ストレージのファイルに関連しません。この一連のページは、アプリケーションスタックやヒープ領域など、各タスクのメモリー内制御構造をバックアップします。
メモリー使用状況パターン

25.3. 仮想メモリーパラメーター

仮想メモリーのパラメーターは、/proc/sys/vm ディレクトリーにリスト表示されます。利用可能な仮想メモリーパラメーターを以下に示します。

vm.dirty_ratio
パーセンテージの値。変更された合計システムメモリーの割合がこの値に達すると、システムがディスクへの変更の書き込みを開始します。デフォルト値は 20 パーセントです。
vm.dirty_background_ratio
パーセンテージの値。システムメモリー合計の割合がこの値を超えると、システムはバックグラウンドでディスクへの変更の書き込みを開始します。デフォルト値は 10 パーセントです。
vm.overcommit_memory
大量メモリーの要求を許可するか拒否するか決定する条件を定義します。デフォルト値は 0 です。デフォルトでは、カーネルは仮想メモリー割り当て要求が現在のメモリー量 (合計 + スワップ) に収まるかどうかを確認し、大きな要求のみを拒否します。要求が大きくないと判断された場合、仮想メモリーの割り当てが許可され、メモリーのオーバーコミットが発生する可能性があります。
overcommit_memory パラメーターの値の設定
  • このパラメーターを 1 に設定すると、カーネルはメモリーのオーバーコミット処理を実行しません。これにより、メモリーがオーバーロードする可能性が向上しますが、メモリー集中型タスクのパフォーマンスが向上します。
  • このパラメーターを 2 に設定すると、カーネルは、使用可能なスワップ領域の合計と overcommit_ratio で指定された物理 RAM の割合を足した値以上のメモリー要求を拒否します。この設定により、メモリーのオーバーコミットのリスクが軽減されます。この設定は、スワップパーティションが物理メモリーよりも大きいシステムでのみ使用してください。
vm.overcommit_ratio
overcommit_memory が 2 に設定されている場合に考慮される物理 RAM のパーセンテージを指定します。デフォルト値は 50 です。
vm.max_map_count
プロセスが使用可能なメモリーマップ領域の最大数を定義します。デフォルト値は 65530 です。アプリケーションに十分なメモリーマップ領域が必要な場合は、この値を増やします。
vm.min_free_kbytes
予約済み空きページプールのサイズを設定します。また、Linux カーネルのページ回収アルゴリズムの動作を制御する min_pagelow_page、および high_page しきい値も設定します。さらに、システム全体で維持する空きメモリーの最小キロバイト数を指定します。これにより、低位の各メモリーゾーンに対して特定の値が計算されます。それぞれのゾーンには、そのサイズに比例した数の予約済み空きページが割り当てられます。
vm.min_free_kbytes パラメーターの値の設定
  • このパラメーターの値を増やすと、アプリケーションのワーキングセットで使用可能なメモリーが実質的に減少します。したがって、この設定は、ドライバーのバッファーをアトミックなコンテキストで割り当てる必要がある、カーネル主導のワークロードにのみ使用してください。
  • パラメーターの値を下げると、システムでメモリーが不足した場合に、カーネルがシステム要求の処理をレンダリングできなくなる可能性があります。

    警告

    極端な値は、システムのパフォーマンスに悪影響を与えます。vm.min_free_kbytes が非常に低い値に設定すると、システムのメモリーを効果的に回収できなくなります。これにより、システムがクラッシュし、サービス割り込みやその他のカーネルサービスに失敗する可能性があります。ただし、vm.min_free_kbytes を設定すると、システムの回収アクティビティーが大幅に増大し、誤ったダイレクト回収状態により割り当てレイテンシーが発生します。これにより、システムが直ちにメモリー不足状態になる可能性があります。vm.min_free_kbytes パラメーターは、min_pages という名前のページ回収ウォーターマークも設定します。このウォーターマークは、ページの回収アルゴリズムを管理する他の 2 つのメモリー基準 (low_pages、および high_pages) を決定する要素として使用されます。

  • /proc/PID/oom_adj システムのメモリーが不足し、panic_on_oom パラメーターが 0 に設定されている場合、oom_killer 関数が、システムが回復するまで、最も高い oom_score を持つプロセスからプロセスを強制終了します。oom_adj パラメーターは、プロセスの oom_score を決定します。このパラメーターはプロセス識別子ごとに設定されます。値が -17 の場合、そのプロセスの oom_killer が無効になります。その他の有効な値は -16 から 15 までの値です。

    注記

    調整したプロセスによって作成されたプロセスは、そのプロセスの oom_score を継承します。

vm.swappiness
swappiness 値 (0 から 200 までの範囲) は、システムが匿名メモリープールまたはページキャッシュメモリープールからのメモリー回収を優先する度合いを制御します。
swappiness パラメーターの値の設定
  • 値を高くすると、ファイルマップ主導のワークロードが優先される一方で、あまり活発にアクセスされないプロセスの RAM の匿名マップメモリーがスワップアウトされます。これは、ストレージ内のファイルなどのデータをメモリー上に常駐させることに依存するファイルサーバーやストリーミングアプリケーションで、サービス要求の I/O レイテンシーを削減するのに役立ちます。
  • 値を小さくすると、匿名マップ主導のワークロードが優先される一方で、ページキャッシュ (ファイルマップメモリー) が回収されます。この設定は、ファイルシステム情報に大きく依存しないアプリケーション、数学的アプリケーションや数値計算アプリケーションなどの動的に割り当てられたメモリーやプライベートメモリーを大幅に使用するアプリケーション、QEMU のような一部のハードウェア仮想化スーパーバイザーにおいて有用です。vm.swappiness パラメーターのデフォルト値は 60 です。

    警告

    vm.swappiness を 0 に設定すると、匿名メモリーをディスクにスワップアウトすることが積極的に回避されます。そのため、メモリーまたは I/O を多用するワークロードの実行中に oom_killer 関数がプロセスを強制終了する可能性が高まります。

25.4. ファイルシステムパラメーター

ファイルシステムパラメーターは、/proc/sys/fs ディレクトリーにリスト表示されます。利用可能なファイルシステムパラメーターを以下に示します。

aio-max-nr
すべてのアクティブな非同期入出力コンテキストで許可されるイベントの最大数を定義します。デフォルト値は 65536 で、この値を変更してもカーネルデータ構造の事前割り当てやサイズ変更は行われません。
file-max
システム全体でのファイルハンドルの最大数を決定します。Red Hat Enterprise Linux のデフォルト値は、カーネルの起動時に使用可能な空きメモリーページの 10 分の 1 と 8192 のうち、いずれか大きい方です。この値を設定すると、利用可能なファイルハンドルがないためにエラーを解決できます。

25.5. カーネルパラメーター

カーネルパラメーターのデフォルト値は /proc/sys/kernel/ ディレクトリーにあります。この値は、カーネルによって提供されるデフォルト値、または sysctl を使用してユーザーが指定した値に設定されます。次のカーネルパラメーターは、System V IPC (sysvipc) 関連のシステムコールである msg* および shm* の制限を設定します。

msgmax
メッセージキューの単一のメッセージに対する最大許容サイズ (バイト単位) を定義します。この値は、キューのサイズ (msgmnb) を超えることはできません。システムの現在の msgmax 値を確認するには、sysctl kernel.msgmax コマンドを使用します。
msgmnb
単一のメッセージキューの最大サイズをバイト単位で定義します。sysctl msgmnb コマンドを使用して、システムの現在の msgmnb 値を確認します。
msgmni
メッセージキュー識別子の最大数 (つまりキューの最大数) を定義します。システムの現在の msgmni 値を確認するには、sysctl kernel.msgmni コマンドを使用します。
shmall
一度にシステムで使用できる共有メモリーページの合計量を定義します。たとえば、AMD64 および Intel 64 のアーキテクチャーでは、ページは 4096 バイトです。システムの現在の shmall 値を確認するには、sysctl kernel.shmall コマンドを使用します。
shmmax
カーネルが許可する単一の共有メモリーセグメントの最大サイズをバイト単位で定義します。カーネルで、1Gb までの共有メモリーセグメントがサポートされるようになりました。システムの現在の shmmax 値を確認するには、sysctl kernel.shmmax コマンドを使用します。
shmmni
システム全体の共有メモリーセグメントの最大数を定義します。すべてのシステムでは、デフォルト値は 4096 です。

第26章 SystemTap の使用

システム管理者は、SystemTap を使用して、実行中の RHEL システム上のバグやパフォーマンスの問題の根本的な原因を特定できます。アプリケーション開発者は、SystemTap を使用して、RHEL 環境内でのアプリケーションの動作を詳細に監視および分析できます。

26.1. SystemTap の目的

SystemTap は、オペレーティングシステム (特にカーネル) の動作を詳細に調査および監視するために使用できる追跡およびプロービングツールです。SystemTap は、netstatpstopiostat などのツールの出力に似た情報を提供します。ただし、SystemTap は収集した情報をフィルタリング、分析するためのオプションがより多く用意されています。SystemTap スクリプトでは、SystemTap が収集する情報を指定します。

SystemTap は、カーネルアクティビティーを追跡するためのインフラストラクチャーをユーザーに提供し、この追跡機能を次の 2 つの特性とともに提供することで、既存の Linux 監視ツール群を補完することを目的としています。

柔軟性
SystemTap フレームワークを使用すると、カーネル空間で発生するさまざまなカーネル関数、システムコール、その他のイベントを調査および監視するための簡単なスクリプトを開発できます。そのため、SystemTap はツールというよりも、独自のカーネル専用のフォレンジックおよび監視ツールを開発するために使用できるシステムであるといえます。
使いやすさ
SystemTap を使用すると、カーネルを再コンパイルしたりシステムを再起動したりすることなく、カーネルのアクティビティーを監視できます。

26.2. SystemTap のインストール

SystemTap の使用を開始するには、必要なパッケージをインストールします。複数のカーネルを持つシステムで、複数のカーネルに対して SystemTap を使用するには、各カーネルバージョンに対応するカーネルパッケージをインストールします。

前提条件

手順

  1. 必要な SystemTap パッケージをインストールします。

    # dnf install systemtap
  2. 必要なカーネルパッケージをインストールします。

    • stap-prep の使用:

      # stap-prep
    • stap-prep が機能しない場合は、必要なカーネルパッケージを手動でインストールします。

      # dnf install kernel-debuginfo-$(uname -r) kernel-debuginfo-common-$(uname -m)-$(uname -r) kernel-devel-$(uname -r)

      $(uname -m) は、システムのハードウェアプラットフォームに自動的に置き換えられ、$(uname -r) は、実行中のカーネルのバージョンに自動的に置き換えられます。

検証

  • SystemTap でプローブするカーネルが現在使用中の場合は、インストールが成功したかどうかをテストします。

    # stap -v -e 'probe kernel.function("vfs_read") {printf("read performed\n"); exit()}'

    SystemTap のデプロイが成功すると、次のような出力が表示されます。

    Pass 1: parsed user script and 45 library script(s) in 340usr/0sys/358real ms.
    Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) in 290usr/260sys/568real ms.
    Pass 3: translated to C into "/tmp/stapiArgLX/stap_e5886fa50499994e6a87aacdc43cd392_399.c" in 490usr/430sys/938real ms.
    Pass 4: compiled C into "stap_e5886fa50499994e6a87aacdc43cd392_399.ko" in 3310usr/430sys/3714real ms.
    Pass 5: starting run.
    read performed
    Pass 5: run completed in 10usr/40sys/73real ms.

    ここでは、以下のようになります。

  • Pass 5: starting run は、SystemTap がカーネルをプローブするための計装を正常に作成し、その計装を実行したことを示しています。
  • read performed は、SystemTap が指定されたイベント (この例では VFS 読み取り) を検出したことを示しています。
  • Pass 5: run completed in <time> ms は、SystemTap が有効なハンドラーを実行したことを示しています。また、テキストを表示し、エラーなく閉じたことを示しています。

26.3. SystemTap を実行する特権

SystemTap スクリプトを実行するには、システム特権の昇格が必要です。しかし、場合によっては、特権のないユーザーが自分のマシンで SystemTap の計装を実行する必要があります。

ユーザーが root アクセス権なしで SystemTap スクリプトをビルドおよび実行できるようにするには、次の両方のユーザーグループにユーザーを追加します。

stapdev
このグループのメンバーは stap を使用して SystemTap スクリプトを実行したり、staprun を使用して SystemTap インストルメンテーションモジュールを実行したりできます。stap を実行するには、SystemTap スクリプトをカーネルモジュールにコンパイルし、カーネルにロードする必要があります。これを行うには、システムに対する昇格された特権が必要であり、stapdev のメンバーにはこの特権が付与されます。この特権は、stapdev のメンバーに事実上の root アクセス権も付与するものです。stapdev グループのメンバーシップは、root アクセス権を与えても問題のない信頼できるユーザーにのみ付与してください。
stapusr
このグループのメンバーが SystemTap インストルメンテーションモジュールの実行に使用できるのは、staprun のみです。さらに、このグループのユーザーは、/lib/modules/<kernel_version>/systemtap/ ディレクトリーからのみ、これらのモジュールを実行できます。このディレクトリーは、root ユーザーのみが所有し、書き込み可能である必要があります。

26.4. SystemTap スクリプトの実行

SystemTap スクリプトは、標準入力またはファイルから実行できます。SystemTap のインストール時に配布されるサンプルスクリプトは、サンプル SystemTap スクリプト または /usr/share/systemtap/examples ディレクトリーにあります。

前提条件

  • SystemTap と必要なカーネルパッケージが、Systemtap のインストール の説明に従ってインストールされている。
  • SystemTap スクリプトを通常のユーザーとして実行するために、そのユーザーを SystemTap グループに追加する。

    # usermod --append --groups
    stapdev,stapusr <user_name>

手順

  • SystemTap スクリプトを実行します。

    • 標準入力の場合:

      # stap -e "probe timer.s(1) {exit()}"
    • ファイルから:

      # stap <file_name>.stp

26.5. サンプル SystemTap スクリプト

SystemTap のインストール時に配布されるサンプルスクリプトは、/usr/share/systemtap/examples ディレクトリーにあります。各 SystemTap スクリプトを実行するには、stap コマンドを使用します。

関数呼び出しのトレース

para-callgraph.stp SystemTap スクリプトを使用して、関数の呼び出しと関数の戻り値をトレースできます。

# stap para-callgraph.stp <argument1 argument2>

このスクリプトは、次の 2 つのコマンドライン引数を取ります。

  • 開始/終了をトレースする関数の名前。
  • もう 1 つは、トリガー関数です (任意)。この関数は、スレッドごとのトレースを有効または無効にします。

    トリガー関数が終了するまで、各スレッドでのトレースが継続されます。

ポーリングアプリケーションの監視

timeout.stp SystemTap スクリプトを使用して、どのアプリケーションがポーリングしているかを特定および監視できます。これを把握することで、不要なポーリングや過剰なポーリングを追跡できます。これは、トラッキングは、CPU 使用率や省電力を改善するための領域を特定するのに役立ちます。

# stap timeout.stp

このスクリプトは、各アプリケーションが pollselectepollitimerfutexnanosleepSignal システムコールを何回使用したかを経時的に追跡します。

プロセスごとのシステムコールボリュームの追跡

syscalls_by_proc.stp SystemTap スクリプトを使用して、システムコールを最も多く実行しているプロセスを確認できます。上位 20 件のプロセスが表示されます。

# stap syscalls_by_proc.stp
ネットワークソケットコードで呼び出された関数の追跡

socket-trace.stp SystemTap スクリプトを使用して、カーネルの net/socket.c ファイルから呼び出された関数をトレースできます。これにより、各プロセスがカーネルレベルでネットワークとどのようにやり取りしているかを詳細に確認できます。

# stap socket-trace.stp
各ファイルの読み取りまたは書き込みの I/O 時間の追跡

iotime.stp SystemTap スクリプトを使用して、各プロセスがファイルへの読み取りまたは書き込みを行うのにかかる時間を監視できます。これにより、システムへの読み込みに時間がかかっているファイルを判断する上で役立ちます。

# stap iotime.stp
タスクからサイクルを奪っている IRQ やその他のプロセスを追跡する

cycle_thief.stp SystemTap スクリプトを使用すると、タスクが実行されている時間と実行されていない時間を追跡できます。これにより、どのプロセスがタスクからサイクルを奪っているかを特定できます。

# stap cycle_thief.stp -x pid

詳細は、/usr/share/systemtap/examples ディレクトリーを参照してください。

注記

SystemTap スクリプトの詳細な例と情報は、/usr/share/systemtap/examples/index.html ファイルにあります。Web ブラウザーで開くと、使用可能なすべてのスクリプトとその説明がリスト表示されます。

26.6. SystemTap のクロスインストルメンテーション

SystemTap のクロスインストルメンテーションは、あるシステムで SystemTap スクリプトから SystemTap インストルメンテーションモジュールを作成し、SystemTap が完全にデプロイされていない別のシステムで使用します。ユーザーが SystemTap スクリプトを実行すると、そのスクリプトからカーネルモジュールが構築されます。次に SystemTap はモジュールをカーネルに読み込みます。

通常、SystemTap スクリプトは SystemTap がデプロイされているシステムでのみ実行できます。SystemTap を 10 台のシステムで実行するには、このようなすべてのシステムに SystemTap をデプロイする必要があります。場合によっては、これは実現不可能または推奨されない場合があります。たとえば、企業のポリシーで、特定のマシンにコンパイラーやデバッグ情報を提供するパッケージのインストールが禁止されている場合には、SystemTap のデプロイメントができなくなります。

この状況を回避するには、クロスインストルメンテーションを使用します。クロスインストルメンテーションとは、あるコンピューターの SystemTap スクリプトから SystemTap インストルメンテーションモジュールを生成して、別のシステムで使用するプロセスです。このプロセスには、以下のような効果があります。

  • 各種マシンのカーネル情報パッケージを単一のホストマシにインストールできる。カーネルのパッケージ化にバグがあると、インストールが妨げられる場合があります。このような場合、ホストシステムとターゲットシステムの kernel-debuginfo パッケージと kernel-devel パッケージが同じである必要があります。バグが発生した場合は、Red Hat JIRA でバグを報告してください。
  • 生成された SystemTap インストルメンテーションモジュールを使用する際に、各ターゲットマシンにインストールする必要があるのは、systemtap-runtime というパッケージだけです。ビルドされたインストルメンテーションモジュールを動作させるには、ホストシステムがターゲットシステムと同じアーキテクチャーであり、同じ Linux ディストリビューションを実行している必要があります。

    用語
  • インストルメンテーションモジュール

    SystemTap スクリプトからビルドされるカーネルモジュール。SystemTap モジュールは、ホストシステム上にビルドされ、ターゲットシステムのターゲットカーネルにロードされます。

  • ホストシステム

    ターゲットシステムにロードできるように、インストルメンテーションモジュール (SystemTap スクリプトから) がコンパイルされるシステム。

  • ターゲットシステム

    インストルメンテーションモジュールが (SystemTap スクリプトから) ビルドされるシステム。

  • ターゲットカーネル

    ターゲットシステムのカーネル。これは、インストルメンテーションモジュールをロードして実行するカーネルです。

26.7. SystemTap のクロスインストルメンテーションの初期化

SystemTap のクロスインストルメンテーションを初期化して、あるシステム上で SystemTap スクリプトから SystemTap インストルメンテーションモジュールをビルドし、SystemTap が完全にデプロイされていない別のシステムでこのモジュールを使用します。

前提条件

  • SystemTap のインストール で説明されているように、SystemTap がホストシステムにインストールされている。
  • systemtap-runtime パッケージが各ターゲットシステムにインストールされている。

    # dnf install systemtap-runtime
  • ホストシステムとターゲットシステムが両方とも同じアーキテクチャーである。
  • ホストシステムとターゲットシステムの両方で、同じメジャーバージョンの Red Hat Enterprise Linux (Red Hat Enterprise Linux 10 など) が実行されている。

    重要

    カーネルパッケージのバグにより、複数の kernel-debuginfo パッケージと kernel-devel パッケージを 1 つのシステムにインストールできない場合があります。このような場合、ホストシステムとターゲットシステムのマイナーバージョンが同じである必要があります。バグが発生した場合は、Red Hat JIRA でバグを報告してください。

手順

  1. 各ターゲットシステムで実行されているカーネルを特定します。

    $ uname -r
  2. ターゲット システムに対して上記のステップを繰り返します。
  3. Systemtap のインストール で説明されている方法に従って、ホストシステムで各ターゲットシステムのターゲットカーネルと関連パッケージをインストールします。
  4. ホストシステムでインストルメンテーションモジュールをビルドし、このモジュールをターゲットシステムにコピーして、次のいずれかの方法でこのモジュールを実行します。

    1. ホストシステムからターゲットシステムへの SSH 接続が可能な場合は、リモート実装を使用します。

      # stap --remote <target_system> script

      これを正常に実行するには、ホストシステムからターゲットシステムへの SSH 接続が確立できることを確認する必要があります。

    2. 手動:

      1. ホストシステムでインストルメンテーションモジュールをビルドします。

        # stap -r <kernel_version> script -m <module_name> -p 4

        <kernel_version> はステップ 1 で特定したターゲットカーネルのバージョン、script はインストルメンテーションモジュールに変換するスクリプト、<module_name> はインストルメンテーションモジュールの任意の名前です。-p4 オプションは、SystemTap にコンパイルしたモジュールを読み込まないように指示します。

      2. インストルメンテーションモジュールをコンパイルしたら、それをターゲットシステムにコピーし、次のコマンドを使用してロードします。

        # staprun <module_name>.ko

第27章 スケジューリングポリシーの調整

Red Hat Enterprise Linux ではプロセス実行の最小単位をスレッドと呼んでいます。システムスケジューラーは、スレッドを実行するプロセッサーと、スレッドの実行期間を決定します。しかし、スケジューラーの主な目標はシステムを常に稼働させ続けることです。そのため、スケジューラーは、アプリケーションのスケジューリングポリシーのパフォーマンスカテゴリーに最適な形で、スレッドをスケジュールしない可能性があります。

たとえば、NUMA システムでノード B のプロセッサーが利用可能になったときアプリケーションはノード A で実行中だったと仮定します。プロセッサーをノード B でビジー状態に維持するために、スケジューラーはアプリケーションのスレッドのいずれかをノード B に移動します。ただし、アプリケーションスレッドは依然としてノード A のメモリーにアクセスする必要があります。ただし、スレッドがノード B で実行され、ノード A のメモリーがスレッドに対してローカルにならないため、このメモリーへのアクセスには時間がかかります。そのため、スレッドがノード B での実行を終了するには、ノード A のプロセッサーが利用可能になるまで待機してから、ローカルメモリーアクセスで元のノードでスレッドを実行するよりも時間がかかる場合があります。

27.1. スケジューリングポリシーの分類

パフォーマンス重視のアプリケーションでは、多くの場合、設計者または管理者がスレッドの実行場所を決定することでメリットが得られます。Linux スケジューラーは、スレッドが実行される場所と期間を決定するいくつかのスケジューリングポリシーを実装します。以下は、スケジューリングポリシーの主なカテゴリーです。

通常のポリシー
通常スレッドは、通常の優先度のタスクに使用されます。
リアルタイムポリシー
リアルタイムポリシーは、中断なしで完了する必要のある時間的制約のあるタスクに使用されます。リアルタイムスレッドは、タイムスライスの対象ではありません。つまり、スレッドは、ブロック、終了、デプロイメント、または優先度の高いスレッドによってプリエンプションされるまで実行されます。

最も優先度の低いリアルタイムスレッドは、通常のポリシーを持つスレッドの前にスケジュールされます。詳細は、SCHED_FIFO を使用した静的優先度スケジューリングSCHED_RR を使用したラウンドロビン優先度スケジューリング、およびシステム上の sched(7)sched_setaffinity(2)sched_getaffinity(2)sched_setscheduler(2)、および sched_getscheduler(2) man ページを参照してください。

27.2. SCHED_FIFO を使用した静的優先度スケジューリング

SCHED_FIFO は静的優先度スケジューリングとも呼ばれ、各スレッドに固定の優先度を定義するリアルタイムポリシーです。このポリシーにより、管理者はイベントの応答時間を改善し、レイテンシーを短縮できます。時間的制約のあるタスクでは、このポリシーを長時間実行しないでください。SCHED_FIFO が使用されている場合、スケジューラーは SCHED_FIFO の全スレッドのリストを優先度順にスキャンし、実行準備ができているスレッドを最も優先度の高いものとしてスケジュールします。SCHED_FIFO スレッドの優先度レベルは、1 から 99 までの任意の整数にすることができます。ここで、99 は最も高い優先度として処理されます。最初は低い数値に設定して、レイテンシーの問題が特定された場合にのみ、優先度を上げてください。

警告

リアルタイムスレッドはタイムスライスの対象ではないため、優先度を 99 に設定しないでください。これにより、プロセスは移行およびウォッチドッグスレッドと同じ優先レベルを維持します。スレッドが演算ループに入り、これらのスレッドがブロックされると、実行できなくなります。単一のプロセッサーを持つシステムは、この状況では最終的にハングします。

管理者は、SCHED_FIFO 帯域幅を制限し、リアルタイムのアプリケーションプログラマーがプロセッサーを単調にするリアルタイムのタスクを開始できないようにすることができます。以下は、このポリシーで使用されるパラメーターの一部です。

/proc/sys/kernel/sched_rt_period_us
このパラメーターは、プロセッサー帯域幅の 100 パーセントとみなされる期間 (マイクロ秒単位) を定義します。デフォルト値は 1000000 μs つまり 1 秒 です。
/proc/sys/kernel/sched_rt_runtime_us
このパラメーターは、リアルタイムスレッドを実行する時間 (マイクロ秒単位) を定義します。デフォルト値は 950000 μs つまり 0.95 秒 です。

27.3. SCHED_RR を使用したラウンドロビン優先度スケジューリング

SCHED_RR は、SCHED_FIFO のラウンドロビン型です。このポリシーは、複数のスレッドを同じ優先レベルで実行する必要がある場合に役に立ちます。SCHED_FIFO と同様に、SCHED_RR は、各スレッドに固定の優先度を定義するリアルタイムポリシーです。スケジューラーは、すべての SCHED_RR スレッドのリストを優先度順にスキャンし、実行準備ができている最も優先度の高いスレッドをスケジュールします。ただし、SCHED_FIFO とは異なり、優先順位が同じスレッドは、特定のタイムスライス内のラウンドロビンスタイルでスケジュールされます。このタイムスライスの値は、/proc/sys/kernel/sched_rr_timeslice_ms ファイルの sched_rr_timeslice_ms カーネルパラメーターでミリ秒単位で設定できます。最小値は 1 ミリ秒 です。

27.4. SCHED_OTHER を使用した通常のスケジューリング

SCHED_OTHER はデフォルトのスケジューリングポリシーです。このポリシーは Completely Fair Scheduler (CFS) を使用して、このポリシーでスケジュールされているすべてのスレッドへの公平プロセッサーアクセスを許可します。このポリシーは、スレッドが多数ある場合や、データスループットの優先度が優先される場合に最も便利です。これは、時間とともにスレッドをより効率的にスケジュールできるためです。このポリシーが使用されると、スケジューラーは各プロセススレッドの niceness 値に基づいて動的な優先順位リストを作成します。管理者はプロセスの niceness 値を変更できますが、スケジューラーの動的優先順位のリストを直接変更することはできません。

27.5. スケジューラーポリシーの設定

chrt コマンドラインツールを使用して、スケジューラーのポリシーと優先度を確認および調整できます。希望するプロパティーで新しいプロセスを開始するか、実行中のプロセスのプロパティーを変更できます。また、ランタイム時にポリシーを設定するのにも使用できます。

手順

  1. アクティブなプロセスのプロセス ID (PID) を表示します。

    # ps
  2. ps コマンドで --pid または -p オプションを使用して、特定の PID の詳細を表示します。
  3. 特定のプロセスのスケジューリングポリシー、PID、および優先順位を確認します。

    # chrt -p 468
    pid 468's current scheduling policy: SCHED_FIFO
    pid 468's current scheduling priority: 85
    
    # chrt -p 476
    pid 476's current scheduling policy: SCHED_OTHER
    pid 476's current scheduling priority: 0
  4. プロセスのスケジューリングポリシーを設定します。次に例を示します。

    1. PID 1000 のプロセスを SCHED_FIFO に設定し、優先度を 50 に設定するには、以下を実行します。

      # chrt -f -p 50 1000
    2. PID 1000 のプロセスを SCHED_OTHER に設定し、優先度を 0 に設定するには、以下を実行します。

      # chrt -o -p 0 1000
    3. PID 1000 のプロセスを SCHED_RR に設定し、優先度を 10 に設定するには、以下を実行します。

      # chrt -r -p 10 1000
    4. 特定のポリシーおよび優先度で新規アプリケーションを開始するには、アプリケーションの名前を指定します。

      # chrt -f 36 /bin/my-app

27.6. chrt コマンドのポリシーオプション

chrt コマンドを使用して、プロセスのスケジューリングポリシーを表示および設定できます。次の表は、プロセスのスケジューリングポリシーを設定するために使用できる、適切なポリシーオプションを説明しています。

Expand
短いオプションLong オプション説明

-f

--fifo

スケジュールを SCHED_FIFO に設定

-o

--other

スケジュールを SCHED_OTHER に設定

-r

--rr

スケジュールを SCHED_RR に設定します。

27.7. ブートプロセス中のサービス優先度の変更

systemd サービスを使用すると、ブートプロセス中に起動するサービスのリアルタイムの優先度を設定できます。ブートプロセス中のサービスの優先度を変更するには、ユニット設定ディレクティブを使用します。ブートプロセスの優先度は、サービスセクションで次のディレクティブを使用して変更できます。

  • CPUSchedulingPolicy=: 実行されるプロセスの CPU スケジューリングポリシーを設定します。これは、other、fifo、および rr ポリシーを設定するために使用されます。
  • CPUSchedulingPriority=: 実行されるプロセスの CPU スケジューリング優先度を設定します。設定可能な優先度の範囲は、選択した CPU スケジューリングポリシーにより異なります。リアルタイムスケジューリングポリシーでは、1 (最も低い優先度) から 99 (最も高い優先度) の整数を使用できます。

サービスの優先度は、ブートプロセス中に、および mcelog サービスを使用して変更できます。

前提条件

手順

  1. 実行中のスレッドのスケジュールの優先度を表示します。

    # tuna --show_threads
        thread       ctxt_switches
        pid SCHED_ rtpri affinity voluntary nonvoluntary             cmd
      1      OTHER     0     0xff      3181          292         systemd
      2      OTHER     0     0xff       254            0        kthreadd
      3      OTHER     0     0xff         2            0          rcu_gp
      4      OTHER     0     0xff         2            0      rcu_par_gp
      6      OTHER     0        0         9            0 kworker/0:0H-kblockd
      7      OTHER     0     0xff      1301            1 kworker/u16:0-events_unbound
      8      OTHER     0     0xff         2            0    mm_percpu_wq
      9      OTHER     0        0       266            0     ksoftirqd/0
    [...]
  2. 補足的な mcelog サービス設定ディレクトリーファイルを作成し、このファイルにポリシー名と優先度を挿入します。

    # cat << EOF > /etc/systemd/system/mcelog.service.d/priority.conf
    
    [Service]
    CPUSchedulingPolicy=fifo
    CPUSchedulingPriority=20
    EOF
  3. systemd スクリプト設定を再読み込みします。

    # systemctl daemon-reload
  4. mcelog サービスを再起動します。

    # systemctl restart mcelog

検証

  • systemd 問題で設定した mcelog 優先度を表示します。

    # tuna -t mcelog -P
    thread       ctxt_switches
    pid SCHED_ rtpri affinity voluntary nonvoluntary             cmd
    826     FIFO    20  0,1,2,3        13            0          mcelog

27.8. 優先順位マップ

優先度はグループで定義され、特定のカーネル機能専用のグループもあります。リアルタイムスケジューリングポリシーでは、1 (最も低い優先度) から 99 (最も高い優先度) までの整数が使用されます。

次の表は、プロセスのスケジューリングポリシーを設定する際に使用できる優先度の範囲を示しています。

Expand
表27.1 優先度範囲の説明
優先度Threads説明

1

優先度の低いカーネルスレッド

通常、この優先度は SCHED_OTHER よりは優先度の高いタスク用に予約されます。

2 - 49

利用可能

標準的なアプリケーションの優先度に使用される範囲。

50

ハード IRQ のデフォルト値

 

51 - 98

優先度の高いスレッド

この範囲は、定期的に実行されるスレッドと、迅速な応答時間に使用します。CPU にバインドされたスレッドには割り込みが必要になるため、この範囲を使用しないでください。

99

ウォッチドッグおよび移行

最も高い優先順位で実行される必要があるシステムスレッド。

27.9. TuneD cpu-partitioning プロファイル

レイテンシーの影響を受けやすいワークロード向けに Red Hat Enterprise Linux をチューニングするには、cpu-partitioning TuneD プロファイルを使用します。Red Hat Enterprise Linux 9 以降では、cpu-partitioning TuneD プロファイルを使用して、低レイテンシーのチューニングをより効率的に実行できます。このプロファイルは、個々の低レイテンシーアプリケーションの要件に従って簡単にカスタマイズできます。次の図は、cpu-partitioning プロファイルの使用方法を示す例です。この例では、CPU とノードのレイアウトを使用します。

cpu-partitioning

/etc/tuned/cpu-partitioning-variables.conf ファイルで cpu-partitioning プロファイルを設定するには、次の設定オプションを使用します。

負荷分散機能のある分離された CPU

cpu-partitioning の図では、4 から 23 までの番号が付けられたブロックが、デフォルトの分離された CPU です。カーネルスケジューラーのプロセスの負荷分散は、この CPU で有効になります。これは、カーネルスケジューラーの負荷分散を必要とする複数のスレッドを使用した低レイテンシープロセス用に設計されています。/etc/tuned/cpu-partitioning-variables.conf ファイルで、isolated_cores=cpu-list オプションを使用して cpu-partitioning プロファイルを設定できます。このオプションに、カーネルスケジューラーの負荷分散を使用する分離された CPU を列挙します。

分離された CPU のリストはコンマで区切るか、または 3-5 のようにダッシュを使用して範囲を指定できます。このオプションは必須です。このリストにない CPU は、自動的にハウスキーピング CPU と見なされます。

負荷分散を行わずに分離した CPU

cpu-partitioning の図では、2 と 3 の番号が付けられたブロックは、追加のカーネルスケジューラープロセスの負荷分散を提供しない分離された CPU です。

/etc/tuned/cpu-partitioning-variables.conf ファイルで、no_balance_cores=cpu-list オプションを使用して cpu-partitioning プロファイルを設定できます。このオプションに、カーネルスケジューラーの負荷分散を使用しない分離された CPU を列挙します。

no_balance_cores オプションの指定は任意ですが、このリスト内の CPU は、isolated_cores リストに列挙されている CPU の一部である必要があります。これらの CPU を使用するアプリケーションスレッドは、各 CPU に個別にピニングする必要があります。

ハウスキーピング CPU
cpu-partitioning-variables.conf ファイル内で分離されていない CPU は、自動的にハウスキーピング CPU と見なされます。ハウスキーピング CPU では、すべてのサービス、デーモン、ユーザープロセス、移動可能なカーネルスレッド、割り込みハンドラー、およびカーネルタイマーの実行が許可されます。

27.10. 低レイテンシーチューニングへの TuneD の cpu-partitioning プロファイルの使用

TuneD の cpu-partitioning プロファイルを使用して、システムを低レイテンシーのためにチューニングできます。この場合のアプリケーションでは、以下を使用します。

  • ネットワークからデータを読み取る 1 つの専用のリーダースレッドを、CPU 2 にピニングします。
  • このネットワークデータを処理する多数のスレッドを、CPU 4 - 23 にピニングします。
  • 処理されたデータをネットワークに書き込む 1 つの専用のライタースレッドを、CPU 3 にピニングします。

前提条件

  • dnf install tuned-profiles-cpu-partitioning コマンドを root で使用して、cpu-partitioning TuneD プロファイルをインストールしている。

手順

  1. /etc/tuned/cpu-partitioning-variables.conf ファイルを次のように編集します。

    1. isolated_cores=${f:calc_isolated_cores:1} 行をコメントアウトします。

      # isolated_cores=${f:calc_isolated_cores:1}
    2. 分離された CPU について次の情報を追加します。

      # All isolated CPUs:
      isolated_cores=2-23
      # Isolated CPUs without the kernel’s scheduler load balancing:
      no_balance_cores=2,3
    3. cpu-partitioning TuneD プロファイルを設定します。

      # tuned-adm profile cpu-partitioning
  2. システムを再起動します。

    再起動後、システムは、cpu-partitioning の図の分離に従って、低レイテンシーにチューニングされます。このアプリケーションでは、タスクセットを使用して、リーダーおよびライターのスレッドを CPU 2 および 3 に固定し、残りのアプリケーションスレッドを CPU 4-23 に固定できます。

検証

  • 分離された CPU が Cpus_allowed_list フィールドに反映されていないことを確認します。

    # cat /proc/self/status | grep Cpu
    Cpus_allowed:	003
    Cpus_allowed_list:	0-1
  • すべてのプロセスのアフィニティーを確認するには、次のように入力します。

    # ps -ae -o pid= | xargs -n 1 taskset -cp
    pid 1's current affinity list: 0,1
    pid 2's current affinity list: 0,1
    pid 3's current affinity list: 0,1
    pid 4's current affinity list: 0-5
    pid 5's current affinity list: 0,1
    pid 6's current affinity list: 0,1
    pid 7's current affinity list: 0,1
    pid 9's current affinity list: 0
    ...
    注記

    TuneD は、一部のプロセス (主にカーネルプロセス) のアフィニティーを変更できません。この例では、PID 4 および 9 のプロセスは変更されません。

27.11. cpu-partitioning TuneD プロファイルのカスタマイズ

TuneD プロファイルを拡張して、追加のチューニング変更を行うことができます。たとえば、cpu-partitioning プロファイルは、cstate=1 を使用する CPU を設定します。cpu-partitioning プロファイルを使用しながら、CPU の cstatecstate1 から cstate0 に変更するために、次の手順では、my_profile という名前の新しい TuneD プロファイルを説明しています。このプロファイルは、cpu-partitioning プロファイルを継承した後、C state-0 を設定します。

手順

  1. /etc/tuned/my_profile ディレクトリーを作成します。

    # mkdir /etc/tuned/profiles/my_profile
  2. このディレクトリーに tuned.conf ファイルを作成し、次の内容を追加します。

    # vi /etc/tuned/profiles/my_profile/tuned.conf
    [main]
    summary=Customized tuning on top of cpu-partitioning
    include=cpu-partitioning
    [cpu]
    force_latency=cstate.id:0|1
  3. 新しいプロファイルを使用します。

    # tuned-adm profile my_profile
    注記

    この共有例では、再起動は必要ありません。ただし、my_profile プロファイルの変更を有効にするために再起動が必要な場合は、マシンを再起動します。

第28章 numastat を使用したメモリー割り当てのプロファイリング

numastat ツールは、システム内のメモリー割り当てに関する詳細な統計情報を提供し、各 NUMA ノードのデータを個別に表示します。この情報は、システムメモリーのパフォーマンスを分析し、さまざまなメモリーポリシーの有効性を評価するのに役立ちます。

28.1. デフォルトの numastat 統計

デフォルトでは、numastat ツールは、各 NUMA ノードの以下のカテゴリーに対する統計を表示します。

numa_hit
このノードに正常に割り当てられていたページ数。
numa_miss

対象のノードのメモリーが少ないために、このノードに割り当てたページ数。それぞれの numa_miss イベントには、別のノードで対応する numa_foreign イベントがあります。

注記

高い numa_hit の値と低い numa_miss の値 (互いに相対的) は、最適なパフォーマンスを示します。

numa_foreign
代わりに別のノードに割り当てられたこのノードについて最初に意図されたページ数です。それぞれの numa_foreign イベントには、対応する numa_miss イベントが別のノードにあります。
interleave_hit
このノードに正常に割り当てられるインターリーブポリシーページの数。
local_node
このノードのプロセスで、このノードで正常に割り当てられるページ数。
other_node
別のノードのプロセスでこのノードに割り当てられるページ数。

28.2. numastat を使用したメモリー割り当ての表示

numastat ツールを使用してシステムのメモリー割り当てを表示できます。

前提条件

  • numactl パッケージがインストールされている。

    # dnf install numactl

手順

  • システムのメモリー割り当てを表示する。

    $ numastat
                                 node0         node1
    numa_hit                  76557759      92126519
    numa_miss                 30772308      30827638
    numa_foreign              30827638      30772308
    interleave_hit              106507        103832
    local_node                76502227      92086995
    other_node                30827840      30867162

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る