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


15

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

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

Бег:

ulimit -a

шоу:

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

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

ulimit -n 2048

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

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

Ответы:


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)


Шахта показывает некоторые неприличные цифры здесь: 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. Для других процессов ответы должны помочь.


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

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


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.
Иван
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.