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