Дуже часто під час роботи на високонавантажених Linux серверах можуть виникати помилки “занадто багато відкритого файлуs ». Це означає, що програма відкрила занадто багато файлів (читай файлових дескрипторів) і не може відкрити нові. У Linux обмеження “max open file limit” встановлено за замовчуванням для кожного процесу і користувача, і вони не дуже високі.

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

Помилка: Too many open files і ліміти на кількість відкритих файлів на Linux

Для початку розберемося, де ми можемо спостерігати помилку “too many open files”. Найчастіше ця помилка зустрічається на серверах з встановленим веб-серверів NGINX / httpd, сервером БД (MySQL / MariaDB / PostgreSQL), при читанні великої кількості балок. Наприклад, коли веб-сервера Nginx не вистачає ліміту для відкриття файлів, ви отримаєте помилку:

socket () failed (24: Too many open files) while connecting to upstream

помилка занадто багато файлів opne в nginx

Максимально кількість файлових дескрипторів, які можуть бути відкриті в вашій системі можна дізнатися так:

# cat /proc/sys/fs/file-max

Обмеження на кількість відкритих файлів для поточного користувача – 1024. Можна перевірити так:

# ulimit -n

ulimit -n - обмеження на кількість відкритих файлів для користувача

Є два типи обмежень: Важко і М’який. Користувач може змінити ліміт для soft обмеження (але значення soft не може перевищувати hard). Hard обмеження можна змінити тільки від привілейованого користувача.

Для виведення Soft -граніченія виконайте:

# ulimit –nS

Для виведення Hard-обмеження:

# ulimit -nH

Налаштування лімітів обмеження на кількість одночасно відкритих файлів в Linux

Щоб дозволити всім сервісів відкривати більшу кількість файлів, можна змінити ліміти на рівні всієї ОС Linux. Щоб нові настройки працювали постійно і не скидалися при перезапуску сервера або сесії, потрібно поправити файл /etc/security/limits.conf. Додайте рядки:

* hard nofile 97816
* soft nofile 97816

Їли ви використовуєте Ubuntu, потрібно прописати рядок:

session required pam_limits.so

Даний параметр додає можливість завантаження обмежень при авторизації користувача.

Після змін, перезапустіть термінал і перевірте значення ліміту max_open_files:

[root@server ~]# ulimit -n

97816

Збільшити ліміту відкритих файлових дескрипторів для окремого сервісу

Ви можете змінити ліміт на кількість відкритих файлових дескрипторів для конкретного сервісу, а не для всієї системи. Розглянемо на прикладі apache. Щоб змінити значення, відкрийте настройки служби через systemctl: # systemctl edit httpd.service Додайте необхідні ліміти, например:

[Service]
LimitNOFILE=16000
LimitNOFILESoft=16000

nginx.conf налаштувати limitnofile

Після зміни, потрібно оновити конфігурацію сервісу та перезапустити її:

# systemctl daemon-reload
# systemctl restart httpd.service

Щоб перевірити, чи змінилися значення, потрібно отримати PID сервісу:

# systemctl status httpd.service

Наприклад, ви визначив PID сервісу 32724:

# cat /proc/32724/limits | grep "Max open files”

настройка max open filex для сервісу в linux centos

Так ви змінили значення Max open files для конкретного сервісу.

Збільшення максимальної кількості відкритих файлів для Nginx і Apache

При зміні обмеження на кількість відкритих файлів для веб-сервера, потрібно також поправити конфігураційний файл служби. Наприклад, для Nginx в файлі конфігурації /etc/nginx/nginx.conf, Потрібно прописати / змінити значення в директиві:

worker_rlimit_nofile 16000
Під час налаштування Nginx на високонавантажених 8-ядерному сервері з worker_connections 8192 потрібно в worker_rlimit_nofile вказати 8192 * 2 * 8 (vCPU) = 131072.

Після чого виконати рестарт Nginx.

Для apache, потрібно створити директорію:

# mkdir /lib/systemd/system/httpd.service.d/

Після цього створіть файл limit_nofile.conf:

# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

httpd змінити LimitNOFILE

І додайте в нього:

[Service]
LimitNOFILE=16000

Не забудьте перезапустити сервіс httpd.

Ліміти file-max для поточної сесії

Щоб змінити ліміти на відкриті файли в рамках вашої сесії терміналу, виконайте команду:

# ulimit -n 3000

При закритті терміналу і створення нової сесії, ліміти повернутися до початкових значень, зазначених у файлі /etc/security/limits.conf.

Щоб змінити загальне значення в системі / proc / sys / fs / file-max, змініть значення fs.file-max на /etc/sysctl.conf:

fs.file-max = 100000

І подайте заявку:

# sysctl -p

fs.file-max для поточної сесії

У цій статті ми розібралися, як вирішити проблему з недостатнім лімітом спорядження для відкритих файлових дескрипторів в Linux і розглянули кілька варіантів зміни лімітів на сервері.

Leave a Reply

Your email address will not be published. Required fields are marked *