Слишком много открытых файлов в Debian

15

У меня давно запущен процесс в Debian. В какой-то момент выдается ошибка:

Слишком много открытых файлов.

Бег:

ulimit -a

шоу:

открыть файлы (-n) 1024

Я хочу увеличить количество открытых файлов в 2 раза. После исполнения

ulimit -n 2048

предел активен до конца моего сеанса, что неприменимо для задачи.

Как я могу навсегда увеличить количество открытых файлов?

FoxyBOA
источник

Ответы:

12

Если ваш процесс запускается через скрипт, вы можете поместить вызов ulimit в скрипт непосредственно перед выполнением демона.

Если вы хотите увеличить предел для своего пользователя или для всех пользователей, вы можете установить ограничения, которые применяются при pam_limitsвходе в систему. Они установлены в /etc/security/limits.conf. В вашем случае вы можете сделать что-то вроде:

*               hard    nofile             2048

Обратите внимание, что «жесткий» обозначает жесткий предел, который не может быть превышен и не может быть изменен. Мягкое ограничение может быть изменено пользователем (например, кем-либо без корневых возможностей), но не сверх жесткого ограничения.

Прочитайте limits.confдля получения дополнительной информации об использовании pam_limits.

Дэниел Лоусон
источник
На границах conf у меня есть 2 строки: * soft nofile 4096 * hard nofile 8192, которые не имеют никакого эффекта.
FoxyBOA
И вы вышли из системы и снова после тестирования? Это будет означать вход прямо из X / GNOME / KDE и т. Д., Если вы пытаетесь сделать это на локальной машине
Дэниел Лоусон,
Да. /etc/security/limits.conf не работает для меня. Я попробую второй подход.
FoxyBOA
3
/etc/security/limits.conf работает только для сервисов, которые используют pam и модуль pam pam_limits (см. /etc/pam.d/ для конфигурации PAM каждого сервиса и /etc/pam.d/common-* в частности) , Таким образом, он касается всех пользовательских сессий, созданных с помощью sshd, gdm, login и т. Д. Он не касается всех программ, запускаемых во время загрузки ...
Raphaël Hertzog
Я сказал что-то об этом, но спасибо за разъяснение. ОП не уточнил, является ли это служба или процесс, который запускает его пользователь.
Дэниел Лоусон
13

В ядре также установлен «общий максимум» открытых файлов, вы можете проверить текущие настройки с помощью:

cat /proc/sys/fs/file-max 

И установите новое значение с помощью:

echo "104854" > /proc/sys/fs/file-max

Если вы хотите сохранить конфигурацию между перезагрузками, добавьте

sys.fs.file-max=104854

в

/etc/sysctl.conf

Чтобы проверить текущее максимальное использование файла:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)
rkthkr
источник
1
Обратите внимание, что если отображаются свободно выделенные файловые дескрипторы 0, это просто означает, что количество выделенных файловых дескрипторов точно соответствует количеству используемых файловых дескрипторов.
Tacotuesday
Шахта показывает некоторые неприличные цифры здесь: 49152 0 18446744073709551615 . Я не понимаю, почему первые два столбца не складываются в третий. И если у меня есть 1,8 триллиона триллионов, я не понимаю, как я использовал их все.
mlissner
4

Как уже говорили другие, вы можете применять определенные ограничения для каждого пользователя или группы в /etc/security/limits.conf.

Примечание: ulimit -n показывает мягкий предел.

ulimit -H -n 

покажет вам жесткий лимит.

Это делает вывод ulimit -a и ulimit -n довольно запутанным, если, например, вы увеличили количество файлов с 1024 до 4096, как вы ожидаете увидеть вывод с жестким ограничением, но вы по-прежнему видите 1024, который является программным предел.

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

Том Файнер
источник
2

Имейте в виду, что если вы запустите ваш процесс с помощью start-stop-daemon, настройка ulimits в /etc/security/limits.conf не будет работать. Если вы, например, хотите увеличить лимит открытого файла для tomcat до 20000, вам нужно добавить их в строки /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

Я столкнулся с этой проблемой в Debian 6.0.4. Для других процессов ответы должны помочь.

Janning
источник
1

Это зависит от того, как вы начинаете свой длительный процесс. Если он запускается во время загрузки (с помощью скриптов /etc/rcX.d/*), то вы должны поместить в свой сценарий запуска вызов ulimit, так как ограничение по умолчанию установлено ядром, и оно не настраивается без перекомпиляции.

Использование /etc/security/limits.confможет работать, если вы используете его cronдля запуска, например, с такой записи:

@reboot $HOME/bin/my-program

Это должно работать, потому что /etc/pam.d/cron включает pam_limits.so.

Рафаэль Герцог
источник
-1

Вы можете добавить это в /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

сохраните и перезагрузите компьютер.

kxmp
источник
3
Есть ли здесь что-то новое, чего нет в принятом ответе на этот пятилетний вопрос?
Эндрю Шульман
-2

Очень хорошая команда, ulimit -nно есть проблема со слишком большим количеством соединений и слишком большим количеством открытых файлов:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
чат
источник
Я пытался очистить ваш ответ, но мне все еще неясно, что вы пытаетесь ответить на вопрос об оригинальных постерах. Можете ли вы попытаться исправить это дальше?
SLM
Также это вывод ulimit -a, а не ulimit -n.
Иван