Когда я смотрю 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
А tcpdump | 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) и посмотреть на него, чтобы узнать, есть ли конкретная причина высокой нагрузки.
Например, вы можете использовать что-то вроде:
tcpdump -w filename.cap "port 2049"
чтобы сохранить только трафик NFS (находящийся на порту 2049) в файл захвата, затем вы можете открыть этот файл на ПК с помощью Wireshark и проанализировать его более подробно - в последний раз, когда у меня была похожая проблема, это была куча вычислительных заданий от того же пользователя, у которого превышена дисковая квота, а клиенты (18 разных машин) снова и снова пытались записать, что очень сильно увеличивало нагрузку на старый сервер NFS.
Пара инструментов для вас:
lsof
показывает вам открытые дескрипторы файловiotop
показывает статистику ввода-вывода по процессам в верхней частиnethogs
показывает сетевой трафик для каждого процессаstrace
позволяет вам видеть, что делает процессЕще один полезный инструмент - strace - он показывает все системные вызовы (доступ к файлам и т. Д.), Которые выполняет процесс (и его разветвленные потомки). Например:
[корень @ localhost ~] # strace -f -p 2770
(но ожидайте много вывода)