当我在我们的一台服务器上查看top
时,有很多使用CPU的nfsd进程:
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
一个tcpdump | grep nfs
tcpdump | grep nfs
在我们的两台服务器之间显示了大量的tcpdump | grep 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
在这种情况下,我经常发现捕获NFSstream量非常有用(例如,使用tcpdump或Wireshark),并查看是否存在高负载的特定原因。
例如,你可以使用像这样的东西:
tcpdump -w filename.cap "port 2049"
为了仅将NFSstream量(在端口2049上)保存到捕获文件中,可以使用Wireshark在PC上打开该文件,并对其进行更详细的分析 – 上次出现类似问题时,这是一堆计算作业来自同一个超过磁盘配额的用户,并且客户端(18台不同的机器)反复尝试写入,从而使旧的NFS服务器的负载非常高。
几个工具给你:
lsof
向您显示打开的文件句柄 iotop
以最高的方式显示进程方面的I / O统计信息 nethogs
向您显示每个进程的networkingstream量 strace
允许你看到一个进程在做什么 另一个有用的工具是strace – 它将显示进程(及其分叉的subprocess)正在进行的所有系统调用(文件访问等)。 例如:
[root @ localhost〜]#strace -f -p 2770
(但期望很多的输出)