Nginx et PHP-FPM manquent de connexions

9

Je continue à rencontrer des erreurs comme celles-ci,

[02-Jun-2012 01:52:04] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 19 idle, and 49 total children
[02-Jun-2012 01:52:05] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 19 idle, and 50 total children
[02-Jun-2012 01:52:06] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 19 idle, and 51 total children
[02-Jun-2012 03:10:51] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 18 idle, and 91 total children

J'ai changé mes paramètres pour php-fpm en ceux-ci,

pm.max_children = 150 (It was at 100, i got a max_children reached and upped to 150)
pm.start_servers = 75
pm.min_spare_servers = 20
pm.max_spare_servers = 150

Résultant en

[02-Jun-2012 01:39:19] WARNING: [pool www] server reached pm.max_children setting (150), consider raising it

Je viens de lancer un nouveau site Web qui reçoit un trafic considérable. Ce trafic est légitime et les utilisateurs obtiennent 504 délais d'attente de passerelle lorsque la limite est atteinte.

J'ai des connexions limitées à mon serveur avec IPTABLES et j'exécute fail2ban et je garde la trace des journaux d'accès nginx. Le trafic est tout à fait légitime, je manque de place pour les utilisateurs.

Je suis actuellement en train de tourner sur une box dual core avec ubuntu 64bit.

free
             total       used       free     shared    buffers     cached
Mem:       6114284    5726984     387300          0     141612    4985384
-/+ buffers/cache:     599988    5514296
Swap:       524284       5804     518480

Mon php.ini max_input_time = 60

Ma configuration nginx est

worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 19000;
    # multi_accept on;
}
worker_rlimit_nofile    20000;  #each connection needs a filehandle (or 2 if you are proxying)

client_max_body_size 30M;
client_body_timeout   10;
client_header_timeout 10;
keepalive_timeout     5 5;
send_timeout          10;

    location ~ \.php$ {
    try_files $uri /er/error.php;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 256 16k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_max_temp_file_size 0;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/tmp/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

Que puis-je faire pour arrêter de manquer de connexions? Pourquoi cela continue-t-il de se produire? Je surveille mon trafic sur Google Analytics en temps réel et lorsque le nombre d'utilisateurs dépasse 120, mon php-fpm.log est plein de ces avertissements.

E3pO
la source

Réponses:

5

Avez-vous envisagé de suivre les bons conseils fournis dans le message du journal, augmentant la valeur de pm.max_children? Vous avez des seaux de RAM gratuits pour les accueillir.

Pour répondre à tes questions:

  • Que puis-je faire pour arrêter de manquer de connexions? Fournissez plus de connexions ou réduisez le nombre de connexions que vous recevez.
  • Pourquoi cela continue-t-il de se produire? Parce que vous continuez à manquer de connexions.
womble
la source
Désolé, cette erreur a été horodatée après l'avoir mise à jour à 150 sur 100 .... Oui, je l'ai. À quel réglage dois-je le régler pour tous mes béliers?
E3pO
Vous devez l'augmenter à (free/mem_per_worker)+150, où freeest la quantité de mémoire que vous aurez après avoir pris en compte les besoins d'autres processus dont les besoins en mémoire augmenteront avec plus de charge, et mem_per_workerc'est la quantité maximale de mémoire que vous prévoyez pour chaque processus de travail PHP nécessitant.
womble
4

Nous avons eu le même problème sur nos serveurs Web.

Vous pouvez essayer de faire réapparaître le processus enfant à chaque requête X, pour éviter les fuites de mémoire. Cela a bien fonctionné dans Apache et FPM, cela commence également à bien fonctionner.

 pm.max_requests = 50000

Cela redémarrera un processus enfant toutes les 50 000 demandes

Ali Alwash
la source