Linux服务器进程级流量统计方案咨询
Linux服务器进程级流量统计方案咨询
嗨,能理解你想用类似vnstat的方式,既看到服务器一段周期内的总流量,又能拆解到每个进程的流量占比——毕竟光有整体数据,排查问题或者做资源优化都没方向。结合你的需求,给你整理几个实用的方案:
一、现成工具直接上手,省心高效
- nethogs:绝对是你的首选!它专门针对进程级网络流量统计,默认就按进程分组展示实时上传/下载速度,还能看到进程对应的PID和命令。不需要提前配置,直接跑
sudo nethogs就能看到实时数据。如果要统计固定时间段(比如一天/一周)的累计流量,可以结合timeout命令把输出保存下来,之后再做汇总:
日志里会带时间戳和每个进程的实时流量,你可以用# 统计1小时的流量并保存到日志 sudo timeout 3600 nethogs -t > process_traffic.logawk之类的工具简单计算每个进程的累计总量。 - tcptop(基于eBPF):如果需要长期低开销的统计,这个工具更合适。它用eBPF技术追踪,性能消耗极低,能精准统计每个进程的TCP上传/下载流量,还能按流量排序。安装对应的包(比如
bpfcc-tools)后,直接运行sudo tcptop就能看到,加上-C参数可以只显示进程名,更简洁。 - 搭配vnstat使用:你可以继续用vnstat看整体网卡的总流量,用上面的工具看进程级细分,两者互补刚好满足你的需求。
二、自己写脚本的思路(适合定制化需求)
如果现成工具不能完全匹配你的定制化需求,也可以自己攒个脚本,核心逻辑是关联进程与网络连接,再统计对应流量:
- 建立进程与端口的映射:用
ss命令获取所有活跃连接对应的PID和进程名,保存成映射表:ss -tulnp | awk '{if($7 ~ /pid:/) {split($7, a, /[:,]/); print a[2], a[3]}}' | sort -u > /tmp/pid_process_map.txt - 统计每个连接的流量:可以用
iptables添加临时规则统计流量,或者用tcpdump抓包分析。不过后者性能开销大,不适合长期统计。更高效的方式是用eBPF工具(比如前面提到的tcptop)的输出作为数据源,它已经直接关联了进程和流量。 - 整合并计算汇总数据:把映射表和流量数据结合,用
awk或python脚本计算每个进程的总流量,最后输出总流量、各进程的流量值(MB)和占比百分比。
总结
如果追求简单快捷,直接用nethogs就能满足你的核心需求;如果需要长期、低开销的监控,优先考虑基于eBPF的tcptop;定制化需求的话,可以基于ss和流量统计工具自己写脚本。
备注:内容来源于stack exchange,提问作者manifestor
相关产品推荐
相关产品推荐

