『詳解 システム・パフォーマンス 第2版』を読む:第4章 可観測性ツールの全容

Progress 11 / 13
目次

はじめに

[!NOTE] この記事は、筆者が鈍器本を読みながら書き殴った個人的な読書メモをAIに食べさせ、ブログ用に読みやすく再構成させたものです。

パフォーマンス障害が発生したとき、あてずっぽうでパラメータを変えたり、再起動して祈ったりするのは素人のやることですよね。私たちが真っ先にすべきことは、システムに破壊的な負荷(摂動)を与えることなく、内部で何が起きているかを冷徹に観察することです。

今回は、これからの章でCPUやメモリ、ネットワークを切り刻んでいくための武器である「4章 可観測性ツール」を取り上げます。

ツールが魔法のようにポンと答えを出してくれるわけではありません。ツールがカーネルの「どこから」データを取ってきているのか、その仕組み(情報ソース)とオーバーヘッドを理解していなければ、ツールの出力に騙されたり、本番環境をフリーズさせてしまったりすることがあります。現場で生き残るための可観測性の基礎をチートシート化しました。


1. 本番環境を救う「クライシスツール」

本番システムが火を吹いている最中に、「あ、ツールがインストールされてない」と気づくのは最悪の悪夢ですよね。サーバーがパフォーマンス障害を起こしている状態では、デバッグツールのパッケージインストールには絶望的に長い時間がかかり、危機がさらに長引いてしまいます。

  • 障害発生時に必要な「クライシスツール」は、あらかじめベースイメージに組み込んでおくべきです。
  • 昔ながらの sysstat(iostat, mpstat, pidstat, sar等)や procps(vmstat, top等)はもちろん、現代のLinux分析においては linux-tools-common(perf)と bcc-toolsbpftrace のインストールは絶対に欠かせません。

2. ツールの4象限:あなたの見ているデータは何か?

パフォーマンスツールは、そのデータ収集アプローチによって「システム全体か・プロセス単位か」「固定カウンタか・イベントベースか」の4象限に分類されます。自分が今、どの角度からシステムを見ているのかを常に意識せよ、ということですね。

  • 固定カウンタ(vmstat, iostatなど): カーネルが維持しているカウンタを読み出すだけなので、オーバーヘッドが極めて低いです。しかし、「なぜそうなったか」の詳細(コードパスなど)はわかりません。
  • プロファイリングとトレーシング: perf のように一定間隔(99Hzなど)でスナップショットを取っておおよその姿を描くのが「プロファイリング」、bpftrace のように発生したイベントをすべて記録するのが「トレーシング」です。
  • モニタリング(sarなど): sar(System Activity Reporter)のように、定期的にカウンタを記録・アーカイブして、過去の時系列のパターンやピークを振り返るためのものです。

3. カーネルの内部をのぞく窓「情報ソース」

ツールは魔法ではありません。裏側ではOSが提供するインターフェイスから情報を引っ張ってきているだけなのです。

  • /proc の罠: top などのツールは、この疑似ファイルシステムを読み出しています。手軽ですが、プロセス数が数万に及ぶシステムで top を実行すると、テキストのパース処理だけで top 自身がCPUを食いつぶすことがあります。これは笑えませんね。
  • 遅延アカウンティング: Linuxの強力な機能で、スレッドが「スケジューラでの順番待ち」「ブロックI/O」「スワッピング」で待たされた時間をナノ秒単位で正確に記録してくれます。
  • PMC(ハードウェアカウンタ): CPUの内部レジスタであり、キャッシュミスや命令数、メモリストールサイクルなど、ソフトウェアツールでは決して見えないハードウェアレベルの真実を暴き出します。

4. 静的 vs 動的インストルメンテーション

アプリケーションやカーネルの特定の処理をトラッキングするには、観測ポイントを仕掛ける(インストルメンテーション)必要があります。

  • 静的インストルメンテーション(トレースポイント / USDT): カーネルやユーザー空間のアプリのソースコードに、開発者があらかじめ埋め込んでおいてくれた観測ポイントです。オーバーヘッドも少なく安定しています。JVMやNode.jsもUSDTプローブを持っています。
  • 動的インストルメンテーション(kprobe / uprobe): 本番稼働中のカーネル関数(kprobe)やアプリケーションの関数(uprobe)に、オンデマンドでブレークポイントを挿入し、命令を書き換えて監視する究極の魔法です。ほかのツールでは見えない問題を解き明かす「最後の手段」ですが、APIが安定していないため注意が必要ですね。

おわりに

この章を読むことで、私たちが普段何気なく叩いている topiostat といったコマンドが、カーネルのどの情報をどうやって集計しているのかが手に取るようにわかります。