当我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
了,但它并没有给我太多关于实际情况的有用信息。
编辑 - 根据评论/答案尝试的其他内容:
对每个 PID执行lsof -p 2774
操作显示以下内容:
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
在这种情况下,我经常发现捕获 NFS 流量非常有用(例如,使用 tcpdump 或 Wireshark)并查看它以查看高负载是否存在特定原因。
例如,您可以使用以下内容:
仅将 NFS 流量(在端口 2049 上)保存到捕获文件中,然后您可以在 PC 上使用 Wireshark 打开该文件并对其进行更详细的分析——上次我遇到类似问题时,这是一堆计算工作来自超过磁盘配额的同一用户,并且客户端(18 台不同的机器)一遍又一遍地尝试写入,从而使旧 NFS 服务器上的负载变得非常高。
为您准备的几个工具:
lsof
显示打开的文件句柄iotop
以顶部方式显示进程级 I/O 统计信息nethogs
显示每个进程的网络流量strace
允许您查看进程正在做什么另一个有用的工具是 strace——它将显示一个进程(及其分叉的子进程)正在进行的所有系统调用(文件访问等)。例如:
[root@localhost ~]# strace -f -p 2770
(但期望有很多输出)