我正在尝试制作TCP性能监控工具,我要提取的主要值是tcpi_rtt
from tcp_info
对于进程内套接字,可以像python
中的getsockopt(socket.SOL_TCP, socket.TCP_INFO)
一样获得
但外部流程怎么样?对于TCP连接,在使用root的python下,我尝试os.open(/proc/XXXX/fd/4)
套接字inode但未通过OSError: [Errno 6] No such device or address:
。此方法仅适用于常规fd或stdin / stdout。
是否有任何通用方法可以在linux上查看其他进程的tcp_info?
答案 0 :(得分:0)
我所知道的没有python工具可以满足您的需求,也没有一种简单的方法可以让您自己解析proc目录。因此,您可以自己实现ss command的纯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选项,您还可以获取inode编号,您可以使用该编号来确定/ proc / XXXX / fd /中的文件描述符编号。例如,我在我的机器上运行进程31117,文件描述符编号为11,对应于带有inode编号31159的套接字:
# 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编号)。