作者简介
唐杰
目前在Xilinx从事DC架构,曾任职于Fusion-IO,LSI,希捷等公司。
想要和唐大师还有全世界的大牛讨论SSD及存储相关技术?加nanoarch为微信好友,拉你进ssdfans微信群
“砖”的缘起
事情的起因是这样的,这个ssdfans群里,冬瓜哥和往常一样在帮助大家回答问题。在回答一个SSD上文件系统mount的参数的问题是,俺不知深浅地插了一句嘴,该打。然后就为了拍瓜哥一个马屁,就说瓜哥应该写一个SSD性能测试的指导,结果瓜哥说自己不是专业人士不能写,俺又不明就里地说俺可以写一个,结果,瓜哥说俺写了,瓜哥就写一个。
正好在杭州到上海的高铁上,信号一如往常的烂,于是有了这一片”砖”来引瓜哥的玉了。
在谈这个具体内容之前,俺要强调,俺的砖全是脑中所记,因为不方便上网,而且也是砖,就比较散漫,写到哪里算哪里了。
工具篇:
FIO: 目前最常用的性能测试工具,主要是linux下。这个工具是目前我用过的最能生成IO请求的工具。Fio可以用比较小的代价在短时间能生产IO,这个能力的确没有其他工具可以比。因此文中缺省的测试工具就是它了。
Vdbench: SUN遗留下来的工具,因为基于Java,他的可移植性比fio好,同时支持压缩和dedup的测试,因此也是企业测试的首选。
Iometer:Windows平台为主,因为是gui的,因此脚本化比较难,之前windows比较流行的时候,用的多,现在在数据中心就呵呵了。
SQLIO和orion都是数据库厂商的工具,主要测试8K的随机I/O和1M的顺序I/O,是DBA的最爱,作为SSD性能狗必须跪舔。
Sysbench因为可以测试MySQL,也是新贵的最爱,要知道霸爷到ali的第一个blog就是sysbench.
Workload 篇:
I/O size: 4K 是主流,8K是MSSQL和Oracle,16K是Mysql Innodb
Queue Depth:这个缺省是32, 因此目前的SSD,特别是SATA的SSD,NCQ是31,因此不能太少。
Numjobs:生成I/O的engine的数量,如果thread=1就是几个线程,否则就是进程,建议线程。Numjobs可以等于CPU的core就行,不算HT。
Numjobs和Queue Depth定义了I/O的workload的压力,基本上是 fio numjobs×QD = vdbench的thread。
I/O 引擎: 基本上是libaio,这个是冲IOPS的,对于延时为主的测试,建议psync。
Direct I/O: 这个是本地测试标配,但是要注意网络I/O可能只支持buffer I/O。
随机顺序和IO比例方面:
-
测试建议先做随机,再做顺序,因为顺序可能有cache的影响。先做写,再做读,因为SSD的特性,写入量大之后会性能下降。
-
I/O读写比例,数据库基本是7:3, 9:1, 对于网络存储,建议的比例是5:5
文件系统篇:
-
Ext2 无视,基本上是ext3和ext4。缺省的格式化流行,如果基于md,要考虑I/O的对齐问题。
-
Mount的时候,不管XFS,EXT3/4都建议noatime,noadirtime和nobarrier。Discard这东西还是免了,真心不知道trim的用处。
-
其他的,在测试文件系统的时候,要注意在写入的时候会有锁的问题,因此建议使用nrfiles来生成多个文件。
操作系统篇:
-
对于基于SATA的SSD,对于block层的修改是必须的,必须参考之前LSI nytro的推荐,基本上是:
-
增大queue的深度
-
Disable 预读
-
Disable 和随机发生器的关系
-
还有就是IO affinity, 建议使用的配置是使用生成I/O请求的CPU来响应I/O,降低context 切换的影响。
-
-
比较懒的可以用RHEL的tuned-adm来设置。
-
这里还有一个就是操作系统的I/O监控:
-
Iostat –dmx /dev/sda 1 这个是必须的命令
-
Mpstat –P ALL 1, 看CPU的使用情况,如果都在softirp,说明你I/O生成有问题,使用numactl来控制。如果都在iowait,说明你的I/O设备的确不行。如果都在sys,说明跑的很正常。不可能都在user,因为fio的I/O请求的数据直接就丢掉了,不可能有usr。
-
高级一点的,可以用perf top看看系统调用的时间,如果都在spinlock上,说明你的IO文件有互斥了。
-
硬件系统篇:
-
BIOS里面,CPU的C states是必须disable,测性能,省毛电。
-
HT也是要关的,但是在NVME SSD中,HT貌似不错,请自行研究。
-
VT之类,都是必须关的。Dell/HP/IBM都有BIOS推荐的设置。
-
NUMA,这东西对于性能真心没好处,还是一点要避免。BIOS能关就关,不能关的话,用numactl来指定吧。
-
还有就是硬件的中断,不要用irqbalance,一定要用irq_affinity来做mask。
-
对于PCIE slot,尽可能让两个设备在不同的CPU上,用taskset,或者numactl来进行分离。
最后一点,测试只是测试,一定要上应用,这个是对自己和公司负责的行为。
车已经到了嘉兴,俺也吐了两页,希望可以挤出瓜哥的玉了。找个信号好的地就发了。嘿嘿