10GigE 上的 DRBD 糟糕的同步性能
我設置了一對相同的伺服器,帶有 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 為增量。