Pourquoi ma liaison gigabit n'offre pas un débit d'au moins 150 Mo / s?

17

J'ai directement connecté deux crossover PowerEdge 6950 (en utilisant des lignes droites) sur deux adaptateurs PCIe différents.

J'obtiens un lien gigabit sur chacune de ces lignes (1000 MBit, full duplex, flux contol dans les deux sens).

Maintenant, j'essaie de lier ces interfaces dans bond0 en utilisant l'algorithme rr des deux côtés (je veux obtenir 2000 MBit pour une seule session IP).

Lorsque j'ai testé le débit en transférant / dev / zero vers / dev / null en utilisant dd bs = 1M et netcat en mode tcp, j'obtiens un débit de 70 Mo / s - pas - comme prévu plus de 150 Mo / s.

Lorsque j'utilise les lignes simples, j'obtiens environ 98 Mo / s sur chaque ligne, si j'utilise une direction différente pour chaque ligne. Lorsque j'utilise les lignes simples, j'obtiens 70 Mo / s et 90 Mo / s sur la ligne, si le trafic va dans la "même" direction.

Après avoir lu le fichier readme de liaison (/usr/src/linux/Documentation/networking/bonding.txt), j'ai trouvé la section suivante utile: (13.1.1 Sélection du mode de liaison MT pour la topologie à commutateur unique)

balance-rr: Ce mode est le seul mode qui permettra à une seule connexion TCP / IP de répartir le trafic sur plusieurs interfaces. C'est donc le seul mode qui permettra à un même flux TCP / IP d'utiliser plus d'une interface de débit. Cependant, cela a un coût: la répartition a souvent pour résultat que les systèmes homologues reçoivent des paquets dans le désordre, ce qui provoque le démarrage du système de contrôle de congestion de TCP / IP, souvent en retransmettant des segments.

    It is possible to adjust TCP/IP's congestion limits by
    altering the net.ipv4.tcp_reordering sysctl parameter. The
    usual default value is 3, and the maximum useful value is 127.
    For a four interface balance-rr bond, expect that a single
    TCP/IP stream will utilize no more than approximately 2.3
    interface's worth of throughput, even after adjusting
    tcp_reordering.

    Note that this out of order delivery occurs when both the
    sending and receiving systems are utilizing a multiple
    interface bond.  Consider a configuration in which a
    balance-rr bond feeds into a single higher capacity network
    channel (e.g., multiple 100Mb/sec ethernets feeding a single
    gigabit ethernet via an etherchannel capable switch).  In this
    configuration, traffic sent from the multiple 100Mb devices to
    a destination connected to the gigabit device will not see
    packets out of order.  However, traffic sent from the gigabit
    device to the multiple 100Mb devices may or may not see
    traffic out of order, depending upon the balance policy of the
    switch.  Many switches do not support any modes that stripe
    traffic (instead choosing a port based upon IP or MAC level
    addresses); for those devices, traffic flowing from the
    gigabit device to the many 100Mb devices will only utilize one
    interface.

Maintenant, j'ai changé ce paramètre sur les deux serveurs connectés sur toutes les lignes (4) de 3 à 127.

Après le collage à nouveau, j'obtiens environ 100 Mo / s mais toujours pas plus que cela.

Des idées pourquoi?

Mise à jour: détails du matériel de lspci -v:

24:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
        Subsystem: Intel Corporation PRO/1000 PT Dual Port Server Adapter
        Flags: bus master, fast devsel, latency 0, IRQ 24
        Memory at dfe80000 (32-bit, non-prefetchable) [size=128K]
        Memory at dfea0000 (32-bit, non-prefetchable) [size=128K]
        I/O ports at dcc0 [size=32]
        Capabilities: [c8] Power Management version 2
        Capabilities: [d0] MSI: Mask- 64bit+ Count=1/1 Enable-
        Capabilities: [e0] Express Endpoint, MSI 00
        Kernel driver in use: e1000
        Kernel modules: e1000

Mettre à jour les résultats finaux:

8589934592 octets (8,6 Go) copiés, 35,8489 secondes, 240 Mo / s

J'ai changé beaucoup d'options TCP / IP et de pilote de bas niveau. Cela comprend l'élargissement des tampons réseau. C'est pourquoi ddaffiche maintenant des nombres supérieurs à 200 Mo / s: dd se termine alors qu'il y a encore une sortie en attente de transfert (dans les tampons d'envoi).

Mise à jour 2011-08-05: paramètres qui ont été modifiés pour atteindre l'objectif ( /etc/sysctl.conf ):

# See http://www-didc.lbl.gov/TCP-tuning/linux.html
# raise TCP max buffer size to 16 MB. default: 131071
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# raise autotuninmg TCP buffer limits
# min, default and max number of bytes to use
# Defaults:
#net.ipv4.tcp_rmem = 4096 87380 174760
#net.ipv4.tcp_wmem = 4096 16384 131072
# Tuning:
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Default: Backlog 300
net.core.netdev_max_backlog = 2500
#
# Oracle-DB settings:
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
kernel.shmmax = 2147659776
kernel.sem = 1250 256000 100 1024
net.core.rmem_default = 262144
net.core.wmem_default = 262144
#
# Tuning for network-bonding according to bonding.txt:
net.ipv4.tcp_reordering=127

Paramètres spéciaux pour le périphérique de liaison (SLES: / etc / sysconfig / network / ifcfg-bond0 ):

MTU='9216'
LINK_OPTIONS='txqueuelen 10000'

Notez que la définition du plus grand MTU possible était la clé de la solution.

Réglage des tampons rx / tx des cartes réseau impliquées:

/usr/sbin/ethtool -G eth2 rx 2048 tx 2048
/usr/sbin/ethtool -G eth4 rx 2048 tx 2048
Nils
la source
Avez-vous vérifié /proc/net/bonding/bond0pour vous assurer que vous vous mettez bien en équilibre-rr ? Avez-vous vu la note n que la documentation que vous avez collée sur une liaison à 4 interfaces ne vous donne que 2,3 interfaces de débit? Compte tenu de cette note, il semble hautement improbable que vous vous rapprochiez des 2000 Mo / s que vous souhaitez.
Zoredache
Je ne suis pas sûr que LACP / Bonding puisse diviser une seule session TCP sur plusieurs liaisons physiques.
Kedare
@Kedare, ce n'est pas LACP, c'est le planificateur de paquets round-robin des modules de liaison Linux qui peut utiliser plusieurs liens pour une seule session TCP.
larsks
1
Une meilleure façon de tester le débit sur une liaison est d'utiliser nuttcp. Testez facilement des connexions uniques ou multiples.
MikeyB

Réponses:

8

J'ai eu un problème similaire en essayant d'augmenter la vitesse d'une synchronisation drbd sur deux liaisons gigabit il y a quelque temps. Au final, j'ai réussi à obtenir une vitesse de synchronisation d'environ 150 Mo / s. Ce sont les paramètres que j'ai appliqués sur les deux nœuds:

ifconfig bond0 mtu 9000
ifconfig bond0 txqueuelen 10000
echo 3000 > /proc/sys/net/core/netdev_max_backlog

Vous pouvez également essayer d'activer la coalescence d'interruption si vous n'en avez pas déjà pour vos cartes réseau (avec ethtool --coalesce )

user842313
la source
Je ne sais pas. Ce n'était pas nécessaire dans mon cas. La définition de ces paramètres était suffisante. Mais je suppose que si vous le réglez, cela ne fera pas mal. Le taux de transfert s'est-il amélioré?
user842313
1
Actuellement, je ne peux pas tester cela, mais ce sera le plus approprié. Votre allusion à la «coalescence» frappe proprement. J'ai trouvé un article intéressant (en allemand) sur les paramètres "High Speed ​​Ethernet". Les trames jumbo vont dans le même sens - il s'agit de réduire le nombre d'interruptions PCI nécessaires au transfert de la charge de travail.
Nils
Si vous pensez à un goulot d'étranglement comme une limite d'interruptions, un outil comme collectd vous aidera certainement, bien qu'il nécessiterait un peu de configuration. Voir, par exemple, ce graphique
user842313
0

Avez-vous configuré cette jonction bidirectionnelle sur le commutateur? sinon, cela ne fonctionnera pas comme ça, il fonctionnera simplement en mode actif / passif et n'utilisera que 1 des liens 1Gbps.

Chopper3
la source
Aucun périphérique réseau n'est impliqué. Ce sont des câbles croisés directs.
Nils
5
Ah, donc vous n'avez pas de chance pour une autre raison entièrement différente alors; Les jonctions LACP / Etherchannel telles que celles-ci dépendent de la variance du premier (et le cas échéant des deuxième et troisième) bits les moins significatifs du MAC de destination pour définir quel membre de jonction est utilisé pour communiquer avec ce MAC. Étant donné que vous n'aurez qu'un seul MAC pour le tronc à chaque extrémité, ils n'utiliseront jamais plus d'un lien.
Chopper3
2
il n'utilise pas etherchannel / 802.3ad, il utilise balance-rr, qui, pour être exact, ne nécessite même aucun support de commutateur.
the-wabbit
@ Chopper3: Donc, le problème MAC ne devrait pas apparaître dans RR à votre avis?
Nils
2
Je ne sais pas assez bien pour commenter, j'aurais aimé avoir mentionné ce genre de choses plus tôt, mais peu importe.
Chopper3
0

Il semble que le PowerEdge 6950 soit limité à des emplacements PCI pouvant atteindre 133 Mo / s partagés sur l'ensemble du bus. Vous pouvez voir des limitations d'E / S sur l'architecture de bus système elle-même.

En plus d'avoir d'autres systèmes avec différents matériels et architectures d'E / S à tester, le câblage peut également entrer en jeu. Certaines combinaisons possibles peuvent aller dans le sens de notes différentes (5e contre 6) ainsi que de longueurs (plus courte n'est pas toujours meilleure).

user48838
la source
J'ai déjà obtenu 160 Mo / s - en utilisant les lignes simples simultanées. Mais cela tombe à 100 Mo / s lors de la liaison. Sur chaque ligne, j'obtiens près de 100 Mo / s, donc les câbles ne semblent pas non plus être le problème.
Nils
Il ne semble pas y avoir de prise en charge PCIe pour le PowerEdge 6950. Quelque chose de "différent" avec son bus PCI? Nonobstant, vous pouvez consulter les spécifications du bus IO pour le PowerEdge 6950.
user48838
J'ai mis à jour la question avec la sortie de lspci. Ce n'était pas le goulot d'étranglement. J'obtiens mes 200 Mo / s maintenant.
Nils
0

Cadres Jumbo?

ifconfig <interface> mtu 9000
Julien Vehent
la source
Cela devrait réduire la charge du processeur non? Je me demande ce que fait le CPU pendant ces tests.
SpacemanSpiff
1
avec une MTU de 9000 au lieu de 1500, vous réduisez le nombre de paquets de données tcp dont vous avez besoin pour transférer la même quantité de données (la charge utile est plus importante). Vous effectuez donc moins de traitement de paquets, des deux côtés et dans les deux sens, et envoyez plus de données.
Julien Vehent
Il semble que cela vaut la peine d'essayer. Les processeurs sont assez inactifs pendant le transfert. Mais j'ai toujours le sentiment qu'un lien physique attend un ACK avant que le noyau n'envoie le prochain paquet sur l'autre lien physique.
Nils
Je suis aussi curieux du résultat. Essayez également de lier chaque carte réseau à un cœur de processeur. Un noyau récent devrait gérer cela correctement, mais je ne sais pas comment cela fonctionnerait avec la liaison. L'idée est d'éviter de passer d'un cache l2 à un autre pour chaque paquet.
Julien Vehent
La charge CPU n'est pas un problème. Toutes les options de déchargement sont activées ...
Nils
0

faire des images jumbo est une aide gigantesque, tant que votre commutateur et nic le supportent. si vous avez un siwtch non géré, vous n'irez probablement pas où vous voulez pour la bande passante, mais ce n'est pas le cas si vous liez les ports ensemble sur le commutateur. voici quelque chose que j'ai appris il y a longtemps, 65% du temps, c'est un problème physique. utilisez-vous un câble cat6?

Will - TechToolbox
la source
0

si vous avez configuré des trames jumbo sur vos cartes réseau, vous pouvez vous assurer que vous avez configuré vos commutateurs pour prendre en charge le MTU élevé également.

Les trames Jumbo sont d'excellentes performances sur les réseaux gigabits, mais vous devez vous assurer que vous les avez configurées de bout en bout (les serveurs source et de destination et les commutateurs réseau qu'ils utilisent).

ashmere
la source
Aucun périphérique réseau n'est impliqué dans ce cas particulier. (lignes de croisement directes). C'est également le seul (réel) cas où vous pouvez utiliser l'algorithme RR pour obtenir la charge partagée sur toutes les lignes pour une seule session.
Nils