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 ★★ ()

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

sysctl -w fs.nr_open=10000000

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

mahalaka ★★ ()