サーバーの1つで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
は、nfsを介して、2つのサーバー間で大量のアクティビティを示していますが、私が知る限り、そうすべきではありません。次のような多くのエントリ:
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などを使用して)、高負荷の特定の理由があるかどうかを確認するのに非常に役立つことがよくあります。
たとえば、次のようなものを使用できます。
tcpdump -w filename.cap "port 2049"
nFSトラフィック(ポート2049上)のみをキャプチャファイルに保存するには、Wiresharkを搭載したPCでそのファイルを開いて、より詳細に分析できます。前回同様の問題が発生したときは、一連の計算ジョブでした。ディスククォータを超えていた同じユーザーから、クライアント(18の異なるマシン)が何度も書き込みを試みていたため、古いNFSサーバーの負荷が非常に高くなりました。
あなたのためのツールのカップル:
lsof
は、開いているファイルハンドルを表示しますiotop
は、プロセスごとのI/O統計を最上位で表示しますnethogs
は、プロセスごとのネットワークトラフィックを表示しますstrace
を使用すると、プロセスが何をしているかを確認できますもう1つの便利なツールはstraceです。これは、プロセス(およびそのフォークされた子)が行っているすべてのシステムコール(ファイルアクセスなど)を表示します。例えば:
[root @ localhost〜] #strace -f -p 2770
(ただし、出力のロットを期待します)