DRBD schreckliche Synchronisationsleistung auf 10GigE

14

Ich habe ein Paar identischer Server mit RAID-Arrays (8 Kerne, 16 GB RAM, 12 x 2 TB RAID6) und 3 10GigE-Schnittstellen eingerichtet, um einige hochverfügbare Dienste zu hosten.

Auf den Systemen läuft derzeit Debian 7.9 Wheezy oldstable (da Corosync / Schrittmacher unter 8.x nicht verfügbar sind und auch nicht getestet werden).

  • Die Leistung der lokalen Festplatte beträgt etwa 900 MB / s beim Schreiben und 1600 MB / s beim Lesen.
  • Der Netzwerkdurchsatz zwischen den Computern beträgt über 700 MB / s.
  • Über iSCSI kann jeder Computer mit mehr als 700 MB / s in den Speicher des anderen Computers schreiben.

Unabhängig davon, wie ich DRBD konfiguriere, ist der Durchsatz jedoch auf 100 MB / s begrenzt. Es sieht wirklich nach einer fest programmierten Grenze aus. Ich kann die Leistung zuverlässig verringern, indem ich die Einstellungen ändere, aber es geht nie über 1 GBit (122 MB / s werden jeweils für ein paar Sekunden erreicht). Ich ziehe mir wirklich die Haare.

  • einfacher Vanillekern 3.18.24 amd64
  • drbd 8.9.2 ~ rc1-1 ~ bpo70 + 1

Die Konfiguration ist in zwei Dateien aufgeteilt 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;
        }
}

und 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;
        }
}

Ausgabe von cat /proc/drbdam Slave:

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

Ausgabe vom vmstat 2Master (beide Maschinen sind fast vollständig inaktiv):

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

Ausgabe iperfzwischen den beiden Servern:

------------------------------------------------------------
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

Anscheinend soll die anfängliche Synchronisation etwas langsam sein, aber nicht so langsam ... Außerdem reagiert sie nicht wirklich auf den Versuch, die Synchronisationsrate zu drosseln drbdadm disk-options --resync-rate=800M all.

Wazoox
quelle
1
Haben Sie versucht, es asynchron zu erstellen, dann anzuhalten und es erneut zu synchronisieren?
Xavier Nicollet

Antworten:

11

In neueren Versionen von DRBD (8.3.9 und neuer) gibt es einen dynamischen Resync-Controller, der optimiert werden muss. In älteren DRBD-Versionen war die Einstellung syncer {rate;}ausreichend; Jetzt wird es eher als Startpunkt für die dynamische Resync-Geschwindigkeit empfohlen.

Der Controller für die dynamische Synchronisierung ist auf die "c-settings" im Festplattenabschnitt der DRBD-Konfiguration abgestimmt ( $ man drbd.confEinzelheiten zu diesen Einstellungen finden Sie unter).

Mit 10 GBe zwischen diesen Knoten und der Annahme einer geringen Latenz, da Protokoll C verwendet wird, sollte die folgende Konfiguration die Dinge schneller voranbringen:

Ressource rd0 {
        Protokoll C;
        Scheibe {
                c-Füllziel 10M;
                c-max-Rate 700 M;
                c-plan-ahead 7;
                c-min-Rate 4 M;
        }
        auf cl1 {
                device / dev / drbd0;
                disk / dev / sda4;
                Adresse 192.168.42.1:7788;
                Meta-Disk intern;
        }

        auf cl2 {
                device / dev / drbd0;
                disk / dev / sda4;
                Adresse 192.168.42.2:7788;
                Meta-Disk intern;
        }
}

Wenn Sie immer noch nicht glücklich sind, versuchen Sie, max-buffersbis zu 12k zu drehen . Wenn Sie immer noch nicht zufrieden sind, können Sie versuchen, c-fill-targetin Schritten von 2 Millionen zu erscheinen.

Matt Kereczman
quelle
Tatsächlich sinkt die Leistung mit dieser Konfiguration auf 3 MB / s. Ich versuche, mit diesen Einstellungen zu spielen, aber die Aussichten sind düster.
Wazoox
Bisher scheint es der Trick zu sein, c-plan-ahead zu deaktivieren, indem man es auf Null setzt und die maximale Epochengröße und die maximalen Puffer erhöht.
Wazoox
2
Was passiert, wenn Sie den Maximalpuffer auf 20.000 und das C-Fill-Ziel auf 20.000 erhöhen? Ich glaube, wenn Sie diese beiden Werte langsam erhöhen, erhalten Sie schließlich die gewünschten Ergebnisse.
Matt Kereczman
Das ist viel besser! Es sättigt den Link nicht (der dediziert ist und obwohl es in Ordnung ist, ihn zu füllen), aber ich bin bereits bei 400 MB / s. Ich spiele ein bisschen mit diesen Einstellungen ...
Wazoox
1
Die Erhöhung der Maximalpuffer von 250 auf 2500 hat für mich (in meinem unkritischen Performance-Setup) Tag und Nacht einen Unterschied gemacht
Davidgo,
7

Jemand anderswo schlug vor, dass ich diese Einstellungen verwende:

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

Und die Leistung ist hervorragend.

Edit: Nach @Matt Kereczman und anderen Vorschlägen habe ich endlich folgendes geändert:

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;
}

Resync-Geschwindigkeit ist hoch:

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

Die Schreibgeschwindigkeit ist während der Resynchronisation mit diesen Einstellungen ausgezeichnet (80% der lokalen Schreibgeschwindigkeit, Volldrahtgeschwindigkeit):

# 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

Lesegeschwindigkeit ist 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

Später bearbeiten:

Nach einer vollständigen Neusynchronisierung ist die Leistung sehr gut (Schreiben mit Kabelgeschwindigkeit, Lesen mit lokaler Geschwindigkeit). Resync ist schnell (5/6 Stunden) und beeinträchtigt die Leistung nicht zu sehr (Lesen der Drahtgeschwindigkeit, Schreiben der Drahtgeschwindigkeit). Ich bleibe definitiv bei c-plan-ahead bei null. Bei Werten ungleich Null ist die Resynchronisation viel zu lang.

Wazoox
quelle
Das Erhöhen der maximalen Puffer auf 131 KB ist nicht die eleganteste Methode zur Lösung Ihres Problems. Sie geben DRBD im Wesentlichen 512 MB Systempuffer für die Resynchronisierung, was viel Pufferplatz bedeutet. Ich habe gesehen, wie Dinge mit Max-Puffern geschehen, die größer als 80.000 sind. Ich würde dringend empfehlen, die Einstellungen des Resync-Controllers zu optimieren und gleichzeitig die maximalen Puffer in kleinen Schritten zu erhöhen, bis Sie zufrieden sind.
Matt Kereczman
@MattKereczman Ich werde die Einstellungen ändern, aber ich möchte so schnell wie möglich einen optimalen (synchronisierten) Cluster haben, bevor ich mit den Produktionseinstellungen spiele. Die Standardeinstellungen bedeuten, dass die Synchronisierung mindestens mehrere Tage und länger dauert Bis zu mehreren Wochen ist dies einfach nicht akzeptabel. Der erforderliche Produktionsdurchsatz beträgt 500 MB / s.
Wazoox
4

c-plan-ahead muss einen positiven Wert einstellen, um die dynamische Synchronisationsratensteuerung zu aktivieren. Platte c-plan-ahead 15; // 5 * RTT / 0.1s unit,in my case is 15 c-fill-target 24; c-max-rate 720M;

Keven
quelle