RedHat 7.9服务器NFS网络消耗的用户/进程级监控方案咨询
RedHat 7.9服务器NFS网络消耗的用户/进程级监控方案咨询
我太懂你这种困扰了——整个环境的用户家目录和工具全挂在NFS上,所有读写都走网络,一旦有人狂传大文件占满带宽,用nfsiostat只能看到NFS整体跑满了,却找不到是谁干的;tcpdump抓包分析又太繁琐,得一层层从网络包挖到NFS层再对应进程,效率极低;top更没用,只能看到nfsd这类系统进程,完全定位不到背后的用户和具体进程。
下面给你几个在RedHat 7.9上实用的方案,都是能直接关联到用户和进程的:
1. 用iotop定位NFS相关进程IO
iotop默认就能显示进程的IO情况,包括通过NFS发起的读写,它能直接显示进程的用户、PID、读写速率,完美符合你的需求:
- 直接执行
sudo iotop -oP,-o只显示有IO活动的进程,-P显示进程名而不是线程名 - 你会看到列表里的进程,对应到具体的用户,以及它们的
DISK WRITE/DISK READ速率——这里的DISK其实包含NFS挂载的文件系统,因为系统把NFS当作块设备来处理 - 如果要更精准过滤NFS相关的,你可以结合
grep,比如先找到NFS挂载点的inode,再用lsof关联,但iotop已经足够直观,大概率能直接找到狂写的进程和用户
2. 用fatrace追踪文件系统操作(含NFS)
fatrace能实时追踪所有进程的文件系统操作,包括NFS上的文件读写,而且能直接显示用户、进程和操作的文件路径:
- 先安装:
sudo yum install fatrace - 执行
sudo fatrace -w,-w只追踪写操作(你要找的是写大文件的情况) - 输出里会显示类似
user1(1234): W /home/user1/bigfile.iso的内容,直接就能看到哪个用户的哪个进程在写NFS上的大文件 - 如果想过滤特定NFS挂载点,比如
/home,可以加-m /home参数:sudo fatrace -w -m /home
3. 用SystemTap脚本精准关联NFS请求和进程/用户
如果上面的工具不够用,SystemTap可以写自定义脚本来直接捕获NFS的读写请求,关联到发起的进程和用户,RedHat 7.9自带SystemTap支持:
- 先安装依赖:
sudo yum install systemtap systemtap-runtime kernel-devel - 用这个简单的脚本(保存为nfs_user_monitor.stp):
probe nfs.write { printf("User: %s, PID: %d, Process: %s, File: %s, Size: %d bytes\n", uid_name($uid), $pid, execname(), $filename, $count) }
- 执行脚本:
sudo stap nfs_user_monitor.stp - 当有进程写NFS文件时,会输出对应的用户名、PID、进程名、文件路径和写入大小,完全精准定位
4. 用pcp(Performance Co-Pilot)做长期监控
如果需要长期监控,pcp是个不错的选择,它能收集NFS相关的详细指标,包括进程级的NFS活动:
- 安装:
sudo yum install pcp pcp-gui - 启动pmcd服务:
sudo systemctl start pmcd - 用
pminfo nfs.client查看可用的NFS客户端指标,其中包含进程相关的统计 - 也可以用
pmchart图形化工具,添加NFS进程相关的指标,直观查看历史数据里的高负载进程
这些方案里,iotop和fatrace是最快速上手的,能立刻帮你定位到问题用户和进程;SystemTap适合更复杂的场景,能精准捕获每一次NFS写操作;pcp则适合长期监控和分析。
备注:内容来源于stack exchange,提问作者iostrym




