找出NFSD进程实际上在做什么?

当我在我们的一台服务器上查看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

(但期望很多的输出)