У меня давно запущенный процесс в 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