本文对传统机械磁盘和固态磁盘进行了对比测试,并对测试结果进行了分析,测试案例主要侧重于事务型数据库应用。
测试结论对于存储设备的采购具有一定参考意义。
由于作者技术水平有限以及测试时间仓卒,难免出现谬误,欢迎读者对本文中的观点提出建议和意见。
一,机械磁盘与固态磁盘
传统磁盘属于机械式磁盘,是目前计算机系统中有限的几个机械部件之一。
机械式磁盘在顺序访问时,速度还可以接受,一般在30-100MB/s。
寻道时间是目前机械磁盘的一个主要瓶颈。一般机械磁盘的寻道时间在5-20ms左右。
这导致机械磁盘随机读取的性能不高,这也是事务型数据库应用系统的主要性能瓶颈之一。
数据库系统访问磁盘时,大部分属于随机访问,所以事务型数据库的性能表现与存储设备的IOPS和访问延迟指标紧密相关。
数据库的关键数据结构Btree的主要目的之一便在于降低随机访问磁盘的频度。
目前提高存储设备IOPS的途径主要是使用磁盘阵列,多块磁盘同时提供访问,例如目前的SAN存储设备,
实践中每块机械磁盘的IOPS大概在200左右,这样14块硬盘的阵列,大约可以提供2500左右的IOPS。
但延迟时间依然没有改善,与一块磁盘基本一致。
固态磁盘的存储介质为半导体芯片,属于纯电子设备,所以固态磁盘在IOPS和访问延迟方面具有革命性的优势。
鉴于事务型数据库系统对于存储设备的IOPS和访问延迟很敏感,所以此次评估的侧重于这两个指标。
二,测试工具简介
sysbench是一个多功能、多线程的性能测试工具,可以评估CPU,内存,线程并发,存储和事务型数据库等方面的性能表现。
根据数据库访问存储的特点,测试过程中,采取以下参数:
–max-requests=500000
测试过程IO访问次数,为了保证数据平坦的分布,避免缓存的影响,此处应尽量设置大一些。
–test=fileio
进行文件IO测试,目前的生产环境中MySQL数据库使用ext3文件系统。
–num-threads=8
IO线程,目前MySQL数据库中的IO线程一般为4-8个。
–file-total-size=40G
测试文件总量,理论上,文件量越大越能够避免缓存的影响,真实体现存储的性能,但目前送测的固态磁盘设备容量只有50G,所以这里选择40G。
–file-test-mode=rndrd
–file-test-mode=rndwr
测试模式为随机读取,或者随机写入,随机访问存储是数据库应用的特点。
–file-extra-flags=direct
使用direct模式打开文件,最大程度避免缓存对与测试结果的影响。
默认情况,sysbench使用单次IO请求SIZE为16K。
三,存储设备的关键参数设置。
1,RAID级别设置
目前认为,RAID 1 最适合数据库应用,已经另有文章专门论述这一观点。
2,Write Back与Write Though
由于送测设备提供的硬件RAID卡上面具备后背电池,
所以可以打开Write Back,理论上可以提高写入性能,降低单次写入IO的延迟。
这个与缓存的容量密切相关,当打开写入缓存后,读取缓存的容量会相应下降。
经过咨询厂商,一般情况默认写入缓存占总缓存容量的一半。
3,Strip Size
一般认为,Strip Size设置与应用单次IO请求大小相同时,性能最好。
四,测试用例
结合实际使用的经验,本次评估准备了以下测试用例:
1,机械磁盘与固态磁盘的读取对比
机械磁盘为两块250G SAS硬盘,使用硬件RAID卡,RAID级别为RAID 1,Strip Size为16K,Write Back模式。
固态磁盘为两块50G SATA接口固态磁盘,使用硬件RAID卡,RAID级别为RAID 1,Strip Size为16K,Write Back模式。
sysbench的各项参数为:
–max-requests=500000
–test=fileio
–num-threads=8
–file-total-size=40G
–file-test-mode=rndrd
–file-extra-flags=direct
机械磁盘与固态磁盘的写入对比
机械磁盘为两块250G SAS接口硬盘,使用硬件RAID卡,RAID级别为RAID 1,Strip Size为16K,Write Back模式。
固态磁盘为两块50G SATA接口固态磁盘,使用硬件RAID卡,RAID级别为RAID 1,Strip Size为16K,Write Back模式。
sysbench的各项参数为:
–max-requests=500000
–test=fileio
–num-threads=8
–file-total-size=40G
–file-test-mode=rndwr
–file-extra-flags=direct
Write Back与Write Through的写入对比
固态磁盘为两块50G SATA接口固态磁盘,使用硬件RAID卡,RAID级别为RAID 1,Strip Size为16K 。
sysbench的各项参数为:
–max-requests=500000
–test=fileio
–num-threads=8
–file-total-size=40G
–file-test-mode=rndwr
–file-extra-flags=direct
8K,16K,64K Strip Size的读取对比
固态磁盘为两块50G SATA接口固态磁盘,使用硬件RAID卡,RAID级别为RAID 1,Write Back模式 。
sysbench的各项参数为:
–max-requests=500000
–test=fileio
–num-threads=8
–file-total-size=40G
–file-test-mode=rndrd
–file-extra-flags=direct
8K,16K,64K Strip Size的写入对比
固态磁盘为两块50G SATA接口固态磁盘,使用硬件RAID卡,RAID级别为RAID 1,Write Back模式 。
sysbench的各项参数为:
–max-requests=500000
–test=fileio
–num-threads=8
–file-total-size=40G
–file-test-mode=rndwr
–file-extra-flags=direct
以上所有测试用例的操作系统为:RHEL 5.2 。
uname -a 运行结果:
Linux 固态磁盘 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
sysbench的版本:
sysbench 0.4.12: multi-threaded system evaluation benchmark
五,测试结果数据对比:
1,机械磁盘与固态磁盘的读取对比
机械磁盘IOPS: 460.18 Requests/sec
固态磁盘IOPS: 9362.76 Requests/sec
机械磁盘访问延迟: 17.38ms
固态磁盘访问延迟: 0.85ms
2,机械磁盘与固态磁盘的写入对比
机械磁盘IOPS: 201.67 Requests/sec
固态磁盘IOPS: 1963.89 Requests/sec
机械磁盘访问延迟: 35.93ms
固态磁盘访问延迟: 3.70ms
3,Write Back与Write Through的写入对比
Write BackIOPS: 1963.89 Requests/sec
Write ThroughIOPS: 1777.16 Requests/sec
Write Back访问延迟: 3.70ms
Write Through访问延迟: 3.49ms
4,8K,16K,64K Strip Size的读取对比
8K IOPS: 8876.86 Requests/sec
16K IOPS: 9362.76 Requests/sec
64K IOPS: 9753.22 Requests/sec
8K 访问延迟: 0.90ms
16K 访问延迟: 0.85ms
64K 访问延迟: 0.82ms
5,8K,16K,64K Strip Size的写入对比
8K IOPS: 1720.81 Requests/sec
16K IOPS: 1963.89 Requests/sec
64K IOPS: 1944.75 Requests/sec
8K 访问延迟: 3.71ms
16K 访问延迟: 3.70ms
64K 访问延迟: 3.26ms
以上测试结果数据均为多次测试数据的中间值。
六,测试总结:
1,固态磁盘的随机读取性能高出机械硬盘20倍以上。
2,固态磁盘在随机写入性能高出机械硬盘10倍以上。
3,Write Back与Write Through对性能的影响与缓存的容量相关,对于写入较多的应用,推荐打开Write Back。
4,较小的Strip Size对于性能不利,推荐设置为16K或以上。
固态磁盘的出现,为数据库应用的存储带来了革命性的改观。
机械磁盘IOPS的劣势可以通过磁盘阵列的方式,使用多块磁盘来弥补,
但机械磁盘的访问延迟时间的问题,是无法弥补的,这是根本技术上的限制。
从目前厂商提供的设备来看,目前送测的容量设备容量仅有50G。
现在较高配置的服务器,有64G甚至更多的内存,相对来说,固态磁盘50G的容量太小。
随着工艺的改进和垂直记录技术的产生,机械磁盘在容量方面有很大的进展,目前单碟容量已经高达500G。
所以固态磁盘在容量上处于劣势。
ZFS提供了一种应用场景,将大容量的机械磁盘用于数据存储,将性能优异的固态磁盘用于缓存,
这样可以达到优势互补,实践的效果也很不错。
由于测试时间有限,未对固态磁盘设备的稳定性和寿命进行测试。
七,参考测试信息:
本次测试过程中,还对Solaris系统和FreeBSD系统进行了非正式评估,以下是简要结论:
Solaris ZFS系统:
在IOPS方面,固态磁盘比机械磁盘快10倍。
在延迟方面,固态磁盘比机械磁盘快25倍。
在IOPS和延迟方面,Strip与Mirror不相上下。
在IOPS和延迟方面,Strip、Mirror均比单盘快1倍。
在使用机械磁盘作为数据设备,固态磁盘作为缓存设备时,IOPS与延迟 和单盘固态磁盘不相上下。
(当数据容量远远超过缓存设备容量时,性能会明显下降)
FreeBSD系统:
简单测试了FreeBSD下的ZFS效果:
1, IOPS同Solaris下相差不多(两块固态磁盘硬件RAID1的IOPS在3000左右)。
2, 当Strip Size取16K时,IOPS下降很多,当取1M时,同64K相差无几。
3, 貌似FreeBSD下的ZFS重启后需要手工mount。
FreeBSD UFS测试情况,两块固态磁盘 HARDWARE RAID1,1M strip size:
IOPS居然高达14000,比Linux下最好的情况还高出40%,我怀疑是缓存的影响。
(因UFS不支持direct模式,但在Linux下同样的测试用例,最高到10000)。