Слишком много открытых файлов (CentOS7) - уже пытались установить более высокие лимиты

Первая настройка VPS - не спрашивайте здесь, если я не проверил должную осмотрительность и не предоставил контекст.

На моем удаленном VPS через терминал почти все команды, которые я выполняю, заканчиваются сообщением об ошибке : слишком много открытых файлов , и мне нужна ваша помощь, чтобы двигаться дальше.

Я запускаю: CentOS Linux, выпуск 7.6.1810 (Core) на машине с 1 ядром ЦП и 2048 МБ ОЗУ. Он был настроен со стеком LEMP Nginx 1.16.1, PHP-FPM 7.3.9, MariaDb 10.4.8 , предназначенным для простого сайта wordpress.

Я пробовал:

  1. Google и форум поиск.
  2. Применены следующие настройки (вручную перезапускать 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

Настройки rlimit PHP в /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

Надеюсь, вы поможете направить меня в правильном направлении, чтобы решить проблему слишком большого количества файлов!

ИЗМЕНИТЬ - следующая команда показывает дополнительную информацию:

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.
6
задан 13 September 2019 в 06:35
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, которые имеет в наличии система. Если Вы на самом деле проверите, то Вы найдете, что это имеет некоторую смехотворно низкую стоимость как 8 192.

$ 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.

Вы не можете хотеть переходить прямо к тому числу, и заставляют ядро выделять память для отслеживания миллиона пользовательских слотов часов файла ; вместо этого, просто примите текущее значение и удвойте его, пока проблема не прекратит происходить.

8
ответ дан 3 December 2019 в 00:20

Для изменения ulimit настроек для сервисов, необходимо изменить systemd единицу.

sudo systemctl edit --full nginx.service

И добавляют требуемое значение к сервисному разделу

[Service]
LimitNOFILE=<integer>
...
0
ответ дан 3 December 2019 в 00:20

Создайте новый файл в/etc/security/limits.d/NN-custom.conf (замените NN некоторым числом такой как 20,30.. и т.д.). Название файла не имеет значения, но это должно иметь дополнительный .conf

, Вставленный в следующее содержание вышеупомянутый файл (они - то же, как Вы упомянули в своем сообщении, корректируйтесь согласно своим потребностям):

 nginx       soft    nofile      1024 
 nginx       hard    nofile      65536 
 root        hard    nofile      65536 
 root        soft    nofile      1024

run# sysctl-p/etc/security/limits.d/NN-custom.conf

Выход и входит в и перезапускает Ваш сервис.

Hope это помогает.

0
ответ дан 3 December 2019 в 00:20

Та же проблема была и с 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'
0
ответ дан 29 June 2021 в 18:44

Теги

Похожие вопросы