Perché il mio gigabit bond non eroga almeno 150 MB / s di throughput?


17

Ho collegato direttamente due crossover PowerEdge 6950 (usando linee rette) su due diversi adattatori PCIe.

Ottengo un collegamento gigabit su ciascuna di queste linee (1000 MBit, full duplex, controllo del flusso in entrambe le direzioni).

Ora sto cercando di collegare queste interfacce in bond0 usando l'algoritmo rr su entrambi i lati (voglio ottenere 2000 MBit per una singola sessione IP).

Quando ho testato il throughput trasferendo / dev / zero su / dev / null usando dd bs = 1M e netcat in modalità tcp ottengo un throughput di 70 MB / s - non - come previsto più di 150 MB / s.

Quando uso le singole linee ottengo circa 98 MB / s su ciascuna linea, se ho usato una direzione diversa per ogni linea. Quando uso le singole linee ottengo 70 MB / se 90 MB / s sulla linea, se il traffico va nella "stessa" direzione.

Dopo aver letto il readme di bonding (/usr/src/linux/Documentation/networking/bonding.txt) ho trovato utile la seguente sezione: (13.1.1 Selezione della modalità Bonding MT per topologia a singolo switch)

balance-rr: questa modalità è l'unica modalità che consentirà a una singola connessione TCP / IP di trasferire il traffico su più interfacce. È quindi l'unica modalità che consentirà a un singolo flusso TCP / IP di utilizzare più di una velocità di trasmissione di un'interfaccia. Questo ha un costo, tuttavia: lo striping comporta spesso che i sistemi peer ricevano i pacchetti fuori servizio, causando l'avvio del sistema di controllo della congestione di TCP / IP, spesso ritrasmettendo segmenti.

    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.

Ora ho modificato quel parametro su entrambi i server collegati su tutte le linee (4) da 3 a 127.

Dopo aver nuovamente incollato ottengo circa 100 MB / s, ma non di più.

Qualche idea sul perché?

Aggiornamento: dettagli hardware da 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

Aggiorna i risultati finali:

8589934592 byte (8,6 GB) copiati, 35,8489 secondi, 240 MB / s

Ho cambiato molte opzioni di tcp / ip e driver di basso livello. Ciò include l'ampliamento dei buffer di rete. Questo è il motivo per cui ddora mostra numeri maggiori di 200 MB / s: dd termina mentre c'è ancora un output in attesa di essere trasferito (nei buffer di invio).

Aggiornamento 2011-08-05: Impostazioni modificate per raggiungere l'obiettivo ( /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

Impostazioni speciali per il dispositivo bond (SLES: / etc / sysconfig / network / ifcfg-bond0 ):

MTU='9216'
LINK_OPTIONS='txqueuelen 10000'

Si noti che l'impostazione della MTU più grande possibile è stata la chiave della soluzione.

Ottimizzazione dei buffer rx / tx delle schede di rete interessate:

/usr/sbin/ethtool -G eth2 rx 2048 tx 2048
/usr/sbin/ethtool -G eth4 rx 2048 tx 2048

Hai verificato /proc/net/bonding/bond0per verificare che stai effettivamente impostando in balance-rr ? Hai visto la nota n che la documentazione che hai incollato su un legame a 4 interfacce che ti offre solo interfacce 2.3 di valore di throughput? Data questa nota, sembra altamente improbabile che ti avvicini ai 2000mb / s che desideri.
Zoredache,

Non sono sicuro che LACP / Bonding possa dividere una singola sessione TCP su più collegamenti fisici.
Kedare,

@Kedare, questo non è LACP, questo è lo scheduler dei pacchetti round robin dei moduli di legame Linux che può utilizzare più collegamenti per una singola sessione TCP.
Larsks,

1
Un modo migliore di testare la velocità effettiva su un collegamento è utilizzare nuttcp. Prova facilmente connessioni singole o multiple.
MikeyB,

Risposte:


8

Ho avuto un problema simile nel tentativo di aumentare la velocità di una sincronizzazione DRDB su due collegamenti Gigabit qualche tempo fa. Alla fine sono riuscito a ottenere una velocità di sincronizzazione di circa 150 MB / sec. Queste erano le impostazioni che ho applicato su entrambi i nodi:

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

Potresti anche provare ad abilitare la coalescenza di interruzione se non lo hai già per le tue schede di rete (con ethtool --coalesce )


Non lo so. Non era necessario nel mio caso. L'impostazione di questi parametri è stata sufficiente. Ma immagino che se lo imposti non farà male. La velocità di trasferimento è migliorata?
user842313

1
Al momento non riesco a provarlo, ma sarà molto probabilmente. Il tuo suggerimento sulla "coalescenza" colpisce probabilmente il segno. Ho trovato un articolo interessante (in tedesco) sulle impostazioni "Ethernet ad alta velocità". I frame jumbo vanno nella stessa direzione: si tratta solo di ridurre il numero di interruzioni PCI necessarie per trasferire il carico di lavoro.
Nils,

Se stai pensando ad alcuni colli di bottiglia come il limite di interruzioni, uno strumento come collectd ti aiuterà sicuramente, anche se richiederebbe un po 'di installazione. Vedi, ad esempio, questo grafico
user842313

0

Hai configurato questo trunk a due vie sullo switch? in caso contrario, non funzionerà in questo modo, funzionerà solo in modalità attiva / passiva e utilizzerà solo 1 dei collegamenti 1Gbps.


Nessun dispositivo di rete coinvolto. Questi sono cavi crossover diretti.
Nils,

5
Ah, quindi sei sfortunato per un'altra ragione completamente diversa allora; I trunk LACP / Etherchannel come questo si basano sulla varianza nel primo (e ove appropriato secondo e terzo) bit meno significativo del MAC di destinazione per definire quale elemento trunk viene utilizzato per comunicare con quel MAC. Dato che avrai solo un MAC per il trunk su ciascuna estremità, non useranno mai più di un link.
Chopper3,

2
non sta usando etherchannel / 802.3ad, sta usando balance-rr, che, per essere precisi, non richiede nemmeno alcun supporto switch.
the-wabbit,

@ Chopper3: Quindi il problema MAC non dovrebbe apparire in RR secondo te?
Nils,

2
Non lo so abbastanza bene per commentare, un po 'avrei desiderato che avessi menzionato quella roba prima ma non importa.
Chopper3,

0

Sembra che PowerEdge 6950 sia limitato a possibili slot PCI che superano i 133 MB / s condivisi su tutto il bus. Potresti riscontrare limitazioni I / O sull'architettura del bus di sistema stesso.

Oltre ad avere altri sistemi con hardware e architetture I / O diversi da testare, anche i cavi potrebbero entrare in gioco. Alcune possibili combinazioni possono essere lungo le linee di diverse valutazioni (5e contro 6) e lunghezze (più corto non è sempre migliore).


Ho già ottenuto 160 MB / s - usando le singole linee simultanee. Ma questo scende a 100 MB / s al momento del collegamento. Su ogni singola linea ottengo quasi 100 MB / s, quindi i cavi non sembrano essere il problema.
Nils,

Non sembra esserci alcun supporto PCIe per PowerEdge 6950. Qualcosa di "diverso" con il suo bus PCI? Tuttavia, è possibile cercare le specifiche del bus IO per PowerEdge 6950.
user48838

Ho aggiornato la domanda con l'output di lspci. Questo non era il collo di bottiglia. Ricevo i miei 200 MB / s ora.
Nils,

0

Frame Jumbo?

ifconfig <interface> mtu 9000

Ciò dovrebbe ridurre il carico della CPU, giusto? Mi chiedo cosa stia facendo la CPU durante questi test.
SpacemanSpiff

1
con un MTU di 9000 anziché 1500, riduci il numero di pacchetti di dati tcp necessari per trasferire la stessa quantità di dati (il payload è maggiore). In questo modo si esegue meno l'elaborazione dei pacchetti, su entrambi i lati e in entrambi i modi, e si inviano più dati.
Julien Vehent,

Sembra che valga la pena provare. Le CPU sono abbastanza inattive durante il trasferimento. Ma ho ancora la sensazione che un collegamento fisico sia in attesa di un ACK prima che il kernel invii il pacchetto successivo sull'altro collegamento fisico.
Nils,

Sono curioso anche del risultato. Inoltre, prova a collegare ogni scheda di rete a un core della CPU. Un kernel recente dovrebbe gestirlo correttamente, ma non sono sicuro di come funzionerebbe con il bonding. L'idea è di evitare il passaggio da una cache l2 a un'altra per ogni pacchetto.
Julien Vehent,

Il carico della CPU non è un problema. Tutte le opzioni di offload sono attivate ...
Nils,

0

fare jumbo frame è un aiuto gigantesco, purché il tuo switch e nic lo supportino. se si dispone di un siwtch non gestito, molto probabilmente non si arriva dove si desidera per la larghezza di banda, ma non è così se si collegano le porte sullo switch. ecco qualcosa che ho imparato molto tempo fa, il 65% delle volte, è un problema fisico. stai usando il cavo cat6?


0

se hai configurato jumbo frame sulle tue schede di rete che dall'aspetto hai assicurato di aver configurato i tuoi switch per supportare anche l'MTU alto.

I frame jumbo offrono prestazioni eccezionali su reti gigabit, ma è necessario assicurarsi di averli configurati end-to-end (sia i server di origine che di destinazione e gli switch di rete che utilizzano).


Non ci sono dispositivi di rete coinvolti in questo caso speciale. (linee crossover dirette). Questo è anche l'unico caso (reale) in cui è possibile utilizzare l'algoritmo RR per condividere il carico su tutte le linee per una singola sessione.
Nils,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.