it-swarm.com.de

Zu viele geöffnete Dateien (CentOS7) - bereits versucht, höhere Grenzwerte festzulegen

Zum ersten Mal ein VPS einrichten - achten Sie darauf, hier nicht zu fragen, es sei denn, ich habe die erforderliche Sorgfalt angewendet und den Kontext angegeben.

Auf meinem Remote-VPS werden über das Terminal fast alle Befehle, die ich ausführe, mit einer Error: Too many open files - Nachricht versehen, und ich benötige Ihre Hilfe, um vorwärts zu kommen.

Ich führe Folgendes aus: CentOS Linux release 7.6.1810 (Core) auf einem Computer mit 1 CPU-Kern und 2048 MB RAM. Es wurde mit einem LEMP-Stack Nginx 1.16.1, PHP-FPM 7.3.9, MariaDb 10.4.8 Für eine einfache wordpress Site) eingerichtet.

Ich habe versucht:

  1. Google- und Forensuche.
  2. Diese Einstellungen wurden angewendet (VPS wird jedes Mal manuell manuell über das Bedienfeld neu gestartet):

Systemweite Einstellungen in /etc/security/limits.conf:

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

anpassungen an Speichergrenzen und Uploads in /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 Einstellungen in /etc/php-fpm.d/www.conf:

rlimit_files = 65535

Festlegen von NGINX-Grenzwerten (und anderen Einstellungen) in 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;
}

Hier ist die Ausgabe von cat /proc/sys/fs/file-nr:

45216   0   6520154

Hier ist die Ausgabe von 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

Wenn Sie den Benutzer mit su - nginx Auf nginx umschalten und die Grenzwerte überprüfen mit: ulimit -Sn Gibt 1024ulimit -Hn Zurück 65536

Der Befehl lsof | wc -l Gibt Folgendes zurück: 4776

Ich hoffe, Sie können mir helfen, die richtige Richtung einzuschlagen, um das Problem mit zu vielen Dateien zu lösen!

EDIT - Der folgende Befehl zeigt weitere Informationen an:

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.
[[email protected] ~]# 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

Es sind nicht offene Dateihandles, die abgelaufen sind, sondern inotify Uhren.

Sie können dies in der Fehlermeldung sehen:

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

Um das Problem zu lösen, müssen Sie die Anzahl der im System verfügbaren Inotify-Uhren erhöhen. Wenn Sie tatsächlich überprüfen, werden Sie feststellen, dass es einen lächerlich niedrigen Wert wie 8192 hat.

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

Sie können das System fs.inotify.max_user_watches Dauerhaft auf einen höheren Wert setzen, indem Sie /etc/sysctl.conf Bearbeiten oder eine Datei im Verzeichnis /etc/sysctl.d Erstellen. Zum Beispiel hat mein System:

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

Und dann laden Sie es mit sysctl -p.

Möglicherweise möchten Sie nicht direkt zu dieser Nummer wechseln und veranlassen Sie den Kernel, Speicher zuzuweisen, um eine Million Überwachungsdateien für Benutzerdateien zu verfolgen ; Nehmen Sie stattdessen einfach den aktuellen Wert und verdoppeln Sie ihn, bis das Problem nicht mehr auftritt.

9
Michael Hampton

Um die Ulimit-Einstellungen für Dienste zu ändern, müssen Sie die systemd-Einheit ändern.

Sudo systemctl edit --full nginx.service

Und fügen Sie den gewünschten Wert zum Servicebereich hinzu

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

Erstellen Sie eine neue Datei unter /etc/security/limits.d/NN-custom.conf (ersetzen Sie NN durch eine Nummer wie 20,30 ..etc). Der Name der Datei spielt keine Rolle, sollte aber die Erweiterung .conf haben

Fügen Sie den folgenden Inhalt in die obige Datei ein (diese sind die gleichen, die Sie in Ihrem Beitrag erwähnt haben, passen Sie sie Ihren Bedürfnissen an):

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

führen Sie # sysctl -p /etc/security/limits.d/NN-custom.conf aus

Melden Sie sich ab und wieder an und starten Sie Ihren Dienst neu.

Hoffe das hilft.

0
NeedFrnds