Linux perfコマンドを現場で活用したリアル事例|CPU負荷・ボトルネック解析・トラブル対応の実践記録

最終更新日 2025年2月2日

スポンサーリンク

Linuxのパフォーマンス解析になぜperfコマンドを使うのか?

Linuxの運用をしていると、「特定のプロセスが重い」「システムのレスポンスが悪い」といった問題に遭遇することが多い。こうした問題の原因を特定するために、普段から top, vmstat, iostat, sar などの基本的なツールを使っているエンジニアは多いだろう。

しかし、これらのツールだけでは 「なぜ遅いのか」「どの関数や処理がボトルネックになっているのか」 までは分からないことがある。特にCPU負荷の原因を深く調査する必要がある場合、Linuxのperfコマンド が役立つ。

ここでは、perfコマンドの基本的な役割と、従来のツールとの違いについて説明する。

新人エンジニア
新人エンジニア

先輩、パフォーマンス調査で topvmstat はよく使うんですが、perf って何ができるんですか?

先輩エンジニア
先輩エンジニア

簡単に言うと、Linuxカーネルが提供するパフォーマンス計測ツールで、CPUやメモリの詳細なプロファイリングができる ツールだよ。例えば perf top を使えば、負荷の高い関数をリアルタイムに表示できるし、perf recordperf report を使えば、どの関数がどれだけCPUを使っているか詳細に分析できる。

新人エンジニア
新人エンジニア

なるほど、つまり top ではプロセス単位の負荷しか見えないけど、perf を使うと関数レベルまで掘り下げられるんですね。

先輩エンジニア
先輩エンジニア

そういうこと。特に perf はカーネルレベルの情報も取得できるから、ユーザープロセスだけでなく、システム全体のボトルネックを調査するのにも向いている。

perfコマンドの基本的な使い方は以下の記事で紹介しているのでよかったら見てみてください!

perfコマンドとは

カーネル提供のツール

Linuxカーネルが提供するパフォーマンス計測ツールです。

詳細な分析

CPUやメモリの詳細なプロファイリングができます。

関数レベルの分析

負荷の高い関数をリアルタイムに表示できます。

システム全体の分析

ユーザープロセスだけでなく、システム全体のボトルネックを調査できます。
perfコマンドとは
スポンサーリンク

従来のツールとperfの違い

パフォーマンス調査にはいくつかのツールがあるが、それぞれの特徴を簡単に比較すると以下のようになる。

従来のツールとperfの違い

新人エンジニア
新人エンジニア

確かに、top ではプロセスのCPU使用率は分かりますが、どの関数が原因なのかまでは分かりませんね。

先輩エンジニア
先輩エンジニア

そうだね。例えば、アプリケーションが重いときに top で見ると、特定のプロセスがCPUを使いすぎているのは分かるけど、perf を使えば どの関数やコードが原因なのか まで特定できるんだ。

従来のツールとperfの違い

従来のツール

topやvmstatなどは、プロセス単位の負荷しか見えません。システム全体の概要を把握するのに適しています。

perfの特徴

関数レベルまで掘り下げた分析が可能です。カーネルレベルの情報も取得でき、システム全体のボトルネックを特定できます。
従来のツールとperfの違い
スポンサーリンク

事例紹介|perfコマンドを活用したリアルなトラブル対応

ここからは、実際に現場で遭遇したパフォーマンス問題を Linuxのperfコマンドを使ってどのように特定・解決したのか について紹介する。

  1. ケース1 CPU使用率が高いプロセスの特定
  2. ケース2 システム遅延の原因を特定する
  3. ケース3 ディスクI/Oの影響を評価する
perfコマンドの主な機能

perf top

リアルタイムで負荷の高い関数を表示します。

perf record

パフォーマンスデータを記録します。

perf report

記録したデータを分析し、レポートを生成します。

perf stat

CPUの詳細な動作状況を確認します。
perfコマンドの主な機能

ケース1 CPU使用率が高いプロセスの特定

ある日、社内のWebアプリケーションの動作が急激に遅くなったという報告が上がった。topコマンドで確認すると、あるプロセスがCPUを異常に消費している ことが判明した。しかし、なぜそのプロセスがCPUを大量に使っているのかは分からない。

このような場合、perfコマンドを使ってプロセスの詳細なCPU使用状況を分析することで、どの関数がボトルネックになっているのかを特定できる。

新人エンジニア
新人エンジニア

先輩、サーバーが重いって報告が来たんですけど、top で見ると myapp というプロセスがCPUを80%以上使っています。でも、どの処理が負荷をかけているのかが分かりません…

先輩エンジニア
先輩エンジニア

top でプロセス単位の負荷は分かるけど、どの関数が問題なのかは分からないよな。こういうときは perf top を使ってみよう。

CPU使用率が高いプロセスの特定

問題発見

Webアプリケーションの動作が急激に遅くなりました。

初期調査

topコマンドで特定のプロセスがCPUを異常に消費していることが判明しました。

perf topの活用

perf topを使用して、負荷の高い関数を特定しました。

詳細分析

perf recordとperf reportを使用して、メモリ確保のコストが高いことを発見しました。
CPU使用率が高いプロセスの特定
スポンサーリンク

調査 perf top で負荷の高い関数を特定

まず、リアルタイムでどの関数がCPUを多く使っているかを調べるために、perf top を実行した。

sudo perf top

すると、次のような出力が得られた。

  40.12%  myapp     [.] process_data
  30.89%  myapp     [.] parse_request
  15.47%  libc-2.31.so [.] malloc
  10.00%  myapp     [.] database_query

この結果から、myappprocess_data という関数がCPUを最も消費していることが分かった。

新人エンジニア
新人エンジニア

この process_data という関数が一番CPUを使っていますね。でも、具体的に何が原因なんでしょうか?

先輩エンジニア
先輩エンジニア

perf top は関数レベルの情報は分かるけど、詳しい実行時間やどこで時間がかかっているかまでは分からない。次に perf record を使って詳細なプロファイリングをしよう。

詳細分析 perf recordperf report を活用

次に、perf record を使ってアプリケーションの動作を一定時間記録し、その結果を perf report で分析した。

sudo perf record -p $(pgrep myapp) -g -- sleep 10
sudo perf report

この結果、process_data 内の特定のループ処理がCPUを大量に消費していることが判明した。

# Overhead  Samples  Command  Shared Object    Symbol
# ........  .......  .......  ...............  .....................
    40.12%  1000     myapp    myapp           process_data
     30.89%  700     myapp    myapp           parse_request
     15.47%  400     myapp    libc-2.31.so    malloc

特に malloc が高頻度で呼び出されていることから、メモリ確保のコストが高く、CPUリソースを圧迫している ことが分かった。

新人エンジニア
新人エンジニア

malloc が頻繁に呼ばれているせいで process_data の処理が遅くなっているみたいですね。メモリ確保の最適化を考えたほうがよさそうです。

先輩エンジニア
先輩エンジニア

そうだな。例えば、頻繁にメモリ確保と解放を繰り返す処理があるなら、メモリプールを使うことで効率化できるかもしれない。

perfコマンドのオプションの使い方は以下の記事で紹介しているのでよかったら見てみてください!

スポンサーリンク

解決策 メモリ管理の最適化

この process_data 関数では、ループのたびに malloc でメモリ確保を行い、都度 free で解放していた。このような処理は、ヒープメモリの断片化を引き起こし、パフォーマンス低下の原因になる。

そこで、メモリプールを導入し、一定サイズのメモリを事前確保して使い回すように変更した。

// 修正前:毎回mallocとfreeを実行
void process_data() {
    for (int i = 0; i < 100000; i++) {
        char *buffer = (char *)malloc(1024);
        // データ処理
        free(buffer);
    }
}

// 修正後:メモリプールを利用
void process_data() {
    char *buffer_pool = (char *)malloc(1024 * 100000);
    for (int i = 0; i < 100000; i++) {
        char *buffer = buffer_pool + (i * 1024);
        // データ処理
    }
    free(buffer_pool);
}

この修正後、CPU使用率は 80% → 40% に低下し、アプリケーションのレスポンスが改善された。

新人エンジニア
新人エンジニア

malloc の呼び出し回数を減らすだけで、こんなにCPU負荷が下がるんですね。

先輩エンジニア
先輩エンジニア

メモリ管理は意外とCPU負荷に影響を与えるんだ。特に高頻度なデータ処理ではメモリプールを活用するのが効果的だよ。

ケース1:解決策と結果

メモリプールの導入

頻繁なメモリ確保と解放を避けるため、メモリプールを導入しました。

コード最適化

一定サイズのメモリを事前確保して使い回すように変更しました。

パフォーマンス改善

CPU使用率が80%から40%に低下し、アプリケーションのレスポンスが改善しました。
解決策と結果
スポンサーリンク

まとめ

  • 問題 アプリケーションのCPU使用率が異常に高く、レスポンスが遅い
  • 調査
    • perf top で負荷の高い関数 (process_data) を特定
    • perf record + perf reportmalloc の頻繁な呼び出しがボトルネックと判明
  • 解決策 メモリプールを導入し、メモリ確保の回数を削減

このように、perfコマンドを使うことで 「CPU使用率が高い」→「どの関数が負荷をかけているか」→「なぜ負荷が高いのか」 を段階的に調査し、最適な解決策を導き出すことができる。

次の事例では、システム全体のレスポンスが悪化した際に、perfを使ってどの処理が遅延しているかを特定したケース を紹介する。

perfコマンドの活用ポイント

問題の特定

パフォーマンス問題の兆候を見つけます。

初期調査

基本的なツールで概要を把握します。

詳細分析

perfコマンドで深堀りします。

原因特定

具体的なボトルネックを見つけます。

最適化

問題箇所を改善します。
perfコマンドの活用ポイント

ケース2 システム遅延の原因を特定する

ある日、社内のWebアプリケーションが全体的に遅くなっているという報告があった。調査のために topvmstat を確認したが、CPU使用率はそれほど高くなく、メモリの使用状況も特に問題はなさそうだった。

「CPU使用率が高いわけでもないのに、なぜかアプリのレスポンスが遅い」

このようなケースでは、CPU使用率だけでなく、CPUがどのように動作しているかを詳しく調べる必要がある。このとき役に立つのが perf stat だ。

新人エンジニア
新人エンジニア

先輩、Webアプリのレスポンスが全体的に遅いって報告がありました。でも、top を見てもCPU使用率はそれほど高くなくて、負荷が原因には見えないんです。

先輩エンジニア
先輩エンジニア

CPU使用率だけじゃ問題の本質は分からないことがある。例えば、CPUは使われていないのに、メモリやキャッシュの問題で処理が遅くなることがあるんだ。

新人エンジニア
新人エンジニア

CPUが100%に張り付いているなら分かりやすいんですが、負荷が低いのに遅いのは原因が特定しづらいですね…。

先輩エンジニア
先輩エンジニア

こういうときは perf stat を使うと、CPUの実際の動作状況が見えてくる。

ケース2:システム遅延の原因特定

問題発見

Webアプリケーションが全体的に遅くなっていました。

初期調査

topやvmstatでは特に問題が見つかりませんでした。

perf statの活用

perf statを使用してCPUの詳細な動作を確認しました。

原因特定

キャッシュミスが異常に多いことが判明しました。
システム遅延の原因特定
スポンサーリンク

調査 perf stat でCPUの詳細な動作を確認

まず、遅延が発生している myapp プロセスの動作を分析するために、perf stat を実行した。

sudo perf stat -p $(pgrep myapp) -- sleep 10

10秒間の計測後、次のような結果が出た。

 Performance counter stats for process 1234 (myapp):

       2,500,000      cycles                   
       1,000,000      instructions             
          25.00      instructions per cycle    
     500,000,000      cache-references        
     400,000,000      cache-misses            

   10.002424199 seconds time elapsed

特に注目すべきは cache-misses(キャッシュミス)が400,000,000回 と異常に多いことだった。

新人エンジニア
新人エンジニア

キャッシュミスの回数がすごく多いですね…。これが原因ですか?

先輩エンジニア
先輩エンジニア

そうだな。通常、CPUの処理はキャッシュを使うことで高速化される。でも、キャッシュミスが多発すると、CPUがメインメモリからデータを読み込むことになり、処理速度が大幅に落ちる。

新人エンジニア
新人エンジニア

CPU自体の負荷は低いのに、キャッシュミスのせいで待ち時間が増えていたんですね。

先輩エンジニア
先輩エンジニア

その通り。これが ‘CPUスタル(CPUが仕事をせず待機する時間)’ の原因になっているんだ。

問題の原因 データのアクセスパターンが非効率だった

アプリケーションのコードを確認すると、大量のデータを逐次処理するループ処理があり、メモリアクセスのパターンが悪かった ことが分かった。

// 修正前:キャッシュ効率が悪いアクセス
int matrix[1000][1000];
for (int i = 0; i < 1000; i++) {
    for (int j = 0; j < 1000; j++) {
        sum += matrix[j][i];  // 列優先のアクセス
    }
}

このコードでは、行ではなく列ごとにアクセスしているため、CPUキャッシュに乗りにくい。メモリは通常、行単位でキャッシュされるため、このようなアクセスをするとキャッシュミスが多発する。

そこで、アクセスの順序を最適化 し、キャッシュに乗りやすくした。

// 修正後:キャッシュ効率が良いアクセス
int matrix[1000][1000];
for (int i = 0; i < 1000; i++) {
    for (int j = 0; j < 1000; j++) {
        sum += matrix[i][j];  // 行優先のアクセス
    }
}

この修正後、perf statcache-misses の数が 400,000,000 → 50,000,000 に減少し、アプリケーションのレスポンスが劇的に向上した。

新人エンジニア
新人エンジニア

コードのアクセス順を変えるだけで、キャッシュミスの回数が減るんですね。意外と簡単な改善策でした。

先輩エンジニア
先輩エンジニア

こういうメモリアクセスの最適化は、データ処理が多いアプリケーションでは重要なんだ。CPU使用率だけ見ていると見逃しがちだから、perf stat のようなツールを使って内部の動きを見ることが大事だよ。

ケース2:解決策と結果

問題の原因

データのアクセスパターンが非効率でした。列優先のアクセスがキャッシュミスを引き起こしていました。

コード最適化

行優先のアクセスに変更し、キャッシュ効率を向上させました。

パフォーマンス改善

キャッシュミスが大幅に減少し、アプリケーションのレスポンスが劇的に向上しました。
解決策と結果
スポンサーリンク

まとめ

  • 問題 CPU使用率は低いのに、Webアプリのレスポンスが悪化
  • 調査
    • perf stat を実行し、cache-misses が異常に多いことを特定
  • 原因 メモリアクセスのパターンが悪く、キャッシュミスが多発
  • 解決策
    • 行単位でデータを処理するようにコードを修正し、キャッシュ効率を向上
    • キャッシュミスを削減し、アプリケーションの処理速度を改善

このように、CPU使用率だけでは見えないボトルネックを perf stat で可視化することで、適切な最適化を行うことができる

次の事例では、ディスクI/Oの影響がアプリのパフォーマンスに与えた影響を perf trace を使って調査したケース を紹介する。

perfコマンドの威力

詳細な分析

関数レベルまでの深い洞察が可能です。

隠れた問題の発見

CPU使用率だけでは見えない問題を特定できます。

効果的な最適化

正確な原因特定により、的確な改善が可能です。

システム全体の把握

ユーザープロセスからカーネルまで、幅広い分析ができます。
perfコマンドの威力

ケース3 ディスクI/Oの影響を評価する

ある日、社内のデータ処理バッチが いつもより極端に遅くなっている という報告が上がった。通常であれば30分程度で完了する処理が、2時間経っても終わらない状態だった。

まずは top コマンドを確認したが、CPU使用率はそれほど高くなく、vmstat でメモリやCPUの負荷を見ても特に異常は見られなかった。しかし、iostat でディスクI/Oの状況を確認すると、ディスクのI/O待ち時間(await)が異常に長くなっている ことが分かった。

このようなケースでは、ディスクI/Oがボトルネックになっている可能性が高いため、perf trace を使ってアプリケーションがどのようなI/O操作をしているのかを詳しく調査することにした

新人エンジニア
新人エンジニア

先輩、データ処理バッチの実行時間が異常に長くなっています。でも、top を見てもCPUはそんなに使われていなくて、何が原因なのか分かりません。

先輩エンジニア
先輩エンジニア

CPUがボトルネックになっていないなら、I/Oが原因かもしれない。iostat を見て、ディスクの待ち時間を確認してみよう。

新人エンジニア
新人エンジニア

iostat -x 1 を実行したら、await の値が1000ms以上になっていました。ディスクのI/O待ち時間が長すぎるみたいです。

先輩エンジニア
先輩エンジニア

それは怪しいな。次に perf trace を使って、どのシステムコールがディスクI/Oを発生させているのか調べよう。

ケース3:ディスクI/Oの影響評価

問題の発生

通常30分で完了するデータ処理バッチが2時間経っても終わらない状態になりました。topコマンドではCPU使用率に異常は見られませんでした。

iostatによる調査

iostatコマンドを使用して、ディスクI/Oの状況を確認したところ、ディスクのI/O待ち時間(await)が異常に長くなっていることが分かりました。

perf traceの使用

ディスクI/Oがボトルネックになっている可能性が高いため、perf traceを使用してアプリケーションのI/O操作を詳しく調査することにしました。
ディスクI/Oの影響評価
スポンサーリンク

調査 perf trace でシステムコールを監視

perf trace を実行し、遅延が発生しているバッチプロセス(mybatch)がどのようなシステムコールを実行しているのかを調査した。

sudo perf trace -p $(pgrep mybatch)

すると、次のような出力が得られた。

  1234.567 (mybatch)  read(3, 0x7ffc5d8a0000, 4096) = 4096
  1234.568 (mybatch)  read(3, 0x7ffc5d8a1000, 4096) = 4096
  1234.569 (mybatch)  fsync(3) = 0
  1234.570 (mybatch)  read(3, 0x7ffc5d8a2000, 4096) = 4096
  1234.571 (mybatch)  read(3, 0x7ffc5d8a3000, 4096) = 4096
  1234.572 (mybatch)  fsync(3) = 0

特に fsync() の呼び出しが頻繁に発生していることに注目した。

新人エンジニア
新人エンジニア

fsync(3) = 0 っていうシステムコールがすごく多いですね。これは何をしているんですか?

先輩エンジニア
先輩エンジニア

fsync() は、データをディスクに確実に書き込むためのシステムコールだ。頻繁に呼び出されると、ディスクI/Oの負荷が高くなる。

新人エンジニア
新人エンジニア

なるほど。ということは、この処理が頻繁にディスク書き込みをしているせいで、I/Oが詰まっているんですね。

先輩エンジニア
先輩エンジニア

そうだな。バッチ処理のコードを見て、fsync() をどこで使っているか確認しよう。

perfコマンドの出力結果の見方は以下の記事で紹介しているのでよかったら見てみてください!

perf traceによるシステムコール監視

perf traceの実行

遅延が発生しているバッチプロセス(mybatch)のシステムコールを監視するため、perf traceを実行しました。

fsync()の頻発

調査の結果、fsync()システムコールが頻繁に呼び出されていることが分かりました。これがディスクI/Oの負荷を高めている原因でした。

コードの確認

バッチ処理のコードを確認すると、ログファイルに書き込むたびにfsync()を実行していたことが判明しました。
perf traceによるシステムコール監視
スポンサーリンク

問題の原因 fsync() の頻繁な呼び出し

バッチ処理のコードを確認すると、ログファイルに書き込むたびに fsync() を実行していた。

// 修正前:毎回fsyncを実行
void write_log(const char *message) {
    FILE *fp = fopen("/var/log/mybatch.log", "a");
    if (fp) {
        fprintf(fp, "%s\n", message);
        fflush(fp);
        fsync(fileno(fp));  // 毎回ディスクに強制書き込み
        fclose(fp);
    }
}

このコードでは、ログを1行書き込むたびに fsync() を実行しているため、ディスクへの書き込みが頻発し、I/O待ち時間が長くなっていた

解決策として、バッファを活用し、一定間隔でまとめて書き込む ように変更した。

// 修正後:一定間隔でfsyncを実行
void write_log(const char *message) {
    static FILE *fp = NULL;
    static int count = 0;

    if (!fp) {
        fp = fopen("/var/log/mybatch.log", "a");
    }

    if (fp) {
        fprintf(fp, "%s\n", message);
        count++;

        if (count % 100 == 0) {  // 100回に1回fsyncを実行
            fflush(fp);
            fsync(fileno(fp));
        }
    }
}

この修正後、ディスクI/Oの負荷が大幅に軽減され、バッチ処理の実行時間が 2時間 → 35分 に改善された。

新人エンジニア
新人エンジニア

ログの書き込みをまとめるだけで、こんなに速くなるんですね。

先輩エンジニア
先輩エンジニア

fsync() は確実にデータを書き込むための大事な操作だけど、頻繁に実行するとディスク負荷が高くなる。バッファリングをうまく活用するのがポイントだよ。

問題の原因と解決策

問題の原因

ログを1行書き込むたびにfsync()を実行していたため、ディスクへの書き込みが頻発し、I/O待ち時間が長くなっていました。

解決策

バッファを活用し、一定間隔でまとめて書き込むように変更しました。100回に1回fsync()を実行するようにコードを修正しました。
問題の原因と解決策
スポンサーリンク

まとめ

  • 問題 バッチ処理の実行時間が極端に長くなった
  • 調査
    • iostat でディスクI/O待ち時間 (await) の異常な増加を確認
    • perf tracefsync() の頻繁な呼び出しを特定
  • 原因 ログ書き込みごとに fsync() を実行し、ディスクI/Oが過負荷
  • 解決策
    • ログの書き込みをバッファリングし、fsync() の回数を削減
    • ディスク負荷を抑えることで、処理時間を 2時間 → 35分 に短縮

このように、ディスクI/Oの影響は topvmstat では見えにくいが、perf trace を使うことで どのシステムコールがボトルネックになっているかを特定できる

改善結果

修正前の処理時間

ディスクI/Oの負荷が高く、バッチ処理の完了に長時間を要していました。

修正後の処理時間

ディスクI/Oの負荷が大幅に軽減され、バッチ処理の実行時間が大幅に改善されました。
改善結果
スポンサーリンク

perfコマンドはどんな場面で役立つのか?

perfコマンドは、主に CPU・メモリ・I/O などのパフォーマンスボトルネックを特定する のに役立つ。
実際のトラブル対応事例を振り返ると、以下のような場面で有効だった。

ケース問題の症状使用したperfコマンド特定した原因解決策
CPU負荷が高い特定のプロセスがCPUを占有perf top, perf recordmalloc() の多発によるCPU負荷メモリプールの導入
システム遅延が発生CPU使用率は低いが遅いperf statキャッシュミスの多発メモリアクセスの最適化
ディスクI/Oが遅いバッチ処理が遅延perf tracefsync() の頻繁な実行ログ書き込みのバッファリング

このように、perfを使うことで 「どこに問題があるのか」→「なぜその問題が起きているのか」 まで特定しやすくなる。

新人エンジニア
新人エンジニア

今まで topvmstat でしか調査していませんでしたが、perf を使うとより細かく原因を特定できますね。

先輩エンジニア
先輩エンジニア

そうだな。単に ‘CPUが高い’ だけじゃなくて、perf を使えば ‘どの関数が負荷をかけているか’ まで分かる。特にパフォーマンス問題を迅速に解決したいときに役立つ。

新人エンジニア
新人エンジニア

でも、perfコマンドってたくさんオプションがあって、どれを使えばいいのか迷いそうです。

先輩エンジニア
先輩エンジニア

最初は perf top で負荷の高い関数をざっくり確認して、必要に応じて perf statperf record を使う、という流れを覚えておくといいよ。

perfコマンドの活用場面

CPU負荷が高い場合

特定のプロセスがCPUを占有している状況で、perf topやperf recordを使用してCPU負荷の原因を特定します。

システム遅延が発生した場合

CPU使用率は低いが遅い場合、perf statを使用してキャッシュミスなどの問題を特定します。

ディスクI/Oが遅い場合

バッチ処理が遅延している場合、perf traceを使用してI/O操作の問題を特定します。
perfコマンドの活用場面
スポンサーリンク

現場での活用ポイントと注意点

実際に現場でperfを活用する際に、気をつけるべきポイントをいくつかまとめる。

1. いきなり perf record を実行しない

perf record は詳細なプロファイリングができるが、ログの取得に時間がかかる ため、まずは perf top で概要をつかむのが効率的。

2. perf stat でCPUの動作状況をチェックする

CPU使用率が低いのに遅い場合は、キャッシュミスやブランチミス が原因のことが多い。
perf statinstructions per cycle (IPC) を確認すると、CPUが効率的に動作しているかが分かる。

3. ディスクI/Oが怪しいときは perf trace を使う

perf traceどのシステムコールが頻繁に呼ばれているか を見ると、I/Oのボトルネックを特定しやすい。
fsync() のようなディスク書き込み処理が過剰に発生していると、I/Oが詰まる原因になる。

4. カーネルレベルの調査が必要なら perf sched も活用する

perf sched recordプロセスのスケジューリング を記録できるため、CPUがスリープ状態に入る原因を特定できる。

新人エンジニア
新人エンジニア

perf って便利ですが、どこまで詳細に調査するべきか迷いそうです。

先輩エンジニア
先輩エンジニア

基本は ‘軽い調査 → 詳細調査’ の順番でやるといいよ。最初に perf top で概要をつかんで、問題の兆候があれば perf statperf trace で掘り下げる。perf record は最後の手段だ。

新人エンジニア
新人エンジニア

なるほど。最初から詳細なログを取ると、余計な時間がかかるんですね。

先輩エンジニア
先輩エンジニア

そういうこと。トラブル対応のときは 素早く問題の全体像を把握することが重要 だからな。

perfコマンドの活用ポイント

perf topで概要把握

まずはperf topで負荷の高い関数をざっくり確認します。

perf statでCPU動作確認

instructions per cycle (IPC)を確認し、CPUが効率的に動作しているかを判断します。

perf traceでI/O調査

ディスクI/Oが怪しい場合、頻繁に呼ばれているシステムコールを特定します。

perf schedで詳細調査

必要に応じて、プロセスのスケジューリングを記録し、CPUのスリープ状態の原因を特定します。
perfコマンドの活用ポイント
ゴリタンが愛用しているLinuxの教科書たち
https://amzn.to/4hBQa2y
https://a.r10.to/hkpc1F

この記事も参考になるかも!
この記事を書いた人!

ゴリタン

インフラエンジニアとして、ネットワークとサーバーの運用・保守・構築・設計に幅広く携わり、
現在は大規模政府公共データの移行プロジェクトを担当。

CCNPやLPICレベル3、AWSセキュリティスペシャリストなどの資格を保有しています。

あなたにオススメの広告
スポンサーリンク
Linux教科書