initなどの長期実行プロセスでは、次のことができます。
$ cat /proc/[pid]/io
短期プロセス(lsなどのコマンドラインユーティリティなど)の統計情報を表示するにはどうすればよいですか?このように短いプロセスのpidを見る方法さえわかりません...
答え1
デフォルトでは、実行時にアプリケーションI / Oプロファイリングに関する一般的なアドバイスが必要なようです。これでこれが完了したので、/proc/$PID/io
アプリケーションがディスクとメモリの間でどのくらいの帯域幅を使用しているかがわかります。このファイルをポーリングすると、プロセスが実行している操作のおおよそのアイデアを得ることができますが、ディスクまたはディスクからプッシュされるデータの量だけを表示するため、不完全な画像です。
お客様がリクエストした問題を解決するには、基本的に次のオプションがあります。
プラットフォームツールを使用してください。 LinuxでSystemTapスクリプトの作成機能は最も完全なソリューションですが、必要なコアレベルに応じて、目的のメリットを得るために実際に費やすよりも多くの作業が必要になる場合があります。
アプリベースの計測を使用します。これを行う方法はいくつかありますが、gprofについて人気のある選択です。一部のアプリケーションは独自のツールを提供するかもしれませんが、確認する必要があります。
おそらく最良の選択肢は、既存のプラットフォームインスツルメンテーションツールを一緒に使用して、望ましい効果を得て最大限に活用することです。
私はアプリケーションを起動し、これをすべて行うことができるプログラムを知りません(ないという意味ではなく、聞いたことがないという意味です)。したがって、最良の方法は、システム全体で収集を開始することです。情報を収集し、関心のあるPIDをフィルタリングすると、完全なサンプルが得られます。
execve
まず、起動したアプリケーションのPIDを保存できるように、呼び出し監査を有効にします。 PID があれば、監査を削除できます。
mount debugfs -t debugfs /sys/kernel/debug
を実行できるようにdebugfsを実行するには実行してくださいblktrace
。
私のシステムでこれを実行しましたが、blktrace -d /dev/sda -a read -a write -o - | blkparse -i -
それに応じて調整できます。以下は、blktrace出力のいくつかの例です。
8,0 15 3 1266874889.709440165 32679 Q W 20511277 + 8 [rpc.mountd]
上記の出力では、5番目の列(32679
)は書き込みを行ったアプリケーションに関連付けられているPIDです。私たちが興味を持っている部分はQ
(イベントタイプ、キューにあります)W
(RWBSフィールドで、W
そのフィールドに何もないので書き込みであることを示します。つまり、非同期であるS
ことを意味します)と20511277 + 8
(タスクはブロック番号20511277で始まり、20511277の間続きます別の8ブロック)。読み書きサイズを決定するには、ブロックを追加してブロックサイズを掛けます。
blktrace
また、スループット以上の情報を提供し、関心のあるマージに何が起こっているのかを確認することもできます。
blktraceが実行されたら、次のようにプロセスを作成できます。strace-cこれにより、各システムコール(read
およびタスクを含む)にwrite
関連する平均待ち時間に関するアイデアを得ることができます。遅延時間は、各呼び出しに必要な信頼性に応じて重要である可能性があり、アプリケーションを計測せずにアプリケーションが実行する作業(調整のためにナビゲートする必要がある領域の指摘)についてのより多くの情報を提供できます。
2つの間で、データの損失や他のアプリケーションのI / Oを含まずに、プログラムが何をしているのかについての良いアイデアが必要です。明らかに私が説明したより多くの方法がありますが、これは私の問題を解決した方法です。
blkparse
たとえば、スクランブル出力オプションを使用してI / O関連のレイテンシ測定値を収集することもできます。私は彼らと十分に遊んでいなかったのでそれをしなかった。
答え2
バックグラウンドでコマンドを起動し、変数から対応するpidを取得できます$!
。
例:
$ ls & cat /proc/$!/io
[1] 6410
rchar: 7004
wchar: 0
syscr: 13
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0