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

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

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

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

Бег:

ulimit -a

показывает:

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

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

ulimit -n 2048

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

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

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

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)

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

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

*               hard    nofile             2048

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

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

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

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

ulimit -H -n 

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

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

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

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

ulimit -Hn 32768
ulimit -Sn 32768

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

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

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

@reboot $HOME/bin/my-program

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

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

root soft nofile 100000
root hard nofile 100000

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

Очень хорошая команда 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