5 votes

Nginx ravage le trafic sftp pendant les heures de pointe - tc est-il la réponse ?

Ceci est probablement une continuation de ma question précédente (sans réponse) car la cause sous-jacente est probablement la même.

J'ai un serveur Linux avec nginx et sshd en cours d'exécution dessus. Il est sur un lien partagé à 100 Mbit/s sans limite de données. Pendant les "heures de pointe" (essentiellement, pendant la journée aux États-Unis), les performances de sftp deviennent très mauvaises, parfois en temporisant avant même que je puisse me connecter. ssh n'est pas affecté. Je sais que c'est nginx car lorsque j'arrête nginx, le problème avec sftp disparaît instantanément. Cependant, nginx lui-même a essentiellement une latence nulle pendant ces "épisodes".

C'est un problème ancien avec mon serveur, et j'ai récemment décidé de m'en occuper une fois pour toutes. Hier, j'ai commencé à soupçonner que le simple volume de trafic http couplé à la latence plus élevée induite par un manque de bande passante amont empêchait mon trafic sftp. J'ai utilisé tc pour ajouter une certaine priorisation :

/sbin/tc qdisc add dev eth1 root handle 1: prio 
/sbin/tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:1
/sbin/tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:1
/sbin/tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:1

Malheureusement, même si je peux voir des paquets sftp s'accumuler dans la première priorité :

class prio 1:1 parent 1: 
 Sent 257065020 bytes 3548504 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
class prio 1:2 parent 1: 
 Sent 291943287326 bytes 206538185 pkt (dropped 615, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
class prio 1:3 parent 1: 
 Sent 22399809673 bytes 15525292 pkt (dropped 2334, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

... la latence est toujours inacceptable lors de la connexion. Voici quelques graphiques que j'ai faits récemment en essayant de corréler quelque chose avec la latence de sftp :

Voici la latence de sftp depuis un autre emplacement. J'ai défini le délai d'attente à 25 secondes. Tout ce qui est supérieur aux 1-2 secondes normaux qu'il faut pour se connecter et télécharger un petit fichier est inacceptable pour moi. Vous pouvez voir comment c'est correct la nuit puis la latence reprend pendant la journée.

Contenu de /proc/net/sockstat. Remarquez la corrélation apparente entre la latence de sftp et l'utilisation de la mémoire tcp. Aucune idée de ce que cela pourrait signifier.

Sortie du module stub-status de nginx. Rien à voir ici ...

Sortie de netstat -tan | awk '{print $6}' | sort | uniq -c. Encore une fois, semble plat.

Alors pourquoi tc ne fonctionne-t-il pas pour moi? Dois-je réellement limiter la bande passante plutôt que simplement prioriser le port 22 entrant et sortant? Ou est-ce que tc n'est pas l'outil approprié pour le travail et que j'ai complètement manqué la véritable cause des mauvaises performances de sftp?

Sortie de uname -a:

Linux [redacted] 3.2.0-0.bpo.2-amd64 #1 SMP Fri Jun 29 20:42:29 UTC 2012 x86_64 GNU/Linux

Je fais tourner nginx 1.2.2 avec le module de streaming mp4 compilé.

Édition du 31/07/2012 :

ewwhite a demandé si j'étais proche ou à ma limite de bande passante. J'ai vérifié, et il semble y avoir une corrélation (bien qu'imparfaite) entre la limite de 100 Mbit/s et la mauvaise latence de sftp :

Pourtant, pourquoi le trafic sftp (associé au port 22) ne serait-il pas prioritaire par rapport au trafic http pendant ces épisodes ?

Édition du 31/07/2012 #2

En collectant des données de latence sftp/scp, j'ai remarqué un schéma, comme le montre le graphique ci-dessous (les lignes vertes que j'ai ajoutées) :

Deux groupes - en soustrayant le "baseline" de la latence, ils sont à ~5 et ~10 secondes. Vous pouvez également les voir assez clairement sur le graphique de latence sftp ci-dessus sur une échelle de temps beaucoup plus grande. D'où vient ce chiffre de 5 secondes ?

2voto

ewwhite Points 193555

Quelques choses me sautent aux yeux...

  • Vous n'atteignez pas le débit maximal ou les limites de bande passante, n'est-ce pas ?
  • Avez-vous vérifié les niveaux de pool d'entropie du système pendant la période de ralentissement des performances sftp (vérifiez /proc/sys/kernel/random/entropy_avail) ? Par exemple, est-ce que vos sessions nginx effectuent beaucoup de requêtes SSL ? Cela peut avoir un effet clair sur d'autres services utilisant le cryptage.
  • Il y a quelques paramètres de réglage de sysctl.conf qui pourraient aider (taille de fenêtre tcp ?), mais sftp n'est pas très efficace. Est-ce que scp est une option ? Quelle est la taille des fichiers ?
  • DNS ? Rencontrez-vous des retards de recherche inversée ? Avez-vous un contrôle sur qui se connecte à vous ? Si c'est prévisible, essayez une entrée de stub pour les adresses IP sources dans /etc/hosts pour voir si cela aide.

1voto

Tim Sheiner Points 722

Il s'avère que j'avais au moins trois problèmes différents masquant les uns les autres. Voici ce que j'ai fait pour résoudre les problèmes :

  1. Prioriser ICMP et le trafic entrant/sortant sur le port 22 (comme indiqué dans ma question ci-dessus). Cela améliore la réactivité de sftp (par exemple, ls) et également le débit de transmission pendant les heures de pointe.

  2. Résoudre la pénurie d'entropie en installant le paquet haveged via les référentiels de Debian. Cela résout le problème de "bloquer pendant plusieurs minutes à select()". ewwhite++

  3. Ajouter UseDNS no à /etc/ssh/sshd_config et rehashez sshd. Cela résout le délai de sftp toutes les 5 secondes pendant les heures de pointe. Sergey Vlasov++

Mystères restants :

  • Mon hôte a initialement configuré /etc/resolv.conf pour moi en ajoutant deux de leurs serveurs de noms comme primaires. Il est compréhensible qu'un ou plusieurs de ces serveurs de noms soient surchargés pendant les heures de pointe (c'est-à-dire pendant la journée aux États-Unis), ce qui entraîne les retards par intervalles de 5 secondes que j'ai remarqués sur mes graphiques de latence sftp. Cependant, pourquoi sftp effectue-t-il une recherche DNS inverse à chaque fois que je transfère un fichier ? S'agissait-il simplement de cas où la recherche inverse a expiré lors de la connexion initiale, et ensuite, lors du premier transfert, le sous-système sftp a tenté à nouveau et a échoué à inverser mon IP ? Le système ne tente-t-il pas les serveurs de noms secondaires dans ce cas ? Quoi qu'il en soit, j'ai maintenant ajouté quelques serveurs de noms publics bien connus comme primaires par rapport à ceux surchargés de mon FAI, afin que d'autres applications potentielles exécutées sur ce même serveur ne rencontrent pas de problèmes DNS pendant les heures de pointe.

  • Que consomme l'entropie sur mon serveur ? Je n'ai trouvé aucune preuve que le nginx de base (servant des fichiers statiques) appelle rand(), et pourtant c'est exactement ce qui se passe. Est-ce le système de fichiers (ext3/4) ou est-ce une autre partie du noyau qui est impliquée d'une manière ou d'une autre ?

Quoi qu'il en soit, c'est assez bon pour le moment. Grâce à cette communauté, j'ai pu résoudre l'un des problèmes les plus ennuyeux et persistants que j'ai rencontrés au cours de plus de dix ans d'administration de serveurs web Unix.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X