Как найти процесс с максимальными дескрипторами файлов?

Я подозреваю, что у Вас есть процессор переменной частоты, который установлен на "ondemand" под Debian и "производительность" при Arch.

Можно изменить их непосредственно путем вписывания в новые настройки /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor, использование команды как cpufreq-set, или GUI как indicator-cpufreq.

3
21.10.2014, 16:13
2 ответа

Проблема заключается в обратных кавычках в разделе do ... done .

При написании сценария оболочки вам не нужно инкапсулировать блоки ( if; then ... fi , while; do ... done и т. Д.) В обратные кавычки. Это приводит к тому, что оболочка оценивает содержимое обратных кавычек, а затем выполняет это содержимое. Таким образом, обратные кавычки возвращают число (количество открытых файлов), а затем пытается запустить это число, в результате чего команда не найдена .

Таким образом, вы хотите:

for i in `ps aux | awk '{print $2}'` ; do lsof -p $i | wc -l ; done
5
27.01.2020, 21:14

(В вашем цикле обнаружено ``, что вызвало проблему с помощью подстановки команд, как отмечено val0x00ff и Patrick. Это уже вторая часть о поиске другого способа решения проблемы.)

Можно показать количество файловых скрипторов на процесс, используя lsof напрямую:

lsof -Fpcn | nawk '
 /^p/ { pid=substr($0,2) }
 /^c/ { cmd=substr($0,2) }
 /^n/ { fd[cmd"["pid"]"]++ }
 END  { for (cc in fd) printf("%-20s %i\n",cc,fd[cc]) } ' | sort -n -k 2

Это должно работать на большинстве *nix систем с lsof.

Опция -Fpcn выводит "machine readable" формат, который помечает каждую строку:

  • PIDs с ведущей "p"
  • командой (имя) выводит с ведущим "c"
  • файлом-дискаптором выводит с ведущим "n"

Скрипт awk отслеживает количество файловых дескрипторов с помощью ассоциативного массива (индексированного "command[pid]") и дает дамп массива на END{} входных данных.

Эти подсчеты FD часто будут отличаться от других методов, заметные ps или /proc/PID/fd, потому что lsof считает больше, чем просто реальные файловые дескрипторы, а файлы отображения памяти, в частности, скорее всего, будут сбрасывать ваши номера для некоторых процессов.

Если вам нужен точный подсчет реальных FD, вам нужно добавить "-d0-9999", чтобы ограничить вывод lsof только числовыми файловыми дескрипторами. Технически большое число должно быть, по крайней мере, максимальным количеством FD на процесс, возможно, это можно определить с помощью ulimit -n или getconf OPEN_MAX, но корень может изменить это. В Linux вы можете проверять лимиты каждого процесса в /proc/PID/limits, а в качестве верхнего лимита можно использовать /proc/sys/fs/file-nr.

Другие дешевые и жизнерадостные способы подсчета файловых дескрипторов на Linux-системе с помощью /proc:

(cd /proc; ls -d [0-9]* ) | while read pid; do set -- /proc/$pid/fd/*; echo $pid $#; done
ps axo "pid" | while [...]
1
27.01.2020, 21:14

Теги

Похожие вопросы