DRBD在10GigE上可怕的同步性能

我已经设置了一对带有RAIDarrays(8核,16GB RAM,12×2 TB RAID6),3个10GigE接口的相同服务器,来承载一些高度可用的服务。

目前系统正在运行Debian 7.9 Wheezy oldstable(因为corosync / pacemaker在8.x stable和testing上不可用)。

  • 本地磁盘性能大约为900 MB / s写入,1600 MB / s读取。
  • 机器之间的networking吞吐量超过700MB / s。
  • 通过iSCSI,每台机器可以以超过700 MB / s的速度向另一台存储器写入数据。

但是,不pipe我configurationDRBD的方式,吞吐量都限制在100MB / s。 它看起来像一些硬编码的限制。 我可以通过调整设置来可靠地降低性能,但是它永远不会超过1Gbit(一次达到122MB / s,几秒钟)。 我真的在这个上拉我的头发。

  • 普通香草仁3.18.24 amd64
  • drbd 8.9.2〜rc1-1〜bpo70 + 1

configuration分为两个文件: 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---- rb 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同步速度的尝试,如drbdadm disk-options --resync-rate=800M all

在较新版本的DRBD(8.3.9及更新版本)中,有一个需要调整的dynamic重新同步控制器。 在较早版本的DRBD设置中, syncer {rate;}就足够了; 现在它更多地被用作dynamic重新同步速度的一个轻松build议的起始位置。

dynamic同步控制器在DRBDconfiguration的磁盘部分使用“c-settings”进行调整(有关每个设置的详细信息,请参阅$ man drbd.conf )。

在这些节点之间有10Gbe,并且由于使用了协议C,所以假设低延迟,下面的configuration应该可以让事情变得更快:

资源rd0 {
        协议C;
        磁盘{
                 c-fill-target 10M;
                 c-max-rate 700M;
                 c-plan-ahead 7;
                 c-min-rate 4M;
         }
        在cl1 {
                设备/ dev / drbd0;
                磁盘/ dev / sda4;
                地址192.168.42.1:7788;
                元磁盘内部;
         }

        在cl2 {
                设备/ dev / drbd0;
                磁盘/ dev / sda4;
                地址192.168.42.2:7788;
                元磁盘内部;
         }
 }

如果你还不满意,可以把max-buffers设置为12k。 如果你还不满意,你可以尝试以2M为增量调整c-fill-target

有人在其他地方build议我使用这些设置:

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

而且performance非常好。

编辑:根据@Matt Kereczman和其他人的build议,我终于改变了这个:

 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小时),并不会损害性能太多(线速度读取,线速写入)。 我一定会保持零计划。 使用非零值时,resync太长了。

c-plan-ahead必须设置一个正值来启用dynamic同步速率控制器。 磁盘c-plan-ahead 15; // 5 * RTT / 0.1s unit,in my case is 15 c-fill-target 24; c-max-rate 720M; c-plan-ahead 15; // 5 * RTT / 0.1s unit,in my case is 15 c-fill-target 24; c-max-rate 720M;