![包装命令来记录命令的网络使用情况](https://linux22.com/image/732783/%E5%8C%85%E8%A3%85%E5%91%BD%E4%BB%A4%E6%9D%A5%E8%AE%B0%E5%BD%95%E5%91%BD%E4%BB%A4%E7%9A%84%E7%BD%91%E7%BB%9C%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5.png)
是否有类似的命令time
可以记录进程的网络 I/O 统计数据并在退出时打印它们?
Linux(和其他 *nix)有time
命令可以让你记录执行时间 - 不仅仅是挂钟时间,还有内核和系统 CPU 时间、内存分配、磁盘 I/O 活动等等。它很有用,因为它可以作为一个简单的命令包装器运行,还可以跟踪子命令。
例如
$ TIME="t=%E; I/O=%I:%O" time find $HOME > /dev/null
t=0:08.78; I/O=821408:0
但网络计数器仅%r
计数%s
send()/recv() 调用;没有 TCP 和数据量。因此它们对网络活动无用。
我已经确认
TIME="t=%E; I/O=%I:%O" time wget $somewebsite -O /dev/null
套接字读/写不计入 I/O,虚拟设备也不计入。stdio 也是如此。它似乎只跟踪文件系统的读写。
但是我可以在哪里获取网络统计信息?
我知道我可以使用许多工具,例如:
wireshark
/tshark
/tcpdump
ss
/netstat
lsof
nethogs
/iptraf
/iftop
/tcptrack
strace
(缓慢、细粒度)
但它们都无法简单地仅针对一个进程或进程树并记录其生命周期内的总网络活动。
我知道可以将其设置socat
为代理。但那也非常不方便;它不能仅作为包装器运行。
perf
可以做到这一点,但它特定于平台并且可能很脆弱。
当然,有一些基本且常见的事情:
- 拦截网络呼叫
LD_PRELOAD
并收集统计数据;或者 - 使用网络命名空间 (Linux) 收集进程组的所有活动,并测量
?