10GigE'de DRBD korkunç senkronizasyon performansı


15

Bazı yüksek düzeyde kullanılabilir hizmetleri barındırmak için RAID dizileri (8 çekirdekli, 16 GB RAM, 12x2 TB RAID6), 3 10GigE arabirimi olan bir çift özdeş sunucu kurdum.

Sistemler şu anda Debian 7.9 Wheezy oldstable çalıştırıyor (çünkü corosync / pacemaker 8.x kararlı veya testte mevcut değil).

  • Yerel disk performansı yaklaşık 900 MB / s yazma, 1600 MB / s okuma.
  • makineler arasındaki ağ çıkışı 700 MB / sn'nin üzerindedir.
  • iSCSI aracılığıyla, her makine diğerinin deposuna 700 MB / sn'den daha hızlı yazabilir.

Bununla birlikte, DRBD'yi yapılandırma şeklim ne olursa olsun, işlem hacmi 100MB / s ile sınırlıdır. Gerçekten sabit kodlanmış bir sınıra benziyor. Ayarları değiştirerek performansı güvenilir bir şekilde düşürebilirim, ancak asla 1Gbit'i geçmez (bir kerede birkaç saniye için 122MB / s'ye ulaşılır). Gerçekten saçımı çekiyorum.

  • düz vanilya çekirdeği 3.18.24 amd64
  • drbd 8.9.2 ~ rc1-1 ~ bpo70 + 1

Yapılandırma iki dosyaya bölünür 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;
        }
}

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

cat /proc/drbdKöle çıkışı :

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

vmstat 2Master'dan çıkış (her iki makine neredeyse tamamen boştadır):

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

iperfİki sunucu arasındaki çıktı :

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

Görünüşe göre ilk senkronizasyonun biraz yavaş olması gerekiyordu, ama bu yavaş değil ... Ayrıca senkronizasyon hızını azaltma girişimlerine gerçekten tepki vermiyor drbdadm disk-options --resync-rate=800M all.


1
Asenkron oluşturmaya, sonra durdurmaya ve yeniden senkronize edilmeye çalıştınız mı?
Xavier Nicollet

Yanıtlar:


11

DRBD'nin daha yeni sürümlerinde (8.3.9 ve daha yeni), ayarlanması gereken dinamik bir yeniden senkronizasyon denetleyicisi vardır. DRBD ayarının eski sürümlerinde syncer {rate;}bu yeterliydi; artık dinamik yeniden senkronizasyon hızı için biraz önerilen başlangıç ​​noktası olarak kullanılıyor.

Dinamik senkronizasyon denetleyicisi, DRBD yapılandırmasının disk bölümündeki "c-ayarları" ile ayarlanır ( $ man drbd.confbu ayarların her biri hakkında ayrıntılar için bkz .).

Bu düğümler arasında 10Gbe olduğunda ve protokol C kullanıldığından beri düşük gecikme süresi varsayarak, aşağıdaki yapılandırma işlerin daha hızlı hareket etmesini sağlamalıdır:

kaynak rd0 {
        protokol C;
        disk {
                c-dolgu-hedef 10M;
                c-maks-hız 700M;
                c-plan-önde 7;
                c-min-oranı 4M;
        }
        cl1 üzerinde {
                cihaz / dev / drbd0;
                disk / dev / sda4;
                adres 192.168.42.1:7788;
                meta-disk dahili;
        }

        cl2 üzerinde {
                cihaz / dev / drbd0;
                disk / dev / sda4;
                adres 192.168.42.2:7788;
                meta-disk dahili;
        }
}

Hala mutlu değilseniz, max-buffers12k'ye kadar çıkmayı deneyin . Hala memnun değilseniz, c-fill-target2M'lik artışlarla açmayı deneyebilirsiniz .


Aslında bu yapılandırma ile performans 3 MB / sn'ye düşer. Bu ayarlarla oynamayı deniyorum ama beklentiler korkunç.
wazoox

Şimdiye kadar, c-plan-forward'u sıfır olarak ayarlayarak devre dışı bırakmak ve max-epoch boyutu ve max-buffer'ları artırmak hile yapıyor gibi görünüyor.
wazoox

2
Maksimum arabellekleri 20k'ye ve c-doldurma hedefini 20M'ye çıkarırsanız ne olur? Bu iki değeri yavaşça artırmanın sonunda aradığınız sonuçları vereceğine inanıyorum.
Matt Kereczman

Çok daha iyi! Bağlantıyı doyurmaz (bu adanmış ve doldurmak için Tamam olsa da) ama ben zaten 400MB / s'dayım. Bu ayarlarla biraz oynuyorum ...
wazoox

1
250'den 2500'e kadar maksimum arabellekleri
aşmak

7

Başka biri bu ayarları kullanmamı önerdi:

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

Ve performans mükemmel.

Düzenleme: @Matt Kereczman ve diğer önerilere göre, nihayet bunu değiştirdim:

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

Yeniden senkronizasyon hızı yüksek:

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

Bu ayarlarla yeniden senkronizasyon sırasında yazma hızı mükemmeldir (yerel yazma hızının% 80'i, tam kablo hızı):

# 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

Okuma hızı iyi:

# 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

Daha sonra düzenleme:

Tam bir yeniden senkronizasyondan sonra performans çok iyi (kablo hızı yazma, yerel hız okuma). Resync hızlıdır (5/6 saat) ve performansı çok fazla incitmez (kablo hızı okuma, kablo hızı yazma). Kesinlikle sıfır c-plan-önde kalacağım. Sıfır olmayan değerlerde, yeniden senkronizasyon çok uzun.


Maksimum arabellekleri 131K'ya çıkarmak, sorununuzu çözmek için en zarif yaklaşım değildir. Temel olarak, çok fazla arabellek alanı olan resync için DRBD 512MiB sistem tamponları kullanıyorsunuz. Bir şeylerin 80k'den büyük maksimum arabelleklerde olduğunu gördüm. Mutlu olana kadar küçük aralıklarla maksimum arabellekleri artırırken, yeniden senkronizasyon denetleyici ayarlarının ayarlanmasını şiddetle tavsiye ederim.
Matt Kereczman

@MattKereczman Ayarları değiştireceğim, ancak üretim ayarlarıyla oynamadan önce olabildiğince hızlı bir şekilde (senkronize edilmiş) bir kümeye sahip olmak istiyorum .... Varsayılan ayarlar, senkronizasyonun en az birkaç gün ve daha fazla sürdüğü anlamına gelir birkaç haftaya kadar, bu sadece kabul edilemez. Gerekli üretim hacmi 500 MB / sn'dir.
wazoox

4

c-plan-önde, dinamik senkronizasyon hızı kontrol cihazını etkinleştirmek için pozitif bir değer ayarlamalıdır. disk c-plan-ahead 15; // 5 * RTT / 0.1s unit,in my case is 15 c-fill-target 24; c-max-rate 720M;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.