Le 28/11/2012 11:14, Aurélien a écrit :
2012/11/28 [WHD-RS] Benjamin SCHILZ benjamin@whd-rs.com:
Bonjour à tous,
Je m’interroge sur la distribution des I/O réseaux sur un serveur Linux (Debian 6.0.6 ; 2.6.32-5-amd64) :
Les I/O sont toutes envoyées sur un cœur. Le truc que j’arrive pas à saisir c’est que sur d’autres serveurs avec la même version de noyau, driver réseau (e1000e) et le même genre de cartes réseaux (Intel sur CM Supermicro) ce n’est pas le cas :
#cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 53: 2136695 2136042 2138009 2137537 PCI-MSI-edge eth0 54: 42655676 42656495 42654333 42654706 PCI-MSI-edge eth1
Bonjour,
C'est lié au nombre de coeurs et à l'architecture physique de la carte mère. J'ai constaté qu'au delà de 4 coeurs, les interruptions sont wirées sur un coeur et plus distribuées (pour les fans, lire ce qui concerne l'io-apic dans le noyau).
irqbalance est à oublier, vu qu'il cherche l'économie d'énergie et pas la performance apparemment. Enfin, il ne fonctionne tout simplement pas quand on renomme les cartes (si ça ne commence pas par eth il est perdu). Perso j'ai fait des scripts dans le ifup.d qui redistribue les IRQs réseau en round-robin sur tous mes coeurs (je les matche avec une regex).
Il peut y avoir un intérêt à mettre plus de cartes en LACP par exemple, même si pas beaucoup de débit, pour utiliser tous les coeurs (je pense à un LB en DSR par exemple); et à des cartes genre intel ou broadcom qui ont 8 files txrx avec chacune une interruption.
Cordialement,
Bonjour,
Problème que j'ai aussi pu rencontrer de mon coté (même sur des kernels 3.2 de squeeze-backports, que je recommande en passant par rapport à un kernel 2.6.32 pour des machines à forte charge réseau ou avec matériel récent), irqbalance de son côté étant parfois totalement inefficace, parfois ne proposant pas une répartition idéale. A ne pas oublier qu'il est recommandé de n'envoyer les interrupts que vers les cœurs physiques et non pas vers les cœurs logiques (hyper threading) du/des CPU(s) et qu'irqbalance ne prends pas ce paramètre en compte.
Personnellement, je force la répartition manuellement dans le /etc/rc.local, ça n'est peut être pas très propre mais ça fonctionne sans soucis (ne pas oublier de revérifier que les numéros d'interrupts n'aient pas changés pour les périphériques suite à un changement de kernel par exemple ou scripter pour automatiser cela), pour plus de détails sur le format de la valeur à utiliser (possibilité d'envoyer les interrupts vers plusieurs cœurs en même temps et non pas seulement vers un seul) : https://cs.uwaterloo.ca/~brecht/servers/apic/SMP-affinity.txt
ps: il est aussi intéressant de faire de même pour les cartes RAID si applicable, de plus certaines cartes permettent également d'être vues en plusieurs "parties" dans la liste des devices afin de pouvoir mieux répartir la charge (ex: http://kb.lsi.com/KnowledgebaseArticle16667.aspx).
Cordialement.