2009-11-02 8 views
8

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

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

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

答えて

5

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

Taskstatsはユーザ空間に当たりタスクとカーネルから プロセスごとの統計送信するためのネットリンクベースのインタフェースです。

はTaskstatsは、次のような利点のために設計されました:

  • は、効率的にタスクの存続期間中および将来の会計パッチで使用するための複数の会計サブシステムのための統一されたインタフェース
  • 拡張
  • その終了時に統計を提供

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

これは、ディスクI/OとネットワークI/Oを区別しません。それが重要なのであれば、ソケット操作を追跡するLD_PRELOAD傍受ライブラリを使用することができます。あなたが観察したいプログラムの立ち上げを制御でき、あなたの背中の背後でトリッキーにならないと仮定します。

これでもまだ失敗しても、軽い解決策は考えられませんが、linux-auditは、グローバルにシステムコールをトレースすることができます。これは、自分のネットワークトラフィックを再キャプチャして分析するよりも直接的です。

+0

taskstatsは、ディスクのI/Oではなく、ネットとディスク – tuxx

+0

補正の両方が含まれていますカーネル内で簡単に変更できます)。とにかくありがとう。これはこれまでのところ最高の解決策と思われます。 – tuxx

2

linux trace toolkit(LTTng)を見てください。トレースポイントをカーネルに挿入し、いくつかの種類の統計情報を取得するための後処理があります。すべてをキャプチャすればトレースファイルは大きくなりますが、処理しているイベントの種類を制限すると、トレースファイルは管理しやすくなります。ネットワークの帯域幅について詳細は

http://lttng.org

...

2

This Superuser answerは、ネットワーク帯域幅の使用量を収集するために、処理の/ proc /ネット/ TCPを説明しています。

iptablesを使用してネットワークアカウンティングを行うことができます。、LWN'sLinux.com's、またはShorewall's記事)、プロセスごとにアカウンティングを行う実際的な方法はありません。

0

/procを読むことは、コードをカーネルに注入することなく、個々のプロセスでCPUとメモリの使用状況を監視する唯一の方法です。 top(1)を見ると、/ proc内のたくさんのファイルを読むのがまさに毎秒何をするのか見るでしょう。このような情報を取得するすべてのユーザーモードのツールとライブラリは、/ procから取得する必要があります。

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

0

私は同じことへの答えを探していたので、ちょうどこれを見つけました。単なるメモ -/procファイルシステムを使用しているときは、各読み取り後にファイルを閉じる必要はありません。あなたはファイルを開いたままにしておくことができます。読み込みを行うたびに新しい統計情報が得られます...統計情報を取得するたびに開閉のオーバーヘッドを取るべきではありません。 taskstatsモニターのみ/書き込みシステムコールを読んで、RECV /を送信し、友人ではない(しかし、この:あなたが例をしたい場合はNode.jsの上のjavascript ...

関連する問題