PHP 스레드(프로세스 아님)는 서버가 충돌할 때까지 계속 마운트됩니다.

PHP 스레드(프로세스 아님)는 서버가 충돌할 때까지 계속 마운트됩니다.

나는 한동안 다음 문제로 어려움을 겪고 있으며 귀하의 도움에 진심으로 감사드립니다.

너무 많은 PHP 스레드로 인해 내 웹 서버가 정기적으로 완전히 충돌합니다. PHP 프로세스 수는 정상 범위(예: 35개 프로세스) 내에서 안정적입니다. 프로세스당 스레드 수는 시간이 지남에 따라 지속적으로 증가합니다. 몇 시간 후에는 모든 PHP 프로세스의 모든 스레드 총합이 900보다 커지며, 이때 정상적인 서버 작업이 종료되기 시작합니다.

프로세스 및 스레드 수를 계산하는 방법은 다음과 같습니다.

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

...그런 줄이 30개 더 있어요

나는 달리고 있다

  • 가상 서버
  • 8GB RAM
  • vCore 4개
  • 우분투 16.04
  • nginx 1.10.3
  • PHP-FPM 7.0.3

내 .../fpm/pool.d/www.conf는 다음과 같습니다(알파벳순).

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

내 nginx 구성은 다음과 같습니다.

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;
    }

}   

서버에서 실행 중인 z-push 서비스에 연결되어 있는 것 같습니다. 서버 데이터(연락처, 캘린더, 메일)를 모바일 장치와 동기화하는 데 사용됩니다. 해당 특정 서비스를 종료하면 스레드 수가 더 이상 작동하지 않습니다. 지금까지 서버를 넘치지 않고 동기화를 사용할 수 있는 z-push/nginx/php에 대한 구성을 찾을 수 없었습니다. PHP 프로세스를 생성하기 위해 "정적" 및 "ondemand" 구성을 사용해 보았지만 큰 차이는 없었습니다.

어떤 힌트나 설명이라도 주시면 감사하겠습니다.
미리 감사드립니다
스티브

답변1

문제는 어떻게든 코파노 코어와 관련이 있었습니다. 한 달 전에 버전 8.6.82로 업데이트했을 때 모든 스레드 관련 문제가 인스턴스에서 사라졌습니다. 안하는 것보다 늦게하는 것이 낫다. 조언해 주셔서 감사합니다!

관련 정보