本文的目的是为了测试 Amazon EC2 的磁盘性能,从而为数据库搭建做性能估算。使用的测试工具为 sysbench ,这款软件已经很久没更新了。所以全当得出数据为“比较值”。
Amazon 的 Elastic Storage 为 EC2 Instance 提供了软 Raid 的可能性,但是,其 Raid 除了具有数据保障性外,是否有性能提升?提升多少?这是这次实验的目的。
参考别处资料写了一个 sysbench 测试脚本:
#!/bin/bash set -u set -x set -e for size in 2G 4G 8G;do for mode in seqwr seqrd seqrewr rndrd rndwr rndrw;do for blksize in 16384 ; do sysbench --test=fileio --file-num=32 --file-total-size=$size prepare for threads in 1 4 8 16 32; do echo "===== testing $blksize in $ $threads threads" echo PARAMS $size $mode $threads $blksize > sysbench-size-$size-mode-$mode-threads-$threads-blksz-$blksize for i in 1 2 3 ; do sysbench --test=fileio --file-total-size=$size --file-test-mode=$mode --max-time=180 --max-requests=100000000 --num-threads=$threads --init-rng=on --file-num=32 --file-extra-flags=direct --file-fsync-freq=0 --file-block-size=$blksize run | tee -a sysbench-size-$size-mode-$mode-threads-$threads-blksz-$blksize 2>&1 done done sysbench --test=fileio --file-total-size=$size cleanup done done done
基础数值
首先,来一款手头上的普通三星 160G 硬盘,将其作为一个参考数值。
Form 1 — fsync at end of test
| Req&Trans/s | SeqWR | SeqRD | SeqReWr | RndRD | RndWR | RndReWr |
|---|---|---|---|---|---|---|
| Trd 1 | 3481\54M | 3771\58M | 4152\64M | 114\1.7M | 181\2.8M | 123\1.9M |
| Trd 4 | 1951\30M | 4403\68M | 2324\36M | 114\1.7M | 181\2.8M | 124\1.9M |
| Trd 8 | 1289\20M | 4287\66M | 2630\41M | 114\1.7M | 181\2.8M | |
| Trd 16 | 1600\25M | 4133\64M | 1727\26M | 115\1.7M | 181\2.8M | |
| Trd 32 | 1939\30M | 3952\61M | 2080\32M | 115\1.8M | 182\2.8M |
Form 2 — fsync per write request
| Req&Trans/s | SeqWR | SeqRD | SeqReWr | RndRD | RndWR | RndReWr |
|---|---|---|---|---|---|---|
| Trd 1 | 33\543Kb | 3842\60Mb | 36\576Kb | 110\1.7Mb | 17\280Kb | 31\510Kb |
| Trd 4 | 35\575Kb | 4400\68Mb | 34\556Kb | 109\1.7Mb | 26\418Kb | 43\694Kb |
| Trd 8 | 34\545Kb | 4267\66Mb | 30\485Kb | 111\1.7Mb | 28\452Kb | 47\756Kb |
| Trd 16 | 33\541Kb | 4138\64Mb | 34\545Kb | 110\1.7Mb | 30\481Kb | 50\813Kb |
| Trd 32 | 33\532Kb | 3942\61Mb | 34\558Kb | 110\1.7Mb | 50\813Kb | 65\1.0Mb |
一些缩写解释如下:
Req&Trans/s=Request & Transferred/sec TRD=Threads SEQ=sequency RD=read WR=Write RND=Random REWR=Read&Write
你看到的是一块非常普通的硬盘,他的顺序写也只有每秒54M,而现在好一些的硬盘都可以做到每秒80M以上的顺序写了。
来看看 Amazon 的测试数据吧。
Amazon Micro Instance with Single Elastic Storage
Form 3 — fsync at end of test
| Req&Trans/s | SeqWR | SeqRD | SeqReWr | RndRD | RndWR | RndReWr |
|---|---|---|---|---|---|---|
| Trd 1 | 235\3.6M | 1521\23M | 256\4.0M | 1525\23M | 222\3.4M | 523\8.1M |
| Trd 4 | 247\3.8M | 2480\38M | 253\3.9M | 3138\49M | 1005\15M | 1698\26M |
| Trd 8 | 256\4.0M | 3483\54M | 251\3.9M | 8482\81M | 1691\26M | 1653\25M |
| Trd 16 | 251\3.9M | 5959\93M | 243\3.7M | 1594\24M | 1888\29M | 1386\21M |
| Trd 32 | 251\3.9M | 6387\99M | 260\4.0M | 5452\85M | 1303\20M |
请注意看红色的部分,Amazon 磁盘的测试结果,写操作差的一塌糊涂,几乎和个U盘一样,但是只要有读操作!尤其是随机读取操作,数据就牛逼的一塌糊涂。其中随机读取最佳成绩为 5452\85M,而单个物理硬盘仅为 115\1.8M 。天壤之别!
而且 RndWr 的写入比 SeqWr 要快了很多,这肯定是因为逻辑磁盘到物理磁盘之间存在数据分片。
猜测:
1.Elastic Storage 和EC2 instance 之间很可能是走网络的。
2.一定有数据冗余机制,但估计不是 RAID。
3.有很大的 cache 在前面。很可能在用 SSD 做 cache。
这测试结果,你说好么,写入速度慢成这样…这鸟样也太过分了一点。你说他差么,随机读牛成这样… 没办法形容了。
Amazon Micro Instance with Raid 0 (2 disk)
Form 4 — fsync at end of test
| Req&Trans/s | SeqWR | SeqRD | SeqReWr | RndRD | RndWR | RndReWr |
|---|---|---|---|---|---|---|
| Trd 1 | 194\3.0M | 1440\22M | 289\4.5M | 1430\22M | 188\2.9M | 494\7.7M |
| Trd 4 | 182\2.7M | 2631\41M | 320\3.1M | 3226\50M | 650\10M | 1248\19M |
| Trd 8 | 190\2.9M | 3753\58M | 297\3.2M | 4330\67M | 1612\25M | 2781\43M |
| Trd 16 | 182\2.8M | 2895\45M | 199\5.0M | 3124\48M | 2121\33M | 2875\44M |
| Trd 32 | 190\2.9M | 2465\38M | 206\4.6M | 4161\65M | 2158\33M | 3671\57M |
2 Disks Raid0 几乎和单硬盘没有什么太大变化,SeqWr 的数值全线微幅下降,可能是由于系统做软 Raid,系统层面有所开销所致。RndWr 在 16 线程和 32线程略微高一点。但也不是本质性提升。
RndRW 8、16、32 有明显提高,但是很难判断是某个时间段 Amazon IO 比较空闲所致,还是 Raid0 的帮助。有一种可能是我做 md 的时候使用的默认 chunk 为 64,而 Amazon 本身的 chunk 比 64 大,所以我这么操作以后造成了更加分散的数据分布,所以 RndRW 会略好一点。但也很难解释为什么 RndRd 没有明显高起来。
同时我还做了 6 Disk Raid0 测试,由于数据和 2 Disk 实在是没啥差距,就不贴上来了。
总的感觉 Amazon 上做 Raid 是件无意义的事情。这与国外一个人的测试[ 1 2 ]相去甚远。不止是结论差异,性能也有差异,他在 6 Disk Raid0 的情况下 Seq Input 居然可以走到接近 110M 的速度,但是他的 Rnd Seek 在8Disk 的情况下最高也只走到 4000左右。我怀疑这是 Instance 差异导致,接下来看看 m1.large 的测试数据。
Amazon EC2 m1.large NoRaid
Form 5 — fsync at end of test
| Req&Trans/s | SeqWR | SeqRD | SeqReWr | RndRD | RndWR | RndReWr |
|---|---|---|---|---|---|---|
| Trd 1 | 1084\16M | 2330\36M | 1149\17M | 2134\33M | 1124\17M | 1378\21M |
| Trd 4 | 1058\16M | 5445\85M | 1113\17M | 5586\87M | 2039\31M | 2904\45M |
| Trd 8 | 1053\16M | 6509\101M | 1147\17M | 6569\102M | 2112\33M | 3054\47M |
| Trd 16 | 1026\16M | 6195\96M | 1122\17M | 6486\101M | 2144\33M | 3802\59M |
| Trd 32 | 1034\16M | 5985\93M | 1158\18M | 6490\101M | 2149\33M | 3859\60M |
Form 6 — fsync every 64 times write(1M)
| Req&Trans/s | SeqWR | SeqRD | SeqReWr | RndRD | RndWR | RndReWr |
|---|---|---|---|---|---|---|
| Trd 1 | 1112\17M | 2122\33M | 1117\17M | 2139\33M | 1097\17M | 1385\21M |
| Trd 4 | 1073\16M | 5598\87M | 1097\17M | 5759\89M | 2263\35M | 3179\49M |
| Trd 8 | 1064\16M | 6453\100M | 1122\17M | 6563\102M | 2164\33M | 3740\58M |
| Trd 16 | 1118\17M | 6511\101M | 1138\17M | 6607\103M | 2060\32M | 3763\58M |
| Trd 32 | 1083\16M | 6715\1044M | 1173\18M | 6713\104M | 1997\31M | 3880\60M |
Form 7 — fsync per write request
| Req&Trans/s | SeqWR | SeqRD | SeqReWr | RndRD | RndWR | RndReWr |
|---|---|---|---|---|---|---|
| Trd 1 | 353\5.5M | 1808\28M | 371\5.8M | 2017\31M | 289\4.5M | 677\10M |
| Trd 4 | 352\5.5M | 5003\78M | 395\6.1M | 5256\82M | 1237\19M | 1634\25M |
| Trd 8 | 350\5.4M | 6071\94M | 388\6.0M | 5825\91M | 1589\24M | 2879\44M |
| Trd 16 | 355\5.5M | 6420\100M | 360\5.6M | 6172\96M | 1607\25M | 3104\48M |
| Trd 32 | 349\5.4M | 6507\101M | 374\5.8M | 6248\97M | 1703\26M | 3156\49M |
Amazon EC2 m1.large 6 Disk Raid 0
Form 8 — fsync per write request
| Req&Trans/s | SeqWR | SeqRD | SeqReWr | RndRD | RndWR | RndReWr |
|---|---|---|---|---|---|---|
| Trd 1 | 164\2.5M | 1605\25M | 225\3.5M | 1338\20M | 238\3.7M | 280\4.3M |
| Trd 4 | 177\2.7M | 3707\57M | 242\3.7M | 4730\73M | 649\10M | 671\10M |
| Trd 8 | 176\2.7M | 5043\78M | 237\3.7M | 7538\117M | 948\14M | 1083\16M |
| Trd 16 | 163\2.5M | 5927\92M | 233\3.6M | 9168\143M | 1006\15M | 1273\19M |
| Trd 32 | 152\2.3M | 9210\143M | 240\3.7M | 10025\156M | 573\8.9M | 1369\21M |
根据这些数据可以得到以下结论:
1. Large 比 Micro 在 IO 方面性能好。
2. RAID 无意义。
3. 瓶颈在连续写。
4. Amazon 机器即使在 fsync per write request 的情况下,随机写也可以达到 1000/s ,而随机读在 5000-6000/s。其随机性能比得上 SSD 了。
5. 由于 MySQL Dirty Page 有两次写,两次写空间为 2M,每写1M sync 一次,所以上面专门有 64 times sync 的测试数据。其连续写数据,我觉得可以做为 Amazon Large MySQL 写入瓶颈数值参考。
6. 不要轻易相信别人的神化!
很多 MySQL 的参数设置还需要结合很多信息才能确定,单靠磁盘监测还不够。以后再开别的文章来探讨吧。
No related posts.
© 2012 Water is….. | Theme by Eleven Themes
测试结果是受测试工具、当时的测试环境所影响的。由于不同时刻有不同的用户在使用EBS,所以测出来的结果没有可比性。
EBS和EC2之间是千兆网络,所以最高带宽也只是110MB/S。
EBS上的数据都是有几份副本的,每次写操作都要同时更新这几份副本,所以写速度很慢。但是这保证了数据一致性。
下面这些文章是对EBS架构的描述,希望对你有所帮助。
http://aws.amazon.com/message/65648/
http://devopscloud.net/2011/04/30/a-pictorial-representation-of-aws-ebs-architecture/
http://blog.rightscale.com/2008/08/20/amazon-ebs-explained/
[回复]
@metaxen 非常感谢你提供的资料,还没来得及看,一定会很有帮助的。
我自己通过测试也推出了应该是通过网络的,因为随机写,有 fsync 和没有 fsync 居然相差很小,这应该是软件层面报的一个假象。当然,Amazon 用它自己的方式保障了数据安全,即使在内存中而没有 fsync 到硬盘中也 OK 啦。
谢谢你的帮助!我会仔细看看你给的资料的。
[回复]