Merci Vincent pour ces explications et recommandations, que j'ai prise en compte.
Néanmoins je me demande toujours pourquoi désactiver les TCP timestamps a un tel impact sur l'établissement des connexions TCP.
Damien> je suis en contact aussi avec eux, mais comme tout CDN ils ne peuvent rien faire sur le trafic dynamique ;)
Le 23 juillet 2013 12:14, Damien Wetzel dwetzel@nerim.net a écrit :
Bonjour Greg, On est en contact via cedexis. Si l'utilisation du cdn peut soulager vos problemes de perfs n'hesitez pas à l'utiliser. Cordialement,
Greg writes:
Bonjour,
je rencontre un problème d'établissement de connexions TCP sur un
serveur par forte charge, qui se concrétise par des
timeouts de connexion. Ce serveur établit de nombreuses connexions :
- serveur web NGiNX
- fichiers statiques sur NFSv4 (4 connexions TCP)
- reverse-proxy sur une 20ène de serveurs web Apache2/PHP, via l'IP
publique
- reverse-proxy sur un cluster XMPP
Evidemment il y a quelques axes d'améliorations simple : passer par le
réseau privé pour limiter les connexions sur
l'interface réseau publique, ... mais ce n'est pas le but de ce mail.
Sous forte charge, parfois une simple connexion TCP a des difficultés
pour s'établir. Pour tester, j'écarte des soucis
potentiels avec NGiNX et lance un serveur netcat sur le port 8080 : nc -l -k 8080
et depuis un poste client sous Linux : while true; do date -R | tee -a /dev/stderr | nc -w 2 perceval.local
8080 || echo ERR; sleep 0.2; done
Lorsque le problème survient, des "ERR" s'affichent.
A ce moment, j'ai tenté plusieurs choses pour tenter de trouver la
source de ces problèmes de connexions, et aucun ne
s'est avéré "payant" :
- désactiver le firewall
- supprimer et décharger conntrack
- changer l'algorythme de congestion TCP de cubic à autre chose
- mesurer le nombre de connexions TCP établit ou en FIN_WAIT : à 10k
total le soucis peut très bien se produire ou pas
- modifier plusieurs paramètre de config TCP / Kernel :
net.ipv4.tcp_sack = 1 net.ipv4.tcp_fack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_syncookies = 0 net.ipv4.tcp_low_latency = 0 net.core.netdev_max_backlog = 4000 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_max_syn_backlog = 163840 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_no_metrics_save = 1 net.ipv4.tcp_max_tw_buckets = 400000 net.core.somaxconn = 8192 fs.file-max = 1310720 net.ipv4.tcp_tw_recycle=1 net.ipv4.tcp_tw_reuse=1
En vain. Sauf un paramètre qui débloque tout quand il est désactivé : net.ipv4.tcp_timestamps=0
C'est très net, si je désactive les timestamps TCP coté serveur (ou
coté client forcément), je n'ai plus aucun problème
d'établissement de connexions TCP.
A ce moment commence les recherches sur Google, et tout ce que je
trouve est ambigu : il vaut mieux activer les
timestamps TCP pour des raisons de performances, mais il faut mieux les
désactiver pour des problèmes de sécurité.
Activé, l'attaquant peut récupérer l'uptime du serveur... Franchement
osef nan ?
Ce qui me gène plus, c'est qu'il est conseillé d'activer ce paramètre
en cas de soucis de congestion TCP...
Peut-être qu'avec la quantité de trafic, le kernel n'est pas capable de
fournir assez de timestamps ? Peut-être que la
fréquence du timer Linux a une incidence ? Le kernel utilisé est le 3.5.5 avec les patchs Google d'activé (RPS,
RFS) et cette config de timer :
CONFIG_NO_HZ=y CONFIG_HZ_250=y CONFIG_HZ=250
J'essaye avec 1000 HZ : aucune incidence.
La désactivation de ce paramètre net.ipv4.tcp_timestamps ne doit pas
agir que sur les timestamps, peut-être que les
algos de congestion TCP, ou certains modules, ou une partie de la stack
TCP, utilisent les timestamps TCP, et peut-être
que c'est un de ces modules qui pose problème ?
Avez vous déjà expérimenté ce type de soucis ? Je suis dispo pour faire des tests si vous avez des idées !!
-- Greg
Liste de diffusion du FRsAG http://www.frsag.org/
--
Damien WETZEL (ATANAR TECHNOLOGIES) ("`-/")_.-'"``-._ http://www.atanar.com . . `; -._ )-;-,_`) (v_,)' _ )`-.\ ``-' Phone:+33 9 63 05 59 99 _.- _..-_/ / ((.' - So much to do, so little time - ((,.-' ((,/