Je voudrais découvrir la meilleure configuration / matériel possible pour fournir 40 Gbit / s à partir d'un seul serveur dans cette question.
Situation
Nous avons un serveur proxy de partage vidéo qui décharge les pics des serveurs de stockage lents derrière lui. Tout le trafic est uniquement HTTP. Le serveur agit comme un proxy inverse (fichiers qui ne sont pas mis en cache sur le serveur) et un serveur Web (fichiers qui sont stockés sur des lecteurs locaux).
Il y a actuellement quelque chose comme 100 To de fichiers et en croissance sur les serveurs de stockage backend.
Le mécanisme de mise en cache est implémenté indépendamment et cette question ne concerne pas la mise en cache elle-même car elle fonctionne très bien - fournit actuellement 14 Gbit / s, ne passe aux serveurs principaux que 2 Gbit / s. L'utilisation du cache est donc bonne.
Objectif
Obtenez un débit de 40 Gbit / s ou plus à partir d'une seule machine.
Matériel 1
HW: Supermicro SC825, X11SSL-F, Xeon E3-1230v5 (4C/8T@3.4GHz), 16 Go de RAM DDR4, 2x Supermicro 10G STGN-i1S (LACP L3 + 4)
SSD: 1x 512 Go Samsung, 2x 500 Go Samsung, 2x480 Go Intel 535, 1x 240 Go Intel S3500
Système:
- irqbalancer arrêté
- set_irq_affinity pour chaque interface (via script dans l'archive du pilote ixgbe)
- ixgbe-4.3.15
- Date limite du planificateur d'E / S
- iptables vides (modules déchargés)
- Système de fichiers: XFS
Nginx:
- envoyer le fichier
- fils aio
- directio 1M
- tcp_nopush sur
- tcp_nodelay sur
Comme on le voit sur les graphiques, nous avons pu pousser 12,5 Gbps. Malheureusement, le serveur ne répondait pas.
Il y a 2 choses qui ont attiré mon attention. Le premier est une quantité élevée d'IRQ. Dans ce cas, je n'ai malheureusement pas de graphiques de / proc / interrupts. La deuxième chose était une charge système élevée, ce qui, je pense, était dû au fait que kswapd0 avait des problèmes pour fonctionner avec 16 Go de RAM uniquement.
Matériel 2
HW: Supermicro SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1.70GHz), 128 Go de RAM DDR4, 2x Supermicro 10G STGN-i1S
SSD, la configuration du système est la même que pour le matériel 1. Nginx est sendfile (aio / sendfile comparé plus loin).
Cela semble mieux, alors maintenant que nous avons un serveur, qui fonctionne dans les pics, nous pouvons essayer quelques optimisations.
Sendfile vs aio threads
J'ai essayé de désactiver sendfile et d'utiliser des threads aio à la place.
- envoyer le fichier
- fils aio
- directio 1M (qui correspond à tous les fichiers que nous avons)
contre
- sendfile sur
Puis à 15h00, je suis revenu à sendfile et j'ai rechargé nginx (il a donc fallu un certain temps pour terminer les connexions existantes). Il est bon que l'utilisation du lecteur (mesurée par iostat) ait diminué. Rien n'a changé sur le trafic (malheureusement zabbix a décidé de ne pas collecter les données de bond0).
sendfile on / off
Je viens d'essayer d'activer / désactiver l'envoi. Rien n'a changé, sauf la reprogrammation des interruptions.
irqbalancer en tant que serveur / cron / désactivé
Comme @lsd l'a mentionné, j'ai essayé de configurer irqbalancer pour qu'il soit exécuté via cron:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
Malheureusement, cela n'a pas aidé dans mon cas. L'une des cartes réseau a commencé à se comporter de manière étrange:
Je n'ai pas pu trouver ce qui n'allait pas dans les graphiques et comme c'est arrivé le lendemain, je me suis connecté au serveur et j'ai vu qu'un cœur était à 100% (utilisation du système).
J'ai essayé de démarrer irqbalance en tant que service, le résultat était toujours le même.
Ensuite, j'ai décidé d'utiliser le script set_irq_affinity et il a résolu le problème immédiatement et le serveur a poussé à nouveau 17Gbps.
Matériel 3
Nous avons fait la mise à niveau vers un nouveau matériel: châssis de lecteurs 2U 24 (+2) (6xSFF), 2x Xeon E5-2620v4, 64 Go de RAM DDR4 (modules 4x16 Go), 13x SSD, 2x cartes réseau Supermicro (avec puce Intel). Les nouveaux processeurs ont beaucoup amélioré les performances.
La configuration actuelle reste - sendfile, etc. La seule différence est que nous ne laissons qu'un seul processeur gérer les deux cartes réseau (via le script set_irq_affinity).
La limite de 20 Gbps a été atteinte.
Prochain but? 30 Gbps.
N'hésitez pas à me tirer des idées pour améliorer les performances. Je serai heureux de le tester en direct et de partager quelques graphiques lourds ici.
Avez-vous des idées sur la façon de gérer une grande quantité de SoftIRQ sur le processeur?
Ce n'est pas une question de planification de capacité - j'ai déjà le matériel et le trafic. Je peux toujours répartir le trafic sur plusieurs serveurs (ce que je devrai faire à l'avenir de toute façon) et résoudre le problème avec de l'argent. Il s'agit cependant d'une question sur l'optimisation du système et l'optimisation des performances dans un scénario réel réel.