Забагато відкритих файлів на Debian


15

У мене вже давно запущений процес у Debian. У якийсь момент помилки кидка:

Занадто багато відкритих файлів.

Запуск:

ulimit -a

показує:

відкрити файли (-n) 1024

Я хочу збільшити кількість відкритих файлів у 2 рази. Після виконання

ulimit -n 2048

ліміт активний до кінця мого сеансу, що не стосується завдання.

Як я можу назавжди збільшити кількість відкритих файлів?

Відповіді:


12

Якщо ваш процес запускається за допомогою сценарію, ви можете зателефонувати на скасування в скрипті безпосередньо перед виконанням демона.

Якщо ви хочете збільшити рівень доступу для свого користувача або для всіх користувачів, ви можете встановити обмеження, які застосовуються за допомогою pam_limitsвходу. Вони встановлені /etc/security/limits.conf. У вашому випадку ви можете зробити щось на кшталт:

*               hard    nofile             2048

Зауважте, що "жорсткий" позначає жорстку межу - ту, яку неможливо перевищити і не можна змінити. Користувач може змінювати м'який ліміт (наприклад, хтось без кореневих можливостей), але не виходить за рамки жорсткої межі.

Прочитайте limits.confдокладнішу інформацію про використання pam_limits.


У обмежених конфліктах у мене є 2 рядки: * soft nofile 4096 * hard nofile 8192 Які не мають ефекту.
FoxyBOA

І ви знову вийшли з системи після тестування? Це означатиме вихід із X / GNOME / KDE тощо, якщо ви намагаєтеся це зробити на локальній машині
Daniel Lawson

Так. /etc/security/limits.conf не працює для мене. Спробую другий підхід.
FoxyBOA

3
/etc/security/limits.conf працює лише для служб, які використовують пам та модуль пам. pam_limits (див. /etc/pam.d/ для конфігурації PAM кожної служби та /etc/pam.d/common-* зокрема) . Таким чином, це стосується всіх користувацьких сесій, створених sshd, gdm, логіном тощо. Це не стосується всіх програм, запущених під час завантаження ...
Raphaël Hertzog

Я щось сказав для цього, але дякую за уточнення. ОП не уточнила, чи це служба чи процес, який працює його користувачем.
Даніель Лоусон

13

Також у ядрі встановлений "загальний макс" відкритих файлів, ви можете перевірити поточний параметр за допомогою:

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)


Шахта показує деякі непристойні цифри тут: 49152 0 18446744073709551615 . Я не розумію, чому перші два стовпці не додають до третього. І якщо у мене є 1,8 трильйона трильйонів, які є в наявності, я не бачу, як я їх використав.
mlissner

4

Як говорили інші, ви можете застосовувати конкретні обмеження для користувача або групи в /etc/security/limits.conf.

Примітка: ulimit -n показує м'яку межу.

ulimit -H -n 

покаже вам жорстку межу.

Це робить ulimit -a та ulimit -n висновок досить заплутаним, якщо, наприклад, ви збільшували кількість файлів з 1024 до 4096, як ви очікували б побачити вихід жорсткого ліміту, але ви все ще бачите 1024, який є м'яким ліміт.

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


2

Майте на увазі, що якщо ви запустите ваш процес за допомогою налаштування start-stop-daemon ulimits в /etc/security/limits.conf не працює. Якщо ви, наприклад, хочете підняти ліміт відкритого файлу для tomcat до 20000, вам потрібно додати їх до рядків до /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

Я зіткнувся з цією проблемою на debian 6.0.4. Для іншого процесу відповіді повинні допомогти.


1

Це залежить від того, як ви розпочнете свій тривалий процес. Якщо він запускається під час завантаження (за допомогою сценаріїв /etc/rcX.d/*), тоді ви повинні поставити необмежений виклик у свій сценарій запуску, оскільки ядро ​​встановлено лімітом за замовчуванням, і його не можна налаштувати без його перекомпіляції.

Використання /etc/security/limits.confможе спрацювати, якщо ви cronзапускаєте його, наприклад, із такої записи:

@reboot $HOME/bin/my-program

Це повинно працювати, тому що /etc/pam.d/cron вмикає pam_limits.so.


-1

Ви можете додати це в /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

зберегти, потім перезавантажити.


3
Чи є щось нове тут, що не в прийнятій відповіді на це питання 5-річної давності?
Ендрю Шульман

-2

Дуже приємна команда, 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

Я спробував очистити вашу відповідь, але мені все ще незрозуміло, що ви намагаєтесь сказати на питання оригіналу плакатів. Чи можете ви спробувати це очистити далі?
slm

Також це вихід ulimit -a, а не ulimit -n.
Іван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.