了解 NFSD 进程实际上正在做什么?

了解 NFSD 进程实际上正在做什么?

当我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

(但预计很多输出)

相关内容