43 votes

502 erreurs de passerelle sous forte charge (nginx / php-fpm)

Je travaille pour une très animée site internet qui est souvent très grosses pointes de trafic. Lors de ces pics de plusieurs centaines de pages par seconde de la demande de ce produit aléatoire 502 passerelle erreurs.

Maintenant, nous courons Nginx (1.0.10) et PHP-FPM sur une machine avec 4x SAS 15k disques (raid 10) avec un 16 core CPU et 24 go de ram DDR3. Aussi, nous utilisons les dernières Xcache version. La DB est situé sur une autre machine, mais cette machine de charge est très faible, et n'a pas de problèmes.

Dans des conditions normales de charge tout fonctionne parfait, le système de charge est inférieur à 1, et PHP-FPM rapport d'état n'a jamais vraiment montre plus de 10 processus actifs à un moment donné. Il y a toujours environ 10 GO de ram encore disponibles. Dans des conditions normales de charge de la machine gère environ 100 pages vues par seconde.

Le problème se pose lorsque d'énormes pointes de trafic d'arrivée, et des centaines de pages vues par seconde est requise de la machine. Je remarque que FPM état du rapport de la montre jusqu'à 50 processus actifs, mais qui est encore bien en dessous des 300 max connexions que nous avons configuré. Au cours de ces pointes de Nginx état des rapports de jusqu'à 5000 connexions actives au lieu de la moyenne normale de 1000.

OS Info: CentOS version 5.7 (Finale)

CPU: Intel(R) Xeon(R) CPU E5620 @ 2.40 GH (16 cœurs)

php-fpm.conf

daemonize = yes
listen = /tmp/fpm.sock
pm = static
pm.max_children = 300
pm.max_requests = 1000

Je n'ai pas d'installation rlimit_files, car autant que je sache, il doit utiliser le système par défaut si vous n'en avez pas.

fastcgi_params (uniquement des valeurs ajoutées de fichier standard)

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;

fastcgi_pass            unix:/tmp/fpm.sock;

nginx.conf

worker_processes        8;
worker_connections      16384;
sendfile                on;
tcp_nopush              on;
keepalive_timeout       4;

Nginx se connecte à FPM via Unix Socket.

sysctl.conf

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 1
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.eth0.rp_filter=1
net.ipv4.conf.lo.rp_filter=1
net.ipv4.ip_conntrack_max = 100000

les limites.conf

* soft nofile 65536
* hard nofile 65536

Ce sont les résultats pour les commandes suivantes:

ulimit -n
65536

ulimit -Sn
65536

ulimit -Hn
65536

cat /proc/sys/fs/file-max
2390143

Question: Si PHP-FPM n'est pas en cours d'exécution hors de connexions, la charge est encore faible, et il y a beaucoup de RAM disponible, ce goulot d'étranglement pourrait être la cause de ces aléatoire 502 passerelle des erreurs lors de la grande circulation?

Remarque: par défaut, cette machine ulimit ont été 1024, depuis que je l'ai changé à 65536 je n'avais pas redémarré la machine, comme c'est une machine de production et cela impliquerait trop de temps d'arrêt.

24voto

Timothy Perez Points 6379

Cela devrait résoudre le problème ...

Vous avez: fastcgi_buffers 4 256k;

Remplacez-le par: fastcgi_buffers 256 16k; // 4096k total

Définissez également fastcgi_max_temp_file_size 0 , qui désactivera la mise en mémoire tampon sur le disque si les réponses commencent à dépasser vos mémoires tampons fastcgi.

21voto

kait Points 111

Les sockets Unix acceptent 128 connexions par défaut. Il est bon de mettre cette ligne dans /etc/sysctl.conf

 net.core.somaxconn = 4096
 

1voto

Misiek Points 57

Si cela ne vous aide pas dans certains cas, utilisez la liaison de port normale au lieu de socket, car socket sur 300+ peut bloquer les nouvelles demandes forçant nginx à afficher 502.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X