当我top
在我们的一台服务器上查看时,发现有很多 nfsd 进程正在消耗 CPU:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2769 root 20 0 0 0 0 R 20 0.0 2073:14 nfsd
2774 root 20 0 0 0 0 S 19 0.0 2058:44 nfsd
2767 root 20 0 0 0 0 S 18 0.0 2092:54 nfsd
2768 root 20 0 0 0 0 S 18 0.0 2076:56 nfsd
2771 root 20 0 0 0 0 S 17 0.0 2094:25 nfsd
2773 root 20 0 0 0 0 S 14 0.0 2091:34 nfsd
2772 root 20 0 0 0 0 S 14 0.0 2083:43 nfsd
2770 root 20 0 0 0 0 S 12 0.0 2077:59 nfsd
我如何知道这些实际上是什么正在做? 我可以查看每个 PID 正在访问的文件列表或其他任何信息吗?
我们开始了Ubuntu Server 12.04
。
我尝试过nfsstat
,但它并没有给我提供太多有关实际发生的情况的有用信息。
编辑-根据评论/答案尝试的其他内容:
lsof -p 2774
对每个 PID执行操作将显示以下内容:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nfsd 2774 root cwd DIR 8,1 4096 2 /
nfsd 2774 root rtd DIR 8,1 4096 2 /
nfsd 2774 root txt unknown /proc/2774/exe
这是否意味着没有文件被访问?
当我尝试查看某个进程时,strace -f -p 2774
出现了以下错误:
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Could not attach to process. If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf
Atcpdump | grep nfs
显示我们的两台服务器之间通过 nfs 进行了大量活动,但据我所知,它们不应该如此。很多条目如下:
13:56:41.120020 IP 192.168.0.20.nfs > 192.168.0.21.729: Flags [.], ack 4282288820, win 32833, options [nop,nop,TS val 627282027 ecr 263985319,nop,nop,sack 3 {4282317780:4282319228}{4282297508:4282298956}{4282290268:4282291716}], len
答案1
在这种情况下,我经常发现捕获 NFS 流量(例如,使用 tcpdump 或 Wireshark)并查看它是否有高负载的具体原因非常有用。
例如,您可以使用类似以下内容:
tcpdump -w filename.cap "port 2049"
只将 NFS 流量(在端口 2049 上)保存到捕获文件中,然后您可以在 PC 上使用 Wireshark 打开该文件并对其进行更详细的分析 - 上次我遇到类似的问题时,是同一个用户的一堆计算作业超出了磁盘配额,客户端(18 台不同的机器)一遍又一遍地尝试写入,从而大大增加了旧 NFS 服务器的负载。
答案2
为您提供以下几种工具:
lsof
显示打开的文件句柄iotop
以 top 方式显示进程级别的 I/O 统计信息nethogs
显示每个进程的网络流量strace
让你看到进程正在做什么
答案3
另一个有用的工具是 strace - 它将显示进程(及其分叉子进程)正在进行的所有系统调用(文件访问等)。例如:
[root@localhost ~]# strace -f -p 2770
(但预计很多输出)