2

TCP パフォーマンス モニター ツールを作成しようとしています。抽出したい主な値はtcpi_rtt tcp_info からのものです。

インプロセス ソケットの場合、これはgetsockopt(socket.SOL_TCP, socket.TCP_INFO)python のように取得できます。

しかし、外部プロセスはどうですか?TCP 接続の場合、root を使用した python の下でos.open(/proc/XXXX/fd/4)、ソケット i ノードに接続しようとしましたが、失敗しOSError: [Errno 6] No such device or address:ました。この方法は、通常の fd または stdin/stdout でのみ機能します。

Linuxで他のプロセスのtcp_infoを覗く一般的な方法はありますか?

4

1 に答える 1

0

あなたが求めていることを実行するPythonツールは私が知っているわけではありません。また、procディレクトリを自分で解析することを考える簡単な方法もありません。そのため、 ss コマンドの純粋な Python バージョンを自分で実装する (または、少なくとも /proc/<pid>/net/* の情報から RTT を計算する方法を理解する) か、その出力を解析することができます。私はどちらかというと bash 派なので、(RTT,PID) ペアのリストを取得するためにまとめたものを以下に示します。

#!/usr/bin/python
from subprocess import check_output as co

co("ss -tp > ss.out", shell=True)
rtts = co("cat ss.out | grep ESTAB | awk '{print $4}' | xargs -I {} ss -i 'src {}' | grep \"rtt:\" | awk '{print $4}' | cut -d : -f 2 | cut -d / -f 1", shell=True)
pids = co("cat ss.out | grep ESTAB | awk '{print $6}' | cut -d , -f 2", shell=True)

print zip(rtts.split('\n'), pids.split('\n'))

ss コマンドでは、-t は TCP 接続を表示することを意味し、-p は印刷プロセス (PID) 情報を意味します。-e オプションを使用すると、/proc/XXXX/fd/ 内のファイル記述子番号を決定するために使用できる inode 番号も取得できます。たとえば、i ノード番号 31159 のソケットに対応するファイル記述子番号 11 を使用して、マシンでプロセス 31117 を実行しています。

# ls -lah /proc/31117/fd/11
lrwx------ 1 root root 64 Dec 10 19:08 /proc/31117/fd/11 -> socket:[31159]

/proc/pid/fd/4 のようなソケット ファイルを「開く」ことができない理由は、これらがすべて存在しないファイルを指すリンクであるためです。それらから取得できる唯一の情報は、ソケットの名前 (inode 番号) です。

于 2013-12-11T01:22:34.397 に答える