Слишком много открытых файлов (CentOS7) - уже пробовали устанавливать более высокие лимиты
Первый раз при настройке VPS - будьте внимательны, не спрашивайте здесь, если я не проявил должную осмотрительность и не предоставил контекст.
На моем удаленном VPS через терминал почти все команды, которые я запускаю, заканчиваются Error: Too many open files
сообщение, и мне нужна ваша помощь, чтобы двигаться вперед.
Я бегу: CentOS Linux release 7.6.1810 (Core)
на машине с 1 ядром процессора и 2048 МБ оперативной памяти. Он был настроен со стеком LEMP Nginx 1.16.1, PHP-FPM 7.3.9, MariaDb 10.4.8
предназначен для простого WordPress сайта.
Я пытался:
- Google и поиск по форуму.
- Применяются следующие настройки (ручной перезапуск VPS вручную через панель управления каждый раз):
Общесистемные настройки в /etc/security/limits.conf
:
nginx soft nofile 1024
nginx hard nofile 65536
root hard nofile 65536
root soft nofile 1024
корректировки пределов памяти и загрузки в /etc/php.ini
:
memory_limit = 256M
file_uploads = On
upload_max_filesize = 128M
max_execution_time = 600
max_input_time = 600
max_input_vars = 3000
Настройки PHP rlimit в /etc/php-fpm.d/www.conf
:
rlimit_files = 65535
Установка пределов NGINX (и других настроек) в nginx.conf
:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 10000;
}
worker_rlimit_nofile 100000;
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
client_body_buffer_size 128k;
client_header_buffer_size 10k;
client_max_body_size 100m;
large_client_header_buffers 4 256k;
#gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;
}
Вот вывод cat /proc/sys/fs/file-nr
:
45216 0 6520154
Вот вывод ps aux|grep nginx|grep -v grep
:
root 928 0.0 0.0 46440 1192 ? Ss 00:25 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 929 0.0 0.2 50880 6028 ? S 00:25 0:00 nginx: worker process
nginx 9973 0.0 0.1 171576 4048 ? S 04:28 0:00 php-fpm: pool www
nginx 9974 0.0 0.1 171576 4048 ? S 04:28 0:00 php-fpm: pool www
nginx 9975 0.0 0.1 171576 4048 ? S 04:28 0:00 php-fpm: pool www
nginx 9976 0.0 0.1 171576 4048 ? S 04:28 0:00 php-fpm: pool www
nginx 9977 0.0 0.1 171576 4052 ? S 04:28 0:00 php-fpm: pool www
Переключение пользователя на nginx
с su - nginx
и проверка лимитов с помощью:ulimit -Sn
возвращается 1024
ulimit -Hn
возвращается 65536
lsof | wc -l
команда возвращает: 4776
Надеюсь, вы поможете мне направить меня в правильном направлении, чтобы решить проблему с Too Many Files!
РЕДАКТИРОВАТЬ- следующая команда показывает больше информации:
service nginx restart
Redirecting to /bin/systemctl restart nginx.service
Error: Too many open files
Job for nginx.service failed because a configured resource limit was exceeded. See "systemctl status nginx.service" and "journalctl -xe" for details.
[root@pars ~]# systemctl status nginx.service
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/nginx.service.d
└─worker_files_limit.conf
Active: failed (Result: resources) since Fri 2019-09-13 05:32:23 CEST; 14s ago
Docs: http://nginx.org/en/docs/
Process: 1113 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 1125 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 870 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/virtualizor.service/system.slice/nginx.service
Sep 13 05:32:22 pars.work systemd[1]: Starting nginx - high performance web server...
Sep 13 05:32:22 pars.work systemd[1]: PID file /var/run/nginx.pid not readable (yet?) after start.
Sep 13 05:32:22 pars.work systemd[1]: Failed to set a watch for nginx.service's PID file /var/run/nginx.pid: Too many open files
Sep 13 05:32:23 pars.work systemd[1]: Failed to kill control group: Input/output error
Sep 13 05:32:23 pars.work systemd[1]: Failed to kill control group: Input/output error
Sep 13 05:32:23 pars.work systemd[1]: Failed to start nginx - high performance web server.
Sep 13 05:32:23 pars.work systemd[1]: Unit nginx.service entered failed state.
Sep 13 05:32:23 pars.work systemd[1]: nginx.service failed.
4 ответа
На самом деле закончились не дескрипторы открытых файлов, а часы inotify.
Вы можете увидеть это в сообщении об ошибке:
Sep 13 05:32:22 pars.work systemd[1]: Failed to set a watch for nginx.service's PID file /var/run/nginx.pid: Too many open files
Чтобы решить эту проблему, вам необходимо увеличить количество доступных часов inotify. Если вы действительно проверите, вы обнаружите, что оно имеет какое-то смехотворно низкое значение, например 8192.
$ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 8192
Вы можете установить sysctl fs.inotify.max_user_watches
на более высокое значение постоянно путем редактирования /etc/sysctl.conf
или создание файла в /etc/sysctl.d
каталог. Например, моя система имеет:
$ cat /etc/sysctl.d/10-user-watches.conf
fs.inotify.max_user_watches = 1048576
А затем загрузить его sysctl -p
,
Возможно, вы не захотите идти прямо к этому числу и заставить ядро выделять память для отслеживания миллиона слотов наблюдения за пользовательскими файлами; вместо этого просто возьмите текущее значение и удвойте его, пока проблема не прекратится.
Чтобы изменить настройки ulimit для сервисов, вам нужно изменить системный модуль.
sudo systemctl edit --full nginx.service
И добавьте желаемое значение в раздел услуг
[Service]
LimitNOFILE=<integer>
...
Та же проблема была с Debian 9, а также с Debian 10 buster.
Была показана ошибка:
Failed to allocate directory watch: Too many open files
и увеличение количества открытых файлов в Linux не помогло, оно уже исчерпано:
fs.file-max = 9223372036854775807
Исправление состоит в том, чтобы увеличить количество экземпляров пользователей со 128 до примерно такого или большего:
sysctl fs.inotify.max_user_instances=1024
и сделать его постоянным, а также с часами:
sudo bash -c 'cat <<EOF> /etc/sysctl.d/fs_inotify.conf
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
EOF'
Создайте новый файл в /etc/security/limits.d/NN-custom.conf (замените NN некоторым числом, например 20,30 ..etc). Имя файла не имеет значения, но оно должно иметь расширение.conf
Поместите следующее содержимое в файл выше (это то же самое, что вы упомянули в своем посте, отрегулируйте в соответствии с вашими потребностями):
nginx soft nofile 1024
nginx hard nofile 65536
root hard nofile 65536
root soft nofile 1024
запустите # sysctl -p /etc/security/limits.d/NN-custom.conf
Выйдите из системы, войдите в систему и перезапустите службу.
Надеюсь это поможет.