LINUX.ORG.RU
решено ФорумAdmin

Как увеличить количество открытых файлов?

 ,


2

3

Всем привет. Появилась проблема, уже всё перепробовал, может вы подскажете. Есть сервер с 32 ядрами и 128гб рамы. Есть некий софт, который на 1 процесс плодит 10к открытий файлов. Запускаю несколько сотен этих процессов - и всё валится по лимиту на открытие файлов. По lsof получается открытых файлов всего в системе около 2.5 млн.

В sysctl:

fs.file-max = 30000000

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) 514786
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1000000
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) 514786
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Хочу выставить hard-лимит открытых файлов в 10 млн и получаю ошибку:

ulimit -Hn 10000000
-bash: ulimit: open files: cannot modify limit: Operation not permitted

security.limit:

*   soft    nproc   1000000
*   hard    nproc   1000000
*   -       nofile  10000000
root -      nofile 10000000
worker -    nofile 10000000
worker1 -   nofile 10000000
*   -       memlock unlimited

Так же по наступлению лимита баш при использовании пайпов говорит что не может форкнуться. Я что-то не так делаю, или чего-то не понимаю? Или ещё где-то выше захардкожен в ядре лимит?

Всем буду очень благодарен за помощь.

PS файлы открываются в /dev/shm/, так что сервер всё это дело сильно не должно нагружать. Уменьшать количество открытий файлов тоже не вариант, т.к. по сути эти открытия создаёт блоб, который сложно расковырять.

★★

Когда процесс запускается как сервис, он не смотрит security.limit, поэтому надо или в описании systemd править, либо в скриптах запуска sysv (если sysv).

turtle_bazon ★★★★★
()
Ответ на: комментарий от turtle_bazon

Да, я знаю. Запускается из сессии юзера с проставленными лимитами. в /proc/pid/limits смотрел по лимитам - всё что я прописывал. Смысл в том, что я не могу проставить через ulimit цифру, которая хотя бы наполовину соответствовала цифре, которая находится в sysctl.

mahalaka ★★
() автор топика
Ответ на: комментарий от shell-script

В случае питона, который запускает блоб, это:

BlockingIOError: [Errno 11] Resource temporarily unavailable

баш кричит

-bash: fork: retry: Resource temporarily unavailable

Иноды не проверял, надо посмотреть. Но в /dev/shm такая ситуация:

tmpfs             16M   17K   16M    1% /dev/shm

Должно хватить по идее.

mahalaka ★★
() автор топика
Ответ на: комментарий от mahalaka

Но что-то я не вижу в сорцах нигде такого.

Тем не менее:

# uname -r
4.4.172
# ulimit -Hn 1048576
# ulimit -Hn 1048577
ulimit: open files: cannot modify limit: Operation not permitted
xaizek ★★★★★
()
Ответ на: комментарий от xaizek

У меня если из под разных сессий юзеров наполовину разделить общий лимит - такая же проблема.

mahalaka ★★
() автор топика

Вообще человек подсказал вот такую вещь

sysctl -w fs.nr_open=10000000

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

mahalaka ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.