sysprofでシステム全体の動作をプロファイリングする

 アプリケーションのプロファイリングを行うと、どの関数が最もCPU時間を消費しているかがわかる。つまり、最適化の労力はそうした部分のコードの高速化に集中させればよいわけだ。 sysprof を使えば、マルチスレッド化またはマルチプロセス化されたアプリケーションや、複数の部分から成る込み入ったサーバアプリケーションなど、マシンで実行中のすべてのアプリケーションをプロファイリングできる。sysprofは、それらアプリケーションの実行時にどれほどの時間がそれぞれのライブラリや関数に使われているかという情報を収集してくれる。

 sysprofはカーネルモジュールと、プロファイリングを実行できるグラフィカルなGTK+インタフェースの双方から成り、Ubuntu、openSUSE 10.3、Fedora用のパッケージが揃っている。sysprofを最大限に活用するには、プロファイリングを行うすべてのアプリケーションについてデバッグ情報を用意する必要もある。デバッグ情報がないと、プロファイル情報には共有ライブラリの名前しか表示されず、そのライブラリ内のどの関数が最も時間を消費しているかはわからない。sysprofの柔軟性は非常に高く、配備済みシステムにこうしたデバッグ情報(debuginfo)パッケージを一時的にインストールしてプロファイリングを開始し、システム動作速度低下の原因を探ることができる。

 デバッグ用パッケージのインストール後は、次の2つのステップで起動と実行を行う。まず「modprobe sysprof-module」としてカーネルモジュールを挿入し、続いてsysprofコマンドの実行によってグラフィカルインタフェースを起動して、ツールバーの「Start」ボタンをクリックする。この時点から、マシンのあらゆる動作がsysprofによる監視とプロファイリングの対象となる。

sysprof_thumb.png
sysprof

 sysprofによるプロファイル情報の記録が始まったら、プロファイリング対象となるアプリケーションを起動して普段どおりに操作を行う。プロファイルを取りたい作業の実行が済んだら、ツールバーのプロファイルボタンをクリックする。すると、sysprofによるシステムの監視が中止され、記録されたプロファイルデータを参照できるようになる。また、記録されたプロファイルデータの保存や読み込みも可能だ。プロファイル情報はXML形式で保存される。読み込み時に解決が必要なシンボル参照は一切なかったので、このXMLファイルの分析は保存を行ったマシンとは別のマシンでも行えるはずだ。

 sysprofの残りの機能は、記録したプロファイルの分析に関係している。sysprofウィンドウは3つの主要セクションに別れており、それらは「Funcions(関数)」、「Callers(呼び出し元)」、「Descendants(子孫)」の各リストになっている。分析の作業は関数リストから始める。デフォルトでは、実行された関数が総実行時間の長いものから順に一覧表示される。このリストには、実行可能なプロセス、共有ライブラリ、カーネル自身の実行時間も表示される。

 いずれかの関数をクリックすると、画面の右側に子孫プロセスのリストが現れる。関数リスト内のプロセスをクリックした場合は、左下の呼び出し元リストに「<spontaneous>」と表示される。関数または子孫のリストで、たとえば「f」という関数をクリックすると、この関数「f」を呼び出すすべての関数が呼び出し元リストに表示される。

 私の環境では「rmmod sysprof_module」の実行後にカーネルのOopsメッセージが出たので、プロダクション環境でのsysprofの使用は避けたほうがいいかもしれない。このOopsメッセージはすべてのコンソールに出力されたが、それでもシステムの利用やリブートは普通に行えた。その後モジュールの削除と再挿入のテストを行った際にはOopsはもう発生しなかったが、システムは初回のリブートなしではもはや使えない状態になってしまった。

 いくつか簡単な機能強化を施せば、sysprofはもっと優れたものになるだろう。まず、参照済みのプロファイル情報間を自在に行き来できる戻る/進むのボタンがインタフェースにあるとすばらしい。また、プロファイルの記録がコマンドラインから実行できれば、グラフィカルなクライアントのリモート実行に必要なX Windowライブラリがインストールされていないサーバでもプロファイリングが簡単に行えるようになる。コンソールクライアントがあれば、自動記録も容易になるはずだ。また、残念なことにsysprofはi386およびx86-64アーキテクチャにしか対応していない。ARMプラットフォームでも間違いなく役に立つはずなのだが。

 sysprofはすでに多くのディストリビューションにパッケージングされており、アプリケーションの再コンパイルが不要なので、すぐにでもパフォーマンスのボトルネック調査に利用できる。

Ben Martinは10年以上もファイルシステムに携わっている。博士号を持ち、現在はlibferrisや各種ファイルシステム、検索ソリューションを中心としたコンサルティングサービスを提供している。

Linux.com 原文