J'ai une petite configuration VPS avec nginx. Je veux en tirer le plus de performances possible, j'ai donc expérimenté l'optimisation et les tests de charge.
J'utilise Blitz.io pour effectuer des tests de charge en OBTENANT un petit fichier texte statique et en rencontrant un problème étrange où le serveur semble envoyer des réinitialisations TCP une fois que le nombre de connexions simultanées atteint environ 2000. Je sais que c'est un très grande quantité, mais en utilisant htop, le serveur a encore beaucoup à épargner en temps CPU et en mémoire, donc je voudrais trouver la source de ce problème pour voir si je peux le pousser encore plus loin.
J'utilise Ubuntu 14.04 LTS (64 bits) sur un VPS Linode 2 Go.
Je n'ai pas assez de réputation pour publier ce graphique directement, alors voici un lien vers le graphique Blitz.io:
Voici ce que j'ai fait pour essayer de déterminer la source du problème:
- La valeur de configuration nginx
worker_rlimit_nofile
est définie sur 8192 - ont
nofile
défini la valeur 64000 pour les limites matérielles et logicielles pourroot
et l'www-data
utilisateur (en tant que nginx s'exécute) dans/etc/security/limits.conf
il n'y a aucune indication que quelque chose se passe mal
/var/log/nginx.d/error.log
(généralement, si vous rencontrez des limites de descripteurs de fichiers, nginx affichera des messages d'erreur le disant)J'ai une configuration ufw, mais pas de règles de limitation de débit. Le journal ufw indique que rien n'est bloqué et j'ai essayé de désactiver ufw avec le même résultat.
- Il n'y a aucune erreur indicative dans
/var/log/kern.log
- Il n'y a aucune erreur indicative dans
/var/log/syslog
J'ai ajouté les valeurs suivantes
/etc/sysctl.conf
et les ai chargéessysctl -p
sans effet:net.ipv4.tcp_max_syn_backlog = 1024 net.core.somaxconn = 1024 net.core.netdev_max_backlog = 2000
Des idées?
EDIT: J'ai fait un nouveau test, en augmentant à 3000 connexions sur un très petit fichier (seulement 3 octets). Voici le graphique Blitz.io:
Encore une fois, selon Blitz, toutes ces erreurs sont des erreurs de «réinitialisation de la connexion TCP».
Voici le graphique de la bande passante Linode. Gardez à l'esprit que c'est une moyenne de 5 minutes, donc c'est un filtre passe-bas un peu (la bande passante instantanée est probablement beaucoup plus élevée), mais quand même, ce n'est rien:
CPU:
E / S:
Voici htop
vers la fin du test:
J'ai également capturé une partie du trafic à l'aide de tcpdump sur un test différent (mais d'aspect similaire), démarrant la capture lorsque les erreurs ont commencé à arriver:
sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80
Voici le fichier si quelqu'un veut y jeter un œil (~ 20 Mo): https://drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view?usp=sharing
Voici un graphique de la bande passante de Wireshark:
(La ligne correspond à tous les paquets, les barres bleues sont des erreurs TCP)
D'après mon interprétation de la capture (et je ne suis pas un expert), il semble que les drapeaux TCP RST proviennent de la source de test de charge, pas du serveur. Donc, en supposant que quelque chose ne va pas du côté du service de test de charge, est-il sûr de supposer que cela est le résultat d'une sorte de gestion de réseau ou d'atténuation DDOS entre le service de test de charge et mon serveur?
Merci!
net.core.netdev_max_backlog
2000? Plusieurs exemples que j'ai vus ont un ordre de grandeur plus élevé pour les connexions gigabit (et 10Gig).