3

「netstat -p」と「lsof -n -i -P」の両方が、stat /proc/*/fd/*..

より効率的に行うにはどうすればよいですか?

私のプログラムは、どのプロセスがそれに接続しているかを知りたがっています。すべてのプロセスを何度もトラバースするのは効果がないように思えます。

iptables やカーネル パッチを提案する方法も歓迎します。

4

1 に答える 1

4

この回答を見てください。ここでは、ソケットからプロセスへのマッピングを実行するさまざまなメソッドとプログラムが言及されています。パフォーマンスを向上させるために、いくつかの追加の手法を試すこともできます。

  1. ファイル記述子を にキャッシュし/proc、情報を にキャッシュします/proc/net。これは、リンクされた回答に記載されているプログラムによって行われますが、プロセスが数秒以上続く場合にのみ実行可能です。
  2. を試すことgetpeername()もできますが、これは、考えられるエンドポイントとそれらがマップするプロセスを知っていることに依存しています。あなたの質問は、ソケットをローカルに接続していることを示唆しています。に渡すことでメッセージを交換するときにピアの資格情報を受け取ることができる Unix ソケットを使用してみてください。これらの例を見てみましょう (かなり厄介ですが、私が見つけることができる最高のものです)。 SO_PASSCREDsetsockopt()
  3. fs/proc/base.cLinuxカーネルを見てください。これは、 のファイル記述子に対する readlink の結果によって得られる情報の核心です/proc/PID/fd/FD。オーバーヘッドの重要な部分は、VFS レイヤーを上下する要求の受け渡し、与えられた情報を提供するすべてのカーネル データ構造で発生する多数のロック、およびカーネルとユーザー側での stringyfying と destringyfying です。このファイルのコードの一部を調整して、多くの中間層を使用せずにこの情報を生成できます。特に、ロックをプロセスごとに 1 回、または目的のデータ セット全体のスキャンごとに 1 回に最小限に抑えます。

私の個人的な推奨事項は、今のところ力ずくで実行することです。理想的には、プロセスを/proc逆の番号順にトラバースします。最近の興味深いプロセスほど PID が高くなり、目的の結果が見つかったらすぐに戻るためです。これを着信接続ごとに 1 回行うのは比較的安価ですが、実際にはアプリケーションのパフォーマンスがどれほど重要かによって異なります。netstat呼び出しをバイパスし、 から新しい接続を直接解析してから/proc/net/PROTO、 でソケットを見つけることは間違いなく価値があることがわかります/proc/PID/fd。すべてのトラフィックが localhost の場合は、Unix ソケットに切り替えて資格情報を直接取得してください。最後に保存するファイル記述子に関する大量のデータをダンプする新しい syscall または proc モジュールを作成します。

于 2010-10-30T03:43:09.133 に答える