Виправляємо помилку Too many open files в Linux

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

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

зміст:

  • Помилка: Too many open files і ліміти на кількість відкритих файлів в Linux
  • Налаштування лімітів обмеження на кількість одночасно відкритих файлів в Linux
  • Збільшити ліміт відкритих файлових дескрипторів для окремого сервісу
  • Збільшення максимальної кількості відкритих файлів для Nginx і Apache
  • Ліміти file-max для поточної сесії

Помилка: 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

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

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

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

# Ulimit -n

Є два типи обмежень: Hard і Soft. Користувач може змінити ліміт для 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

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

# Systemctl daemon-reload
# Systemctl restart httpd.service

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

# Systemctl status httpd.service

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

# Cat / proc / 32724 / limits | grep "Max open files"

Так ви змінили значення 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

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

[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

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