DRBD prestazioni di sincronizzazione terribili su 10GigE


15

Ho configurato una coppia di server identici con array RAID (8 core, 16GB RAM, 12x2 TB RAID6), 3 interfacce 10GigE, per ospitare alcuni servizi ad alta disponibilità.

I sistemi attualmente eseguono Debian 7.9 Wheezy oldstable (perché corosync / pacemaker non sono disponibili su stabile 8.x né su test).

  • Le prestazioni del disco locale sono di circa 900 MB / s in scrittura, 1600 MB / s in lettura.
  • il throughput di rete tra le macchine è superiore a 700 MB / s.
  • tramite iSCSI, ogni macchina può scrivere nella memoria dell'altra a più di 700 MB / s.

Tuttavia, indipendentemente dal modo in cui configuro DRBD, la velocità effettiva è limitata a 100 MB / s. Sembra davvero un limite hardcoded. Posso ridurre in modo affidabile le prestazioni modificando le impostazioni, ma non supera mai 1 Gbit (vengono raggiunti 122 MB / s per un paio di secondi alla volta). Sto davvero tirando i capelli su questo.

  • semplice kernel vanilla 3.18.24 amd64
  • drbd 8.9.2 ~ rc1-1 ~ bpo70 + 1

La configurazione è divisa in due file global-common.conf:

global {
        usage-count no;
}

common {
        handlers {
        }

        startup {
        }

        disk {
                on-io-error             detach;
         #       no-disk-flushes ;
        }
        net {
                max-epoch-size          8192;
                max-buffers             8192;
                sndbuf-size             2097152;
        }
        syncer {
                rate                    4194304k;
                al-extents              6433;
        }
}

e cluster.res:

resource rd0 {
        protocol C;
        on cl1 {
                device /dev/drbd0;
                disk /dev/sda4;
                address 192.168.42.1:7788;
                meta-disk internal;
        }

        on cl2 {
                device /dev/drbd0;
                disk /dev/sda4;
                address 192.168.42.2:7788;
                meta-disk internal;
        }
}

Uscita dallo cat /proc/drbdslave:

version: 8.4.5 (api:1/proto:86-101)
srcversion: EDE19BAA3D4D4A0BEFD8CDE 
 0: cs:SyncTarget ro:Secondary/Secondary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:4462592 dw:4462592 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:16489499884
        [>....................] sync'ed:  0.1% (16103024/16107384)M
        finish: 49:20:03 speed: 92,828 (92,968) want: 102,400 K/sec

Uscita da vmstat 2master (entrambe le macchine sono quasi completamente inattive):

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 14952768 108712 446108    0    0   213   254   16    9  0  0 100  0
 0  0      0 14952484 108712 446136    0    0     0     4 10063 1361  0  0 99  0
 0  0      0 14952608 108712 446136    0    0     0     4 10057 1356  0  0 99  0
 0  0      0 14952608 108720 446128    0    0     0    10 10063 1352  0  1 99  0
 0  0      0 14951616 108720 446136    0    0     0     6 10175 1417  0  1 99  0
 0  0      0 14951748 108720 446136    0    0     0     4 10172 1426  0  1 99  0

Output iperftra i due server:

------------------------------------------------------------
Client connecting to cl2, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[  3] local 192.168.42.1 port 47900 connected with 192.168.42.2 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  6.87 GBytes  5.90 Gbits/sec

La sincronizzazione apparentemente iniziale dovrebbe essere un po 'lenta, ma non così lenta ... Inoltre non reagisce realmente a nessun tentativo di limitare la velocità di sincronizzazione come drbdadm disk-options --resync-rate=800M all.


1
Hai provato a costruirlo asincrono, quindi fermarlo e ricostruirlo nuovamente sincronizzato?
Xavier Nicollet,

Risposte:


11

Nelle versioni più recenti di DRBD (8.3.9 e versioni successive) è disponibile un controller di risincronizzazione dinamica che deve essere ottimizzato. Nelle versioni precedenti dell'impostazione DRBD syncer {rate;}era sufficiente; ora viene utilizzato più come punto di partenza leggermente suggerito per la velocità di risincronizzazione dinamica.

Il controller di sincronizzazione dinamica è sintonizzato con le "impostazioni c" nella sezione del disco della configurazione di DRBD (vedere i $ man drbd.confdettagli su ciascuna di queste impostazioni).

Con 10 Gbe tra questi nodi e presupponendo una bassa latenza poiché viene utilizzato il protocollo C, la seguente configurazione dovrebbe rendere le cose più veloci:

risorsa rd0 {
        protocollo C;
        disco {
                c-fill-target 10M;
                c-velocità massima 700 M;
                c-plan-ahead 7;
                velocità c-min 4M;
        }
        su cl1 {
                dispositivo / dev / drbd0;
                disk / dev / sda4;
                indirizzo 192.168.42.1:7788;
                meta-disco interno;
        }

        su cl2 {
                dispositivo / dev / drbd0;
                disk / dev / sda4;
                indirizzo 192.168.42.2:7788;
                meta-disco interno;
        }
}

Se non sei ancora felice, prova max-buffersad aumentare fino a 12k. Se non sei ancora felice, puoi provare ad aumentare c-fill-targetcon incrementi di 2M.


In realtà con questa configurazione le prestazioni scendono a 3 MB / s. Sto cercando di giocare con queste impostazioni, ma le prospettive sono tristi.
Wazoox,

Finora, disabilitare il c-plan-ahead impostandolo a zero e aumentando la dimensione massima e i buffer massimi sembra fare il trucco.
Wazoox,

2
Cosa succede se aumenti i buffer massimi a 20k e il target c-fill a 20M? Credo che aumentare lentamente questi due valori alla fine ti darà i risultati che stai cercando.
Matt Kereczman,

È molto meglio! Non satura il collegamento (che è dedicato e sebbene sia OK riempire) ma sono già a 400 MB / s. Sto giocando un po 'con queste impostazioni ...
Wazoox,

1
Aumentare i buffer massimi da 250 a 2500 ha fatto la differenza giorno e notte (nella mia configurazione delle prestazioni non critica)
davidgo,

7

Qualcun altro mi ha suggerito di utilizzare queste impostazioni:

        disk {
                on-io-error             detach;
                c-plan-ahead 0;
        }
        net {
                max-epoch-size          20000;
                max-buffers             131072;
        }

E le prestazioni sono eccellenti.

Modifica: secondo @Matt Kereczman e altri suggerimenti, ho finalmente cambiato in questo:

disk {
        on-io-error             detach;
        no-disk-flushes ;
        no-disk-barrier;
        c-plan-ahead 0;
        c-fill-target 24M;
        c-min-rate 80M;
        c-max-rate 720M;
} 
net {
        # max-epoch-size          20000;
        max-buffers             36k;
        sndbuf-size            1024k ;
        rcvbuf-size            2048k;
}

La velocità di risincronizzazione è alta:

cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
srcversion: EDE19BAA3D4D4A0BEFD8CDE
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-
    ns:133246146 nr:0 dw:2087494 dr:131187797 al:530 bm:0 lo:0 pe:5 ua:106 ap:0 ep:1 wo:d oos:4602377004
        [>....................] sync'ed:  2.8% (4494508/4622592)M
        finish: 1:52:27 speed: 682,064 (646,096) K/sec

La velocità di scrittura è eccellente durante la risincronizzazione con queste impostazioni (80% della velocità di scrittura locale, velocità del filo pieno):

# dd if=/dev/zero of=./testdd bs=1M count=20k
20480+0 enregistrements lus
20480+0 enregistrements écrits
21474836480 octets (21 GB) copiés, 29,3731 s, 731 MB/s

La velocità di lettura è OK:

# dd if=testdd bs=1M count=20k of=/dev/null
20480+0 enregistrements lus
20480+0 enregistrements écrits
21474836480 octets (21 GB) copiés, 29,4538 s, 729 MB/s

Modifica successiva:

Dopo una risincronizzazione completa, le prestazioni sono molto buone (scrittura della velocità del filo, lettura della velocità locale). Resync è veloce (5/6 ore) e non influisce troppo sulle prestazioni (lettura della velocità del filo, scrittura della velocità del filo). Starò sicuramente con c-plan-ahead a zero. Con valori diversi da zero, la risincronizzazione è troppo lunga.


Aumentare i buffer massimi a 131 KB non è l'approccio più elegante per risolvere il problema. In sostanza, stai fornendo DRBD 512MiB di buffer di sistema da utilizzare per la sua risincronizzazione, che è molto spazio sul buffer. Ho visto accadere cose con buffer massimi maggiori di 80k. Consiglio vivamente di ottimizzare le impostazioni del controller di risincronizzazione, aumentando al massimo i buffer massimi a piccoli incrementi fino a quando non sei soddisfatto.
Matt Kereczman,

@MattKereczman Modificherò le impostazioni, ma mi piacerebbe avere un cluster ottimale (sincronizzato) il più velocemente possibile prima di giocare con le impostazioni di produzione .... Le impostazioni predefinite indicano che la sincronizzazione richiede almeno diversi giorni e fino per diverse settimane, questo non è semplicemente accettabile. La velocità di produzione richiesta è di 500 MB / s.
Wazoox,

4

c-plan-ahead deve impostare un valore positivo per abilitare il controller della velocità di sincronizzazione dinamica. disco c-plan-ahead 15; // 5 * RTT / 0.1s unit,in my case is 15 c-fill-target 24; c-max-rate 720M;

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.