Дуже часто при роботі на високонавантажених 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 і розглянули кілька варіантів зміни лімітів на сервері.