Linux

10GigE 上的 DRBD 糟糕的同步性能

  • November 23, 2018

我設置了一對相同的伺服器,帶有 RAID 陣列(8 核、16GB RAM、12x2 TB RAID6)、3 個 10GigE 介面,以託管一些高可用性服務。

系統目前正在執行 Debian 7.9 Wheezy oldstable(因為 corosync/pacemaker 在 8.x stable 和測試中均不可用)。

  • 本地磁碟性能約為 900 MB/s 寫入,1600 MB/s 讀取。
  • 機器之間的網路吞吐量超過 700MB/s。
  • 通過 iSCSI,每台機器可以以超過 700 MB/s 的速度寫入對方的儲存。

但是,無論我如何配置 DRBD,吞吐量都被限制在 100MB/s。它真的看起來像一些硬編碼的限制。我可以通過調整設置可靠地降低性能,但它永遠不會超過 1Gbit(一次達到 122MB/s 幾秒鐘)。我真的在這個上拉我的頭髮。

  • 普通香草核心 3.18.24 amd64
  • drbd 8.9.2~rc1-1~bpo70+1

配置分為兩個文件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;
       }
}

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

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 2(兩台機器幾乎完全空閒):

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兩台伺服器之間的輸出:

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

顯然,初始同步應該有點慢,但不是這麼慢……此外,它並沒有真正對任何限制同步速率的嘗試做出反應,例如drbdadm disk-options --resync-rate=800M all.

其他地方有人建議我使用這些設置:

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

並且表現非常出色。

編輯: 根據@Matt Kereczman 和其他人的建議,我終於改成了:

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

重新同步速度很高:

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

在使用這些設置重新同步期間寫入速度非常好(本地寫入速度的 80%,全線速度):

# 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

讀取速度還可以:

# 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

後期編輯:

完全重新同步後,性能非常好(線速寫入,本地速讀)。重新同步很快(5/6 小時)並且不會對性能造成太大影響(線速讀取、線速寫入)。我肯定會在零處使用 c-plan-ahead。對於非零值,重新同步太長了。

在較新版本的 DRBD(8.3.9 和更新版本)中,有一個需要調整的動態重新同步控制器。在舊版本的 DRBD 中設置syncer {rate;}就足夠了;現在它更多地用作動態重新同步速度的輕微建議起點。

動態同步控制器使用 DRBD 配置的磁碟部分中的“c-settings”進行調整($ man drbd.conf有關每個設置的詳細資訊,請參閱)。

在這些節點之間使用 10Gbe,並假設使用協議 C 後延遲較低,以下配置應該讓事情進展得更快:

資源 rd0 {
協議 C;
磁碟{
c-fill-target 10M;
c-最大速率 700M;
c-plan-ahead 7;
c-最小速率 4M;
}
在 cl1 {
設備/dev/drbd0;
磁碟 /dev/sda4;
地址 192.168.42.1:7788;
元磁碟內部;
}

在 cl2 {
設備/dev/drbd0;
磁碟 /dev/sda4;
地址 192.168.42.2:7788;
元磁碟內部;
}
}

如果您仍然不滿意,請嘗試max-buffers調高 12k。如果您仍然不滿意,您可以嘗試c-fill-target以 2M 為增量。

引用自:https://serverfault.com/questions/740311