web-dev-qa-db-fra.com

Trop de fichiers ouverts (CentOS7) - déjà essayé de fixer des limites plus élevées

Première configuration d'un VPS - en gardant à l'esprit de ne pas demander ici à moins d'avoir fait preuve de diligence raisonnable et de fournir le contexte.

Sur mon VPS distant, via le terminal, presque toutes les commandes que j'exécute se retrouvent avec un message Error: Too many open files Et j'ai besoin de votre aide pour avancer.

J'exécute: CentOS Linux release 7.6.1810 (Core) sur une machine avec 1 cœur de processeur et 2048 Mo de RAM. Il a été configuré avec une pile LEMP Nginx 1.16.1, PHP-FPM 7.3.9, MariaDb 10.4.8 Destinée à un simple site wordpress.

J'ai essayé:

  1. Recherches Google et forum.
  2. Appliqué ces paramètres (redémarrage manuel de VPS manuellement via le panneau de commande à chaque fois):

Paramètres à l'échelle du système dans /etc/security/limits.conf:

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

ajustements des limites de mémoire et téléchargements dans /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

Paramètres PHP rlimit dans /etc/php-fpm.d/www.conf:

rlimit_files = 65535

Définition des limites NGINX (et autres paramètres) dans 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;
}

Voici la sortie de cat /proc/sys/fs/file-nr:

45216   0   6520154

Voici la sortie de 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

Passer de l'utilisateur à nginx avec su - nginx Et vérifier les limites avec: ulimit -Sn Renvoie 1024ulimit -Hn Renvoie 65536

La commande lsof | wc -l Renvoie: 4776

J'espère que vous pourrez m'aider à me diriger dans la bonne direction pour résoudre le problème Trop de fichiers!

EDIT - la commande suivante affiche plus d'informations:

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
Henrik Söderlund

Ce ne sont pas réellement des descripteurs de fichiers ouverts qui sont épuisés, mais inotifient les montres.

Vous pouvez le voir dans le message d'erreur:

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

Pour résoudre le problème, vous devez augmenter le nombre de montres inotify disponibles sur le système. Si vous vérifiez réellement, vous constaterez qu'il a une valeur ridiculement faible comme 8192.

$ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 8192

Vous pouvez définir le sysctl fs.inotify.max_user_watches à une valeur plus élevée de façon persistante en modifiant /etc/sysctl.conf ou en créant un fichier dans le /etc/sysctl.d répertoire. Par exemple, mon système a:

$ cat /etc/sysctl.d/10-user-watches.conf 
fs.inotify.max_user_watches = 1048576

Et puis chargez-le avec sysctl -p.

Vous ne voudrez peut-être pas aller directement à ce nombre et amener le noyau à allouer de la mémoire pour suivre un million d'emplacements de surveillance de fichiers utilisateur ; au lieu de cela, prenez simplement la valeur actuelle et doublez-la jusqu'à ce que le problème cesse de se produire.

9
Michael Hampton

Pour modifier les paramètres ulimit des services, vous devez modifier l'unité systemd.

Sudo systemctl edit --full nginx.service

Et ajoutez la valeur souhaitée à la section service

[Service]
LimitNOFILE=<integer>
...
0
HBruijn

Créez un nouveau fichier à /etc/security/limits.d/NN-custom.conf (remplacez NN par un certain nombre tel que 20,30 ..etc). Le nom du fichier n'a pas d'importance mais il doit avoir l'extension .conf

Mettez le contenu suivant dans le fichier ci-dessus (ce sont les mêmes que ceux que vous avez mentionnés dans votre message, ajustez selon vos besoins):

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

exécutez # sysctl -p /etc/security/limits.d/NN-custom.conf

Déconnectez-vous, reconnectez-vous et redémarrez votre service.

J'espère que cela t'aides.

0
NeedFrnds