9

Linuxでプロセスリソースの消費(CPU、メモリ、ネットワーク帯域幅)を監視するための効率的なソリューションがあるかどうかを知りたいです。特定のPIDに対してこの監視を行うC++でデーモンを作成したいと思います。私の知る限り、古典的な解決策は/ procから定期的に情報を読み取ることですが、これは最も効率的な方法ではないようです(多くのシステムコールが含まれます)。たとえば、50プロセスのメモリ使用量を毎秒監視するには、/ procから毎秒50ファイル(つまり、150のシステムコール)を開いたり、読み取ったり、閉じたりする必要があります。これらのファイルを読み取るときに含まれる解析は言うまでもありません。

もう1つの問題は、ネットワーク帯域幅の消費です。これは、監視するプロセスごとに簡単に計算することはできません。NetHogsが採用したソリューションは、私の意見ではかなり高いオーバーヘッドを伴います。libpcapを使用してすべてのパケットをキャプチャして分析し、パケットごとにローカルポートを決定し、/procで検索して対応するプロセスを見つけます。

提示されたこれらの方法またはこの問題を処理するライブラリのより効率的な代替手段があるかどうか知っていますか?

4

5 に答える 5

5

/usr/src/linux/Documentation/accounting/taskstats.txt

Taskstatsは、カーネルからユーザースペースにタスクごとおよびプロセスごとの統計を送信するためのネットリンクベースのインターフェイスです。

Taskstatsは、次の利点のために設計されました。

  • タスクの存続期間中およびタスクの終了時に統計を効率的に提供します
  • 複数のアカウンティングサブシステム用の統合インターフェイス
  • 将来のアカウンティングパッチで使用するための拡張性

このインターフェイスを使用すると、選択したプロセスごとにCPU、メモリ、およびI/Oの使用状況を監視できます。単一のソケットでメッセージを設定して受信するだけで済みます。

これは、(たとえば)ディスクI/OとネットワークI/Oを区別しません。それが重要な場合は、LD_PRELOADソケット操作を追跡するインターセプトライブラリを使用することをお勧めします。もちろん、観察したいプログラムの起動を制御でき、それらがあなたの後ろでトリックを行わないことを前提としています。

それでも失敗する場合、軽量のソリューションは考えられませんが、linux-auditはシステムコールをグローバルにトレースできます。これは、独自のネットワークトラフィックを再キャプチャして分析するよりもかなり直接的に思えます。

于 2009-11-02T22:29:55.147 に答える
2

Linuxトレースツールキット(LTTng)を見てください。トレースポイントをカーネルに挿入し、後処理を行って、要求している種類の統計を取得します。すべてをキャプチャするとトレースファイルが大きくなりますが、準備するイベントの種類を制限すると、管理しやすくなります。

詳細についてはhttp://lttng.org ...

于 2009-11-05T16:08:45.210 に答える
2

ネットワーク帯域幅について: このスーパーユーザーの回答では、ネットワーク帯域幅の使用状況を収集するための/ proc / net/tcpの処理について説明しています。

iptablesを使用してネットワークアカウンティングを実行できることは知っていますが(たとえば、LWNLinux.comShorewallの記事を参照)、プロセスごとにアカウンティングを実行する実用的な方法はありません。

于 2009-11-05T16:27:09.737 に答える
0

同じことに対する答えを探していたときに、これに出くわしました。注意点-/procファイルシステムを使用する場合、読み取るたびにファイルを閉じる必要はありません。ファイルを開いたままにしておくことができ、読み取りを行うたびに新しい統計が取得されます...したがって、統計を取得するたびに開閉のオーバーヘッドが発生することはありません...私はこれを機能させています例が必要な場合は、node.jsのjavascript ...

于 2010-05-30T21:28:03.873 に答える
-1

/ procを読み取ることは、最終的に、コードをカーネルに挿入せずに、個々のプロセスによるCPUとメモリの使用量を監視する唯一の方法です。top(1)を見ると、/ proc内の多くのファイルを読み取ることが、まさに毎秒行われていることがわかります。この種の情報を取得するすべてのユーザーモードツールとライブラリは、/procから取得する必要があります。

ネットワーク帯域幅の使用と同様に、いくつかのアプローチがあります。これらのアプローチは、多かれ少なかれ、すべてのネットワークトラフィックをボックスの内外でキャプチャすることになります。トラフィックキャプチャのオーバーヘッドなしで、必要なタイプのカウントを正確に実行する特別なnetfilter(iptables)モジュールを作成することも検討できます。

于 2009-11-06T00:13:16.043 に答える