Performances de synchronisation DRBD terribles sur 10GigE

15

J'ai configuré une paire de serveurs identiques avec des matrices RAID (8 cœurs, 16 Go de RAM, 12x2 To RAID6), 3 interfaces 10GigE, pour héberger certains services hautement disponibles.

Les systèmes exécutent actuellement Debian 7.9 Wheezy oldstable (car corosync / pacemaker ne sont pas disponibles sur 8.x stable ni sur testing).

  • Les performances du disque local sont d'environ 900 Mo / s en écriture, 1600 Mo / s en lecture.
  • le débit du réseau entre les machines est supérieur à 700 Mo / s.
  • via iSCSI, chaque machine peut écrire sur le stockage de l'autre à plus de 700 Mo / s.

Cependant, peu importe la façon dont je configure DRBD, le débit est limité à 100 Mo / s. Cela ressemble vraiment à une limite codée en dur. Je peux réduire les performances de manière fiable en modifiant les paramètres, mais cela ne dépasse jamais 1 Gbit (122 Mo / s sont atteints pendant quelques secondes à la fois). Je tire vraiment mes cheveux sur celui-ci.

  • noyau de vanille ordinaire 3.18.24 amd64
  • drbd 8.9.2 ~ rc1-1 ~ bpo70 + 1

La configuration est divisée en deux fichiers 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;
        }
}

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

Sortie de cat /proc/drbdsur esclave:

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

Sortie du vmstat 2maître (les deux machines sont presque complètement inactives):

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

Sortie iperfentre les deux serveurs:

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

Apparemment, la synchronisation initiale est censée être un peu lente, mais pas aussi lente ... De plus, elle ne réagit pas vraiment à toute tentative de limitation du taux de synchronisation drbdadm disk-options --resync-rate=800M all.

wazoox
la source
1
Avez-vous essayé de le construire en mode asynchrone, puis de l'arrêter et de le reconstruire à nouveau synchronisé?
Xavier Nicollet

Réponses:

11

Dans les versions plus récentes de DRBD (8.3.9 et plus récentes), il existe un contrôleur de resynchronisation dynamique qui doit être réglé. Dans les anciennes versions de DRBD, le réglage syncer {rate;}était suffisant; maintenant, il est davantage utilisé comme point de départ légèrement suggéré pour la vitesse de resynchronisation dynamique.

Le contrôleur de synchronisation dynamique est réglé avec les «paramètres c» dans la section disque de la configuration de DRBD (voir $ man drbd.confpour plus de détails sur chacun de ces paramètres).

Avec 10Gbe entre ces nœuds et en supposant une faible latence puisque le protocole C est utilisé, la configuration suivante devrait accélérer les choses:

ressource rd0 {
        protocole C;
        disque {
                c-fill-target 10M;
                c-max-rate 700M;
                c-plan-ahead 7;
                taux c-min 4M;
        }
        sur cl1 {
                device / dev / drbd0;
                disque / dev / sda4;
                adresse 192.168.42.1:7788;
                méta-disque interne;
        }

        sur cl2 {
                device / dev / drbd0;
                disque / dev / sda4;
                adresse 192.168.42.2:7788;
                méta-disque interne;
        }
}

Si vous n'êtes toujours pas satisfait, essayez de passer max-buffersà 12k. Si vous n'êtes toujours pas satisfait, vous pouvez essayer de vous présenter c-fill-targetpar incréments de 2M.

Matt Kereczman
la source
En fait, avec cette configuration, les performances chutent à 3 Mo / s. J'essaie de jouer avec ces paramètres, mais les perspectives sont sombres.
wazoox
Jusqu'à présent, la désactivation de c-plan-ahead en le mettant à zéro et en augmentant la taille max-epoch et les tampons max semble faire l'affaire.
wazoox
2
Que se passe-t-il si vous augmentez max-buffers à 20k et c-fill-target à 20M? Je crois que l'augmentation lente de ces deux valeurs vous donnera éventuellement les résultats que vous recherchez.
Matt Kereczman
C'est beaucoup mieux! Cela ne sature pas le lien (qui est dédié et bien qu'il soit OK de le remplir) mais je suis déjà à 400 Mo / s. Je joue un peu avec ces paramètres ...
wazoox
1
Augmenter les tampons max de 250 à 2500 a fait une différence jour et nuit pour moi (dans ma configuration de performances non critiques)
Davidgo
7

Quelqu'un ailleurs m'a suggéré d'utiliser ces paramètres:

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

Et les performances sont excellentes.

Edit: Selon @Matt Kereczman et d'autres suggestions, j'ai finalement changé pour ceci:

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 vitesse de resynchronisation est élevée:

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 vitesse d'écriture est excellente pendant la resynchronisation avec ces paramètres (80% de la vitesse d'écriture locale, vitesse du fil complet):

# 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 vitesse de lecture est 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

Modification ultérieure:

Après une resynchronisation complète, les performances sont très bonnes (écriture à vitesse filaire, lecture de vitesse locale). La resynchronisation est rapide (5/6 heures) et ne nuit pas trop aux performances (lecture de la vitesse du fil, écriture de la vitesse du fil). Je vais certainement rester avec c-plan-ahead à zéro. Avec des valeurs non nulles, la resynchronisation est beaucoup trop longue.

wazoox
la source
Augmenter les tampons max à 131 Ko n'est pas l'approche la plus gracieuse pour résoudre votre problème. Vous donnez essentiellement DRBD 512 Mo de tampons système à utiliser pour sa resynchronisation, ce qui représente beaucoup d'espace de tampon. J'ai vu des choses se produire avec des tampons max supérieurs à 80k. Je recommanderais fortement de régler les paramètres du contrôleur de resynchronisation, tout en augmentant les tampons max par petits incréments jusqu'à ce que vous soyez satisfait.
Matt Kereczman
@MattKereczman Je vais changer les paramètres, mais j'aimerais avoir un cluster optimal (synchronisé) aussi vite que possible avant de jouer avec les paramètres de production .... Les paramètres par défaut signifient que la synchronisation prend au moins plusieurs jours et plus à plusieurs semaines, ce n'est tout simplement pas acceptable. Le débit de production requis est de 500 Mo / s.
wazoox
4

c-plan-ahead doit définir une valeur positive pour activer le contrôleur de taux de synchronisation dynamique. disque c-plan-ahead 15; // 5 * RTT / 0.1s unit,in my case is 15 c-fill-target 24; c-max-rate 720M;

Keven
la source