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.