Kinerja sinkronisasi mengerikan DRBD di 10GigE

15

Saya telah menyiapkan sepasang server identik dengan array RAID (8 core, 16GB RAM, 12x2 TB RAID6), 3 antarmuka 10GigE, untuk menampung beberapa layanan yang sangat tersedia.

Sistem saat ini menjalankan Debian 7.9 Wheezy oldstable (karena corosync / pacemaker tidak tersedia pada 8.x stable atau pengujian).

  • Kinerja disk lokal sekitar 900 MB / s tulis, 1600 MB / s baca.
  • throughput jaringan antara mesin lebih dari 700MB / s.
  • melalui iSCSI, setiap mesin dapat menulis ke penyimpanan yang lain dengan kecepatan lebih dari 700 MB / s.

Namun, tidak masalah cara saya mengkonfigurasi DRBD, throughput dibatasi hingga 100MB / s. Ini benar-benar terlihat seperti batas hardcoded. Saya dapat menurunkan kinerja dengan men-tweak pengaturan, tetapi tidak pernah melebihi 1Gbit (122MB / s dicapai selama beberapa detik setiap kali). Saya benar-benar menarik rambut saya yang satu ini.

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

Konfigurasi dibagi menjadi dua 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;
        }
}

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

Output dari cat /proc/drbdpada 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

Output dari vmstat 2pada master (kedua mesin hampir sepenuhnya idle):

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 dari iperfantara dua 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

Rupanya sinkronisasi awal seharusnya agak lambat, tetapi tidak ini lambat ... Selain itu tidak benar-benar bereaksi terhadap upaya untuk mempercepat seperti sinkronisasi tingkat drbdadm disk-options --resync-rate=800M all.

wazoox
sumber
1
Sudahkah Anda mencoba membangunnya sebagai sinkronisasi, kemudian menghentikannya dan membangunnya kembali disinkronkan?
Xavier Nicollet

Jawaban:

11

Dalam versi DRBD yang lebih baru (8.3.9 dan yang lebih baru) ada pengendali sinkronisasi dinamis yang perlu disetel. Dalam versi yang lebih lama dari pengaturan DRBD syncer {rate;}sudah cukup; sekarang ini digunakan lebih sebagai tempat awal yang disarankan untuk kecepatan sinkronisasi dinamis.

Pengontrol sinkronisasi dinamis disetel dengan "pengaturan-c" di bagian disk konfigurasi DRBD (lihat $ man drbd.confuntuk perincian tentang masing-masing pengaturan ini).

Dengan 10Gbe di antara node-node ini, dan dengan asumsi latensi rendah sejak protokol C digunakan, konfigurasi berikut akan membuat hal-hal bergerak lebih cepat:

resource rd0 {
        protokol C;
        disk {
                c-fill-target 10 jt;
                c-max-rate 700 juta;
                rencana-depan 7;
                c-min-rate 4 jt;
        }
        pada cl1 {
                perangkat / dev / drbd0;
                disk / dev / sda4;
                alamat 192.168.42.1:7788;
                meta-disk internal;
        }

        pada cl2 {
                perangkat / dev / drbd0;
                disk / dev / sda4;
                alamat 192.168.42.2:7788;
                meta-disk internal;
        }
}

Jika Anda masih tidak senang, cobalah mengubah max-buffershingga 12k. Jika Anda masih tidak senang, Anda dapat mencoba muncul c-fill-targetdengan peningkatan 2 juta.

Matt Kereczman
sumber
Sebenarnya dengan konfigurasi ini kinerja turun menjadi 3 MB / s. Saya mencoba mempermainkan pengaturan ini tetapi prospeknya suram.
wazoox
Sejauh ini, menonaktifkan c-plan-ahead dengan menetapkannya di nol dan menambah ukuran max-epoch dan max-buffer tampaknya melakukan triknya.
wazoox
2
Apa yang terjadi jika Anda meningkatkan buffer maksimum menjadi 20 ribu, dan c-fill-target menjadi 20 juta? Saya percaya dengan perlahan meningkatkan kedua nilai ini pada akhirnya akan memberi Anda hasil yang Anda cari.
Matt Kereczman
Itu lebih baik! Itu tidak menjenuhkan tautan (yang didedikasikan dan meskipun tidak apa-apa untuk mengisi) tapi saya sudah di 400MB / s. Saya bermain sedikit dengan pengaturan ini ...
wazoox
1
Meningkatkan max-buffer dari 250 hingga 2.500 membuat perbedaan malam-dan-siang untuk saya (dalam pengaturan kinerja non-kritis saya)
davidgo
7

Seseorang di tempat lain menyarankan agar saya menggunakan pengaturan ini:

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

Dan kinerjanya luar biasa.

Sunting: Sesuai @Matt Kereczman dan saran lainnya, saya akhirnya berubah menjadi ini:

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

Kecepatan sinkronisasi ulang tinggi:

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

Kecepatan tulis sangat baik selama sinkronisasi ulang dengan pengaturan ini (80% dari kecepatan menulis lokal, kecepatan kabel penuh):

# 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

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

Sunting nanti:

Setelah sinkronisasi ulang penuh, kinerjanya sangat baik (penulisan kecepatan kawat, pembacaan kecepatan lokal). Sinkronisasi ulang cepat (5/6 jam) dan tidak terlalu mengganggu kinerja (membaca kecepatan kawat, menulis kecepatan kawat). Saya pasti akan tetap dengan rencana-c di depan nol. Dengan nilai bukan nol, sinkronisasi ulang terlalu lama.

wazoox
sumber
Meningkatkan max-buffer ke 131K bukanlah pendekatan yang paling anggun untuk menyelesaikan masalah Anda. Anda pada dasarnya memberikan buffer sistem DRBD 512MiB untuk digunakan untuk sinkronisasi ulang, yang merupakan banyak ruang buffer. Saya telah melihat sesuatu terjadi dengan max-buffer lebih besar dari 80k. Saya akan sangat menyarankan menyetel pengaturan pengatur sinkronisasi, sambil meningkatkan max-buffer sedikit demi sedikit sampai Anda bahagia.
Matt Kereczman
@MattKereczman saya akan mengubah pengaturan, tetapi saya ingin memiliki cluster yang optimal (disinkronkan) secepat mungkin sebelum bermain dengan pengaturan produksi .... Pengaturan default berarti bahwa sinkronisasi membutuhkan setidaknya beberapa hari ke atas hingga beberapa minggu, ini sama sekali tidak dapat diterima. Throughput produksi yang dibutuhkan adalah 500MB / s.
wazoox
4

c-plan-ahead harus menetapkan nilai positif untuk mengaktifkan pengontrol laju sinkronisasi dinamis. disk c-plan-ahead 15; // 5 * RTT / 0.1s unit,in my case is 15 c-fill-target 24; c-max-rate 720M;

Keven
sumber