Достигнут лимит открытых файлов демона, хотя системные лимиты были увеличены

Достигнут лимит открытых файлов демона, хотя системные лимиты были увеличены

Я использую Debian wheezy. Лимиты файлов увеличены до 100000 для каждого пользователя. ulimit -aи ulimit -Hn/ -Snпоказывают мне правильные значения максимальных лимитов открытых файлов даже на экране. Но по какой-то причине я не могу иметь более ~4000 подключений / открытых файлов.

от sysctl.conf:

net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 500 65000
net.core.somaxconn = 81920

Вывод ulimit -a:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 256639
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 999999
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 256639
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

например redis:

клиент: эталон с 100 клиентами

Writing to socket: Connection reset by peer
Writing to socket: Connection reset by peer
Writing to socket: Connection reset by peer
Writing to socket: Connection reset by peer
Error: Connection reset by peer

информация о сервере:

127.0.0.1:6379> info clients
-Clients
connected_clients:4005
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

Джава:

Caused by: io.netty.channel.ChannelException: Failed to open a socket.
Caused by: java.net.SocketException: Too many open files
        at sun.nio.ch.SelectorProviderImpl.openSocketChannel(Unknown Source)
java.io.IOException: Too many open files
Caused by: io.netty.channel.ChannelException: Failed to open a socket.
Caused by: java.net.SocketException: Too many open files
        at sun.nio.ch.SelectorProviderImpl.openSocketChannel(Unknown Source)
Caused by: io.netty.channel.ChannelException: Failed to open a socket.
Caused by: java.net.SocketException: Too many open files

ls -l /proc/[id]/fd | wc -lпоказывает ~4000 дескрипторов

решение1

Существует два параметра, ограничивающих количество открытых файлов: ограничение на процесс и ограничение на всю систему. Ограничение на всю систему задается sysctl fs.file-max, который можно настроить в/etc/sysctl.conf(считывается во время загрузки) или устанавливается «на лету» с помощьюsysctlкомандой или написав в /proc/sys/fs/file-max. Лимит на процесс устанавливается ulimit -n.

Лимит per-process наследуется каждым процессом от его родителя. Значение по умолчанию может быть установлено в/etc/security/limits.conf, но это применимо только к интерактивным сеансам, а не к демонам, запущенным во время загрузки. Это применимо к демону, только если он запущен через интерактивный сеанс.

Чтобы увеличить (или уменьшить) лимиты на процесс для демона, в общем случае отредактируйте его скрипт запуска и добавьте вызов ulimitнепосредственно перед запуском демона. Пакет Debian redis поставляется с настройкой конфигурации в отдельном файле: /etc/default/redis. Закомментируйте ULIMIT=строку и увеличьте значение, если необходимо.

Связанный контент