Php5-fpm Arresto anomalo se molti visitatori


8

Ho deciso di cambiare il mio OP in Nginx da Litespeed perché ho letto molto sulla bassa risorsa che Nginx sarebbe costato.

Sto gestendo un sito Wordpress con 500 utenti online

Va bene grazie ragazzi per l'aiuto tanto :) Ho modificato alcune cose.

Mi rimangono anche alcune domande:

Devo rimuovere il; prima del pomeriggio impostazioni? L'ho rimosso Cosa conta la configurazione? Ho ottenuto due veloci cgi uno in / etc / php5 / fpm chiamato php-fpm.conf e uno in /etc/php5/fpm/pool.d chiamato www.conf?

Ho provato la nuova configurazione durante la notte e quando mi sveglio ho già ricevuto una pagina vuota. Superiore:

top - 13:55:27 up 1 day, 19:28,  2 users,  load average: 0.18, 0.36, 0.19
Tasks:  84 total,   1 running,  83 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3974264k total,  1051360k used,  2922904k free,   162380k buffers
Swap:  3998700k total,        0k used,  3998700k free,   609220k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1857 www-data  20   0  193m  55m  22m S    0  1.4   0:04.67 php5-fpm
    1 root      20   0  8356  808  680 S    0  0.0   0:01.37 init
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd

Penso che l'utilizzo della CPU sia ora inferiore, ma ciò non risolve il crash ...

Le mie configurazioni sono ora: php-fpm.conf

    ;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamicaly changed by using the
; '-p' argument from the command line.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
;  - the global prefix if it's been set (-p arguement)
;  - /usr otherwise
;include=/etc/php5/fpm/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /var/run/php5-fpm.pid

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; in a local file.
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php5-fpm.log

; syslog_facility is used to specify what type of program is logging the
; message. This lets syslogd specify that messages from different facilities
; will be handled differently.
; See syslog(3) for possible values (ex daemon equiv LOG_DAEMON)
; Default Value: daemon
;syslog.facility = daemon

; syslog_ident is prepended to every message. If you have multiple FPM
; instances running on the same server, you can change the default value
; which must suit common needs.
; Default Value: php-fpm
;syslog.ident = php-fpm

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
emergency_restart_threshold = 1

; Interval of time used by emergency_restart_interval to determine when 
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
emergency_restart_interval = 1s

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
process_control_timeout = 10s

; The maximum number of processes FPM will fork. This has been design to control
; the global number of processes when using dynamic PM within a lot of pools.
; Use it with caution.
; Note: A value of 0 indicates no limit
; Default Value: 0
process.max = 150

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
;daemonize = yes

; Set open file descriptor rlimit for the master process.
; Default Value: system defined value
rlimit_files = 1024

; Set max core size rlimit for the master process.
; Possible Values: 'unlimited' or an integer greater or equal to 0
; Default Value: system defined value
;rlimit_core = 0

; Specify the event mechanism FPM will use. The following is available:
; - select     (any POSIX os)
; - poll       (any POSIX os)
; - epoll      (linux >= 2.5.44)
; - kqueue     (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
; - /dev/poll  (Solaris >= 7)
; - port       (Solaris >= 10)
; Default Value: not set (auto detection)
; events.mechanism = epoll

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ; 
;;;;;;;;;;;;;;;;;;;;

; Multiple pools of child processes may be started with different listening
; ports and different management options.  The name of the pool will be
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)

; To configure the pools it is recommended to have one .conf file per
; pool in the following directory:
include=/etc/php5/fpm/pool.d/*.conf

request_terminate_timeout = 30s

pm.max_children = 25

; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 5

; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 2

; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 5

; The number of seconds after which an idle process will be killed.
; Note: Used only when pm is set to 'ondemand'
; Default Value: 10s
pm.process_idle_timeout = 10s;

fastcgi_params:

fastcgi_param   QUERY_STRING        $query_string;
fastcgi_param   REQUEST_METHOD      $request_method;
fastcgi_param   CONTENT_TYPE        $content_type;
fastcgi_param   CONTENT_LENGTH      $content_length;

fastcgi_param   SCRIPT_FILENAME     $request_filename;
fastcgi_param   SCRIPT_NAME     $fastcgi_script_name;
fastcgi_param   REQUEST_URI     $request_uri;
fastcgi_param   DOCUMENT_URI        $document_uri;
fastcgi_param   DOCUMENT_ROOT       $document_root;
fastcgi_param   SERVER_PROTOCOL     $server_protocol;

fastcgi_param   GATEWAY_INTERFACE   CGI/1.1;
fastcgi_param   SERVER_SOFTWARE     nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR     $remote_addr;
fastcgi_param   REMOTE_PORT     $remote_port;
fastcgi_param   SERVER_ADDR     $server_addr;
fastcgi_param   SERVER_PORT     $server_port;
fastcgi_param   SERVER_NAME     $server_name;

#fastcgi_param  HTTPS           $https;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS     200;

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

configurazione nginx:

user www-data;
worker_processes 2;
pid /var/run/nginx.pid;

events {
    worker_connections 500;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 40;
    types_hash_max_size 2048;
    server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    # access_log /var/log/nginx/access.log;
    # error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

 gzip_vary on;
 gzip_proxied any;
 gzip_comp_level 9;
 gzip_buffers 16 8k;
 gzip_http_version 1.1;
 gzip_types text/plain text/css application/json application/x-javascript text/$

www.conf

; Start a new pool named 'www'.
; the variable $pool can we used in any directive and will be replaced by the
; pool name ('www' here)
[www]

user = www-data
group = www-data


pm = dynamic

pm.max_children = 25

pm.start_servers = 5

pm.min_spare_servers = 2

pm.max_spare_servers = 5

pm.process_idle_timeout = 10s;

pm.max_requests = 100

request_terminate_timeout = 120s

The Mashine: RAM Dualcore da 4 GB


Cosa dice il registro errori PHP-FPM?
devicenull,

C'è solo la cronaca di quando riavvio il fpm qualche altro ... [04-Apr-2012 13:46:44] AVVISO: chiusura ... [04-Apr-2012 13:46:44] AVVISO: uscita, ciao -addio! [04-apr-2012 13:46:44] AVVISO: fpm è in esecuzione, pid 1744 [04-apr-2012 13:46:44] AVVISO: pronto a gestire i collegamenti [04-apr-2012 13:48:57] AVVISO: [pool www] figlio 1748 uscito con il codice 0 dopo 132.647614 secondi dall'inizio [04-apr-2012 13:48:57] AVVISO: [pool www] figlio 1829 iniziato
chillah

Ho appena notato che php fpm si blocca più velocemente se disabilito / abilito o modifico i miei file wordpress. Ma non sono sicuro al 100% ...
Chillah

Stai ancora ricevendo gli arresti anomali? Hai verificato l'utilizzo di APC? Di solito si definisce un pool in un file di configurazione separato (dove vanno tutte le impostazioni di pm).
Dada,

Sì, si blocca ancora. Gli arresti anomali sembrano aumentare con più visitatori sulla mia pagina. Non vedo il processo apc in "top". Come posso controllarlo? Ho usato cron per riavviare php fpm ogni 2 minuti per ora .... Ho davvero bisogno di risolvere presto quel problema!
Chillah,

Risposte:


10

Non è chiaro se si stia utilizzando un cacher come il codice operativo APC. Prima di tutto, abilitalo. Regola la sua memoria per evitare la frammentazione. Inoltre, utilizzare socket, non connessione http da nginxa php5-fpm, e posizionare quel socket /dev/shm. In nginx, usa fastcgi_pass unix:/dev/shm/php5-fpm.sock;e modifica di conseguenza la configurazione di php5-fpm.

Prova ad abbassarti pm.max_childrena qualcosa di più realistico come 30-40-50-60 e vedi il carico e la memoria libera con free -m. Verifica se i client ricevono errori 502/504. Lower pm.start_servers, min e max_spare di conseguenza (15, 5, 25).

Se c'è un sacco di utenti anonimi, in considerazione di utilizzare alcun plugin per wordpress caching come WP-FFPC, WP Super Cacheo simili.

Disabilita il gzipping se lo hai abilitato in nginx.

Forse è necessario modificare fastcgi_buffer_sizee le fastcgi_buffersopzioni in nginx.

Verifica se la cache delle query è abilitata e sufficiente su Mysql.

Avere un sistema di monitoraggio come munininstallato sul sito per verificare carico / consumo di memoria / latenza ecc.


La connessione tra nginx e php5-fpm potrebbe non essere HTTP ma solo TCP. JFYI.
Aykut Çevik,

4

È probabile che il tuo server soffra quando si esaurisce la memoria per eseguire processi php. Le tue impostazioni di php5-fpm sembrano essere troppo generose per 4 GB di RAM. Ho avuto un sacco di problemi per arrivare alle configurazioni ottimali di php5-fpm (per utenti RAM da 32 GB e + 1K online, ecco i miei parametri rilevanti:

pm.max_children = 25
pm.start_servers = 5
pm.min_spare_servers = 2 
pm.max_spare_servers = 5
pm.max_requests = 100

Inoltre, non dimenticare di impostare un timeout di terminazione della richiesta per evitare la carenza di memoria dovuta a processi inattivi:

request_terminate_timeout = 120s

Qualunque sia il tempo che usi nella directory sopra dovrebbe essere conforme alla direttiva max_execution_time nel tuo php.ini.

Per quanto riguarda nginx, avere gzip su è un'ottima idea: è molto economico dal punto di vista della CPU e consente di risparmiare un sacco di larghezza di banda del server.

   #sendfile on;
    #tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 10;
    types_hash_max_size 2048;
    # server_tokens off;
    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 9;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/$

In bocca al lupo


Ho provato la tua configurazione durante la notte, la CPU sembra un utilizzo più basso ora hovewer che non ha riparato le pagine bianche e gli arresti anomali. Ecco un contatore Ip Immagine: abload.de/img/unbenanntsgyxi.png
chillah

Sono d'accordo con la raccomandazione di impostare request_terminate_timeout, ma il tuo motivo non è corretto;) Questa direttiva è quella di interrompere un processo in esecuzione dopo un certo periodo di tempo della CPU, come protezione quando i PHP max_execution_timenon potrebbero (che dovrebbe avere un valore un po 'più piccolo per ottenere il prima possibilità) [fonte ]. "Per evitare la carenza di memoria dovuta a processi inattivi", la direttiva da utilizzare è pm.process_idle_timeout = 40 [vedi questa risposta ].
tanius,

1

Suggerirei di usare pm = ondemand e di assicurarmi che la dimensione di memory_limit in php sia considerevole alla memoria della macchina.

Per una macchina da 4 GB con 128 MB di processo PHP che dovrebbe avere circa 24 server PHP-FPM che puoi avere in esecuzione, ondemand è bello in quanto il server determinerebbe la quantità massima di server e ne creerebbe di nuovi man mano che il carico aumenta.


1
Concordare che il gestore di processo ondemand PHP-FPM è la scelta migliore nella maggior parte dei casi. Ma è max. il numero di processi figlio non può essere calcolato in questo modo: memory_limitè il massimo assoluto che un processo PHP può consumare prima di essere terminato forzatamente. In media, consumano molto meno.
tanius,

1
E comunque , la memoria di solito non è il fattore limitante per max. figli, piuttosto core della CPU. Max. il conteggio dei bambini dovrebbe essere impostato a ca. Numero di core della CPU, oltre a pochi per compensare le attese di IO, ecc. Nulla va più veloce del carico della CPU del 100%, è solo una differenza tra l'attesa in coda e il lento servizio parallelo con commutazione.
tanius,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.