前两篇文章介绍了CPU和内存,本文继续介绍性能测试中和磁盘相关的基础知识。
通常情况下,服务端磁盘性能测试面对的存储结构如下:
![6093012e23cd37481f1a97af11375c47.png](https://i-blog.csdnimg.cn/blog_migrate/74ee4f16318165332ec05a354c42ecbf.jpeg)
因此,本文的主要内容如下:
- 机械硬盘
- 存储介质对比
- 磁盘阵列
- 文件访问方式
机械硬盘
![ed22115805b444889a6e5822c89b49a2.png](https://i-blog.csdnimg.cn/blog_migrate/4a9be28967215b39b72ce9f50e3737fe.jpeg)
我们关注的性能指标:
- 磁盘容量
- 磁盘转速
- 平均访问时间
- 传输速率
其中,平均访问时间决定了磁盘的IOPS(每秒的读写次数)。
这里要注意,我们花样百出的测试方法所得到的磁盘性能数据,受到了RAID卡、数据分布、读写的块大小、CPU、内存等因素的影响,只能与磁盘的性能近似,并不具有普遍的代表性。因此,磁盘性能测试应模拟真实的应用场景进行测试,不能迷信官方给出的性能指标。
存储介质对比
随着近些年发展,固态硬盘人气越来越高,但是机械硬盘好在成本较低,而从存储介质的角度看,内存条也应占有一席之地。不同存储介质的对比如下表:
![3e98cf780dad6e9eeaccd6ab47e9a33e.png](https://i-blog.csdnimg.cn/blog_migrate/2274ffeefec28a24d8599810aa989609.jpeg)
其中,SSD的硬盘不同于机械硬盘的磁盘磁道,有page和block的概念。Page大小为4K,Block大小为512K。
什么是写放大?
SSD一次写的单位是page,但是SSD的Write只能写到空的page上,对于之前写过的page,必须先进行一次Erase。而Erase的单位是Block,所以如果一个page的数据删掉之后,要想再写到这个page上,必须经过以下三步:
- 将在同一个Block的其他page读出来。
- 将整个Block Erase。
- 然后将整个Block的数据写下去。
显而易见,不同的存储介质有不同的优势,大型的存储公司基本上都设计了自己的分布式文件系统来充分发挥各种存储介质的优势,如GFS、TFS等。
磁盘阵列
磁盘阵列(Redundant Arrays of Independent Drives,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。
RAID结构
![c22d384135c2415709efa4cd5b44c496.png](https://i-blog.csdnimg.cn/blog_migrate/c8613a018441a8af5aade7e5df4fddb1.jpeg)
- RAID处理器是一个PCI从设备,接受并执行来自系统的命令。同时占用PCI中断,代表SCSI磁盘子系统向系统提出中断请求,请求占用PCI总线,返回对系统命令的响应,如输送SCSI硬盘上的数据。
- SCSI控制器为连接磁盘设备的统一扩充接口
- RAID中也有缓存(CACHE MEMORY),提供缓存数据、预读(Read-ahead)和回写(Write-back)功能,提高磁盘IO性能。
- XOR芯片:专门用来做RAID 3、5、6等这类校验型RAID的校验数据计算用的。
RAID级别
![4568df278aa1b4119a43df358627fad8.png](https://i-blog.csdnimg.cn/blog_migrate/fce6c098822e81f8dafe370f1f391193.jpeg)
RAID级别的对比
![a7b35a647a71e646a5f56efacd882cd9.png](https://i-blog.csdnimg.cn/blog_migrate/4c2f4763e4f4973b8342f848f3702a5a.jpeg)
RAID是可以叠加配置的,这里有个思考题:如下图,RAID 10和RAID 01哪个冗余度高呢?
![ff1854fa5efe5fbcada9f54e6d9fe0cb.png](https://i-blog.csdnimg.cn/blog_migrate/c2c3619937629397493367533809e71a.jpeg)
- RAID 10:左边损坏1块盘,右边还可以容忍一块盘损坏而不影响整体的数据;冗余度=2
- RAID 01:左边损坏1块盘,此时左边已经没有用,右边再损坏一块盘必然影响整体数据的可用性;冗余度=1
RAID Cache
首先介绍上文中的两个概念:
Write-through 透写:系统的写磁盘操作并不利用阵列卡的Cache,而是直接与磁盘进行数据的交互
Write-back 回写:利用阵列Cache作为系统与磁盘间的二传手,系统先将数据交给Cache,然后再由Cache将数据传给磁盘
RAID Cache对于磁盘读写的影响:
- 连续读:对于小块连续读io,cache优化效果最好。对于大块连续读io,优化效果不明显。
- 连续写:对于连续小块写io,如果cache是write back模式(通常都应当write back),由于io size比较小,cache剩余空间充裕,不至于频繁引起cache flush操作,加之系统不繁忙,有更多时间去进入算法流程对这些io进行优化调度重排等,所以此时cache效果良好。 对于连续大块写io,cache flush频繁,整体瓶颈归于磁盘,cache优化不明显,仅作缓冲之用。
- 随机读:瓶颈归于磁盘,cache优化不佳,只作为缓冲之用。
- 随机写:对于随机小块写io,如果cache是write back模式,则cache表现出来的优化效果良好,使得程序有充分时间去重排、优化这些io数据从而为更高效的并行写入磁盘做准备。对于随机大块写io,此时cache效率最为低下,整体瓶颈归于磁盘但是表于cache,因为cache快速被充满而后端磁盘出于瓶颈态,此时系统最为难受。
文件访问方式
操作系统从RAID卡读取数据,但操作系统本身也是经过优化的,我们可以先看看Linux的标准文件访问方式:
![5137ff7daef1313b92d9505acee0eaac.png](https://i-blog.csdnimg.cn/blog_migrate/81f2b20132fb6164b0795f9643f71940.jpeg)
- 当应用程序调用read接口时,操作系统检查在内核的高速缓存有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回,如果没有,则从磁盘中读取,然后缓存在操作系统的缓存中。
- 应用程序调用write接口时,将数据从用户地址空间复制到内核地址空间的缓存中,这时对用户程序来说,写操作已经完成,至于什么时候再写到磁盘中,由操作系统决定,除非显示调用了sync同步命令。
这就解释了为什么第二次读文件的时候非常快,以及为什么有时候“写”要比“读”快很多。关于IO访问的几种方式,如果大家感兴趣,以后专门写一篇文章讨论,在此就不详细展开了。