Amazon EC2 Disk Performence

本文的目的是为了测试 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.

2 Comments

  1. metaxen 说道:

    测试结果是受测试工具、当时的测试环境所影响的。由于不同时刻有不同的用户在使用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/

    [回复]

  2. latteye 说道:

    @metaxen 非常感谢你提供的资料,还没来得及看,一定会很有帮助的。
    我自己通过测试也推出了应该是通过网络的,因为随机写,有 fsync 和没有 fsync 居然相差很小,这应该是软件层面报的一个假象。当然,Amazon 用它自己的方式保障了数据安全,即使在内存中而没有 fsync 到硬盘中也 OK 啦。

    谢谢你的帮助!我会仔细看看你给的资料的。

    [回复]

Leave a Comment

标签:, , , ,

十二月 14, 2011 Work / 努力工作