Назад | Перейти на главную страницу

Как lsof может сообщать о большем количестве открытых файлов, чем разрешено в ulimit?

Как lsof может сообщать о большем количестве открытых файлов, чем указано в ulimit?

prod_web3(i-ca0b05aa):~$ sudo lsof | wc -l
4399
prod_web3(i-ca0b05aa):~$ ulimit -n
1024

На странице руководства ulimit builtins

The ulimit builtin provides control over the resources available to the shell 
and to processes started by it on systems that allow such control.

Ваш lsof Команда перечисляет все открытые файлы для всех процессов для всех пользователей в системе. Вы не сравниваете подобное с подобным.

Распространенная ошибка при сравнении результатов сырых lsof звонок с предполагаемым лимитом.

Для глобального предела (/proc/sys/fs/file-max) вам следует взглянуть на /proc/sys/fs/file-nr -> первое значение указывает, что используется, а последнее значение - предел

Ограничение OpenFile есть для каждого процесса, но оно определяется пользователем, см. Команду ulimit -Hn для пользовательских ограничений и посмотреть /etc/security/limits.conf для определений. Обычно применяется с «пользователем приложения», например: «tomcat»: установите ограничение на 65000 для пользователя tomcat, которое будет применяться к запускаемому им java-процессу.

Если вы хотите проверить ограничение, примененное к процессу, получите его PID, а затем выполните: cat /proc/${PID}/limits Если вы хотите проверить, сколько файлов открывает процесс, получите его PID, а затем od: ls -1 /proc/{PID}/fd | wc -l (примечание: для ls это "минус один", не путать с "минус эль")

Если вы хотите узнать подробности с lsof но только для тех файловых обработчиков, которые учитывают ограничение, попробуйте следующие команды:

  • lsof -p ${PID} | grep -P "^(\w+\s+){3}\d+\D+"
  • lsof -p ${PID} -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -a

Примечание: «файлы» - это файлы / pipe / tcp connections / и т. Д.

Обратите внимание, что иногда вам, вероятно, потребуется быть root или использовать sudo чтобы получить правильный результат для команд. Без привилегий иногда не бывает ошибок, только меньше результатов.

Наконец, если вы хотите знать, к каким «файлам» в вашей файловой системе обращается процесс, взгляните на: lsof -p {PID} | grep / | awk '{print $9}' | sort | uniq

радоваться, веселиться !

Встроенная функция bash (1) ulimit определяет максимальное количество открытых файлов для каждого процесса.

Это ни в коем случае не общесистемная настройка.

Хотя это и старый, я хотел задать тот же вопрос ... в моем случае ответ неудовлетворительный, так как происходит следующее:

$ sudo su tomcat -c "ulimit -n"
1024
$ lsof -u tomcat
3967

Я не совсем уверен, почему это произошло. Я предполагаю, что открытые файлы из подпроцесса не учитываются в родительском.