Как 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
Я не совсем уверен, почему это произошло. Я предполагаю, что открытые файлы из подпроцесса не учитываются в родительском.