β

SSD杂谈

运维军团 7 阅读

1. 为什么使用SSD

1.1 江湖都是SSD的传说

这些年,“把电脑硬盘换为固态的可以让系统飞起来”的理念深入寻常百姓家,我们有时候也会在朋友圈等地方看到类似这样的描述:“4年前买的神船,换了个SSD重装系统,感觉还可以再战5年。”

手游客户端开发的朋友可能也遇到过类似的情况,虽然把打包机的硬盘换成SSD对打包速度没有明显提升,但是由于系统变快了,其他操作会顺畅很多,从而打包体验会有提升。

“SSD用久了,没有感觉到很快了,但是用回机械盘后,简直想砸键盘。”

“费劲心思优化程序最后还不如换个SSD效果来得明显。”

1.2 现有业务IO已成瓶颈

我们有个服务使用了MySQL,虽然已经使用了15000转的SAS机械盘做了raid 1 0,但是高峰期还是扛不住IO压力,iostat时常百分之百,已经严重影响到了业务的正常使用。

高峰时段的iostat截图如下

我们看到IO跑满的时候,都是在执行写操作。我们可以大致算下每个iops写的大小

 * 0.5 / 1541 ≈ 5k
7 * 0.5 / 1643 ≈ 5k

也就是高峰时段,每秒的写入可以看成是5k的小文件,虽然写入速度不高,但是我们硬盘的iops扛不住。而我们大家都同意的观点是:SSD对于小文件的随机写比机械盘的强得多。

那么我们先假定,把磁盘更换为固态硬盘可以解决这个IO卡100%的问题。

在将线上环境替换为SSD前,我们先做一些性能上的简单对比,毕竟所有的变更都需要有严格的测试。

2. SSD与机械盘性能简测

2.1 测试环境

硬件环境其实就是除了硬盘不一样,其他都一样。SSD选用raid 1 是为了保证业务的可靠性;而线上重要业务机械盘本身就是raid 1 0的,这时候我拿单盘来比就等于脱离了业务做测试了。

2.2 1M顺序写

(1)使用dd写一个10G文件和1个100G的文件

dd if=/dev/zero of=test.dd bs=1M count=10240 oflag=direct  #示例是10G

IO就不用看了,dd写大文件IO都是跑满的,我们来看耗时和速度

机械盘

[root@HDD tmp]#time dd if=/dev/zero of=test.ddd bs=1M count=10240 oflag=direct 
0+0 records in
0+0 records out
7418240 bytes (11 GB) copied, 26.4656 s, 406 MB/s

real    0m26.468s
user    0m0.012s
sys     0m3.084s

[root@HDD tmp]#time dd if=/dev/zero of=test.dd bs=1M count=102400 oflag=direct
00+0 records in
00+0 records out
74182400 bytes (107 GB) copied, 365.673 s, 294 MB/s

real    6m5.697s
user    0m0.099s
sys     0m32.372s

固态盘

[root@SSD tmp]#time dd if=/dev/zero of=test.ddd bs=1M count=10240 oflag=direct
0+0 records in
0+0 records out
7418240 bytes (11 GB) copied, 22.1695 s, 484 MB/s

real    0m22.172s
user    0m0.013s
sys     0m3.726s

[root@SSD tmp]#time dd if=/dev/zero of=test.dd bs=1M count=102400 oflag=direct      
00+0 records in
00+0 records out
74182400 bytes (107 GB) copied, 220.997 s, 486 MB/s

real    3m41.002s
user    0m0.161s
sys     0m40.274s

可以看到使用dd写大文件时,我们的SSD速度也有一定优势,特别是文件足够大的时候。

(2)使用fio顺序写100G文件

fio -ioengine=libaio -bs=1024k -direct=1 -thread -rw=write -size=100G -filename=wfio -name="SSD Test" -iodepth=1 -runtime=300

测试结果

我们可以看到在块大小为1MB的顺序写情况下,固态硬盘的速度和iops均优于机械盘,且固态硬盘的速度与dd测到的差不多。

2.3 1M顺序读

命令:

fio -ioengine=libaio -bs=1024k -direct=1 -thread -rw=read -size=100G -filename=wfio -name="SSD Test" -iodepth=1 -runtime=300

测试结果

可以看到,1M块大小顺序读100G,SSD的吞吐和iops也是超过机械盘的。

2.4 4k顺序写

我们使用fio命令进行4k顺序写测试

fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=write -size=100G -filename=100G -name="SSD Test" -iodepth=32 -runtime=300

测试结果

从测试结果来看,在队列深度为32的情况下,4k顺序写,机械盘的吞吐和iops都略胜于SSD。

2.5 4k顺序读

我们使用fio命令进行4k顺序读测试

fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read -size=100G -filename=wwfio -name="SSD Test" -iodepth=32 -runtime=300

测试结果

从测试结果看,在队列深度为32的情况下,4k顺序读,SSD的吞吐和iops都要强于机械盘。

2.6 4k随机写

我们使用fio命令进行4k随机写测试

fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -size=100G -filename=1.dd -name="SSD Test" -iodepth=64 -runtime=300

测试结果

可以看到,4k随机写的话,机械盘被固态盘远远甩在几条街后,而且我们回顾上文提到的业务瓶颈,当时算出来的是5k写,大概iops是1600左右,与该测试结果吻合,从而印证了业务瓶颈是在小文件随机写。

2.7 4k随机读

我们使用fio来测试4k随机读

fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randread -size=100G -filename=wfio -name="SSD Test" -iodepth=64 -runtime=300

测试结果

可以看到,4k随机读的话,机械盘在固态硬盘面前只能涩涩发抖,毫无还手之力,毕竟吞吐和iops是1个是慢跑,1个是坐高铁,没有任何可比性。

2.8 测试小结

结果汇总:

综合以上测试结果,我们可以看到,1M顺序读写、4k顺序这几个维度上,raid1 的SSD和 raid10 的机械盘性能基本上平分秋色(我们设想下,如果硬盘都是raid10的情况下,SSD的性能肯定是要优于机械盘的);而在4k随机读写方面,即便是raid 1 的SSD也是完胜raid10的机械盘的。所以我们十分有底气将线上的硬盘替换成测试使用的SSD,也确信,这个变更可以解决我们遇到的IO问题。

而实际上线后,业务高峰期也确实没有出现卡IO的情况了。可以看下我们监控数据。

附:业务旧机器(机械盘)近2个月IO情况和业务新机器(SSD)近1个月IO情况

由图可见,虽然现在已经过了暑假高峰期,但是机械盘上的业务仍然有较高的IO,而SSD上的业务则基本没有什么IO压力(那些峰值是一些测试)。

3. SSD监控不能少

不管是道听途说或是压力测试,还是线上业务,我们都可以看到SSD在IO方面带来的质变。SSD虽然牛逼,但是硬件总有寿终正寝的一天(而且江湖传闻:从原理上来讲,SSD数据丢了就真的是丢了),为了提前发现问题,保证业务不受影响,我们必须对SSD进行监控。我们通过查阅文档,列了几个必要的监控项,在此与各位朋友分享。

我们使用的Samsung的固态硬盘,插在阵列卡上使用,监控则采用smartctl来进行,监控项如下:

各项指标的含义可以参考文末参考文档。

4. SSD碎碎念

4.1 结合业务场景

上文我们也提到,SSD解决的是IO问题,它并不是万金油,不是说我们程序遇到瓶颈就怼个SSD上去,然后就可以不去优化程序,具体还得看瓶颈是什么造成的。比如说我们之前提到的手游客户端打包,瓶颈在CPU,所以你换SSD并不能加快打包速度;而像有些MySQL大表,你查询没有索引的聚合操作,妄想通过SSD来解决也只能是继续卡IO卡百分之100了。那我们场景的业务场景,是随机读写(关注随机读写性能,iops是关键衡量指标)还是顺序读写(关注连续读写性能,数据吞吐量是关键衡量指标)呢?

随机读写频繁的场景(小文件存储) :图片存储、OLTP数据库(从库redo)、邮件服务器、sysbench run阶段

顺序读写频繁的场景(传输大量连续数据 :写日志(binlog)、sysbench prepare阶段(我们可以从表文件的inode看到)

4.2 SSD速度去哪了?

我们使用SSD的道路并不顺畅。一开始我们使用SSD的时候,用的是普通的R410服务器,SSD是单盘插在自带的Dell SAS 6/iR阵列卡上,使用dd压测,速度只能达到120+MB/s。重启了N次服务器,什么4k对齐,什么trim都试了个遍,发现并没有什么用。一开始以为买了个假的SSD,还想打电话投诉卖家来着。

好在技术男特有的韧性,不轻言放弃也不随意下结论。后面网上查阅资料发现SSD插在Dell SAS 6/Ir阵列卡上,默认只能识别到1.5G的带宽,所以速度远不及我们第2节测试的。有外国友人提到,可以使用lsituil来把带宽改为3.0G,于是我们亲测了下,使用lsiutil确实可以把带宽改为3.0G,修改完服务器重启后会生效,而且原先的数据并不会丢失,测试速度能达到240+MB/s。

也就是说,如果我们没有阵列卡,却想在R410服务器上使用SSD,可以通过lsiutil这个个工具来提升一倍的速度。

以上就是我们关于SSD使用的一些情况,有兴趣的朋友可以在群里交流,我们一同探讨。

参考链接:

http://en.community.dell.com/support-forums/servers/f/906/t/19577072

http://elf8848.iteye.com/blog/1731274

参考文档:

《Samsung_SSD_White_Paper》(使用SSD前读一读,你可能会有新的认识)

《Intel® SSD Data Center Family SMART Attributes》

END

作者:运维军团
运维技术与开源架构交流
原文地址:SSD杂谈, 感谢原作者分享。

发表评论