PHP-Threads (keine Prozesse) werden immer weiter gemountet, bis der Server abstürzt

PHP-Threads (keine Prozesse) werden immer weiter gemountet, bis der Server abstürzt

Ich kämpfe seit einiger Zeit mit dem folgenden Problem und wäre für Ihre Hilfe sehr dankbar.

Mein Webserver stürzt regelmäßig komplett ab, weil zu viele PHP-Threads vorhanden sind. Die Anzahl der PHP-Prozesse ist stabil innerhalb eines normalen Bereichs (z. B. 35 Prozesse). Die Anzahl der Threads pro Prozess steigt mit der Zeit ständig an. Nach ein paar Stunden ist die Gesamtsumme aller Threads in allen PHP-Prozessen größer als 900 – und dann beginnt der normale Serverbetrieb zum Erliegen zu kommen.

So zähle ich die Anzahl der Prozesse und Threads:

ps axo pid,nlwp,cmd | grep "pool www"
15674   11 php-fpm: pool www
15675   13 php-fpm: pool www
15676    8 php-fpm: pool www
15677    7 php-fpm: pool www
15678   12 php-fpm: pool www

...und 30 weitere Zeilen wie diese

ich renne

  • ein virtueller Server
  • 8 GB RAM
  • 4 virtuelle Kerne
  • Ubuntu 16.04
  • nginx 1.10.3
  • php-fpm 7.0.3

meine .../fpm/pool.d/www.conf sieht so aus (alphabetische Reihenfolge):

user = www-data
request_terminate_timeout = 600s
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500
pm.max_children = 72
pm = dynamic
listen.owner = www-data
listen.group = www-data
listen = /run/php/php7.0-fpm.sock
group = www-data
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
env[HOSTNAME] = $HOSTNAME

Und meine Nginx-Konfiguration sieht folgendermaßen aus:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 1024;
    # multi_accept on;
}

http {
    client_max_body_size 501m;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 3;
    types_hash_max_size 2048;
    server_names_hash_max_size 8192;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;  
    log_format  main  '$remote_addr - $host $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';     
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_prefer_server_ciphers on;
    map $status $loggable {
        ~^404  0;
        default 1;
    }
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log ;
    gzip on;
    gzip_disable "msie6";
    application/xml+rss text/javascript;
    gzip_min_length 1100;
    gzip_vary on;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_types      text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;  
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    limit_conn_zone $binary_remote_addr zone=addr:10m;  
    limit_conn addr 50; 
    fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=YOURAPP:100m inactive=60m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";    
    upstream php {
        server unix:/run/php/php7.0-fpm.sock;
    }    
    map $http_upgrade $connection_upgrade {
            default upgrade;
            '' close;
    }     
}


server {
    listen 443 ssl;
    server_name www.mydomain.com;
    root   /var/www/path/to/webfiles;       
    # ssl specs here 
    # some general location stuff here
    location ~ \.php$ {
        regex to split $uri to $fastcgi_script_name and $fastcgi_path
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        try_files $fastcgi_script_name =404;
        set $path_info $fastcgi_path_info;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_index index.php;
        include fastcgi.conf;
        fastcgi_cache_bypass 1;
        fastcgi_no_cache 1;  
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;     
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 4k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_cache YOURAPP;
        fastcgi_cache_valid 200 60m;
        fastcgi_read_timeout 600s;
    }

}   

Es scheint eine Verbindung zum auf dem Server laufenden Z-Push-Dienst zu bestehen. Dieser wird verwendet, um Serverdaten (Kontakte, Kalender, E-Mails) mit mobilen Geräten zu synchronisieren. Nach dem Herunterfahren dieses bestimmten Dienstes hört die Anzahl der Threads auf, sich zu vermehren. Bisher konnte ich keine Konfiguration für Z-Push/Nginx/PHP finden, mit der ich die Synchronisierung verwenden kann, ohne den Server zu überfluten. Ich habe versucht, die Konfiguration „static“ und „ondemand“ zum Starten von PHP-Prozessen zu verwenden – aber das hat keinen signifikanten Unterschied gemacht.

Ich wäre für Hinweise oder Klarstellungen dankbar.
Vielen Dank im Voraus,
Steve

Antwort1

Das Problem hing irgendwie mit Kopano Core zusammen. Als ich es vor einem Monat auf Version 8.6.82 aktualisierte, waren alle Thread-bezogenen Probleme sofort behoben. Besser spät als nie. Vielen Dank an alle für eure Ratschläge!

verwandte Informationen