磁盘性能分析与优化

535 阅读24分钟

0.引言

在Linux系统中,磁盘I/O性能对整体系统性能有着决定性影响。高效的磁盘可以显著提升数据处理速度,减少程序等待时间。磁盘性能决定了系统处理数据的能力,尤其是在密集型应用的场景下,服务器会接收到大量的读写请求,当磁盘性能不足时,会成为大数据集群整体性能提升的瓶颈。

今天我们就磁盘的性能出发,分析决定磁盘性能的因素,如何做好磁盘的性能分析,以及如何在考虑成本、效率和实用性的基础上,做好磁盘的选型。

1.磁盘基础知识

1.1 磁盘的分类

按照硬盘的材质划分,目前计算机和服务器用的磁盘,可以分为以下几类:

  • 机械硬盘(HDD)采用磁性碟片来存储
  • 固态硬盘(SSD)采用闪存颗粒存储
  • 混合硬盘(HHD)磁性硬盘和闪存集成到一起

硬盘的材质分类主要集中在机械硬盘的磁性盘片和固态硬盘的闪存芯片上,而混合硬盘则结合了前两者的特性。随着技术的发展,硬盘存储介质的材质和构造也在不断进步,以满足不断增长的数据存储需求。

按照磁盘连接的接口划分:

  • SATA(Serial ATA):一种常见的接口标准,主要用于个人电脑的HDD和SSD
  • SAS(Serial Attached SCSI):用于企业级存储的接口,支持更高的传输速度和更好的可靠性
  • PCIe(Peripheral Component Interconnect Express):一个高速接口,常用于NVMe SSD,提供比SATA和SAS更高的传输速度
  • M.2:一种小型化的接口,支持SATA和PCIe/NVMe连接,常用于笔记本电脑和小型设备中。

按照硬盘的大小划分:

  • 3.5英寸(约8.89厘米):标准的桌面电脑HDD尺寸
  • 2.5英寸(约6.35厘米):较小的尺寸,常见于笔记本电脑和小型设备的HDD和SSD
  • M.2:一种小型化的SSD,尺寸更小,适用于紧凑空间
  • U.2:主要用于企业级SSD,支持2.5英寸的尺寸但使用PCIe接口。

M.2和U.2的尺寸通常不直接以英寸表示,而是具体的长度和宽度数值。

如M.2 2280(80mm×22mm),M.2 2242(42mm×22mm)。

按照厂商划分,目前市面上的主要的磁盘厂商有西部数据、希捷科技、东芝、三星、金士顿、英特尔等。

1.2 衡量磁盘性能的关键指标

磁盘性能的关键指标通常包括吞吐量、延迟和IOPS,它们各自代表了不同方面的性能特征:

  • 吞吐量(Throughput)

吞吐量是指在单位时间内磁盘能够传输数据的总量,通常以MB/s(兆字节每秒)或GB/s(吉字节每秒)为单位来衡量。它反映了磁盘处理大型文件或数据流的能力。例如,对于视频编辑或大型文件传输等应用,高吞吐量意味着更快的数据传输速度,从而提高工作效率。磁盘的吞吐量受多种因素影响,包括接口类型(如SATA、SAS、PCIe)、数据传输协议(如AHCI、NVMe)以及磁盘本身的读写速度。

  • 延迟(Latency)

延迟是指数据被请求和实际被处理之间的时间差,包括寻道延迟和旋转延迟(对于机械硬盘),以及命令处理延迟(对于所有类型的磁盘)。延迟通常以毫秒(ms)为单位衡量。寻道延迟是磁头移动到磁盘上正确位置的时间,而旋转延迟是等待磁盘旋转到数据所在扇区的时间。对于固态硬盘,由于没有机械部件,延迟主要是电子信号的处理时间。低延迟对于需要快速访问小量数据的应用至关重要,如在线交易处理或高频交易。

  • IOPS(Input/Output Operations Per Second)

IOPS是每秒完成的输入/输出操作次数。这个指标通常用来衡量磁盘处理随机读写请求的能力。IOPS与数据块的大小有关,数据块越小,可能的IOPS就越高。IOPS对于需要频繁访问随机数据位置的应用特别重要,如数据库服务器、邮件服务器和虚拟化环境。高IOPS表明磁盘能够更好地处理大量的小文件或随机数据访问,从而提高系统的整体性能。

这些指标相互关联,但也有所不同。例如,一个磁盘可能有很高的吞吐量,但如果其延迟较高,则在需要快速响应的场景下表现不佳。同理,一个具有极高IOPS的磁盘在处理大量随机读写操作时性能出色,但如果吞吐量不足,则在传输大文件时速度可能会下降。

在评估和选择磁盘时,应根据实际的应用需求和工作负载特征来考虑这些性能指标。例如,对于顺序读写密集型的工作负载,应优先考虑吞吐量;而对于随机访问密集型工作负载,则应关注IOPS和延迟。

2.磁盘技术分析

本节就HDD和SSD两种磁盘的结构,从原理上了解磁盘是如何读取数据的,为便于理解,先上两种类型磁盘的结构图:

image.png

2.1 HDD性能分析

以下是HDD读取数据的基本步骤和原理:

  1. 电机启动和盘片旋转,当硬盘接收到读取数据的命令时,内部的电机会启动,使得盘片开始以固定的转速旋转。转速通常用每分钟转数(RPM)来衡量,标准转速有5400 RPM、7200 RPM等。

  2. 磁头定位,磁头安装在一个可移动的臂(致动器)上。硬盘的控制器会指挥致动器移动磁头到存储着所需数据的磁道上。这个过程称为寻道(Seeking)。

  3. 读取数据,读取数据的过程比较复杂,一旦磁头定位到正确的磁道上,它就会等待需要读取的数据扇区旋转到磁头下方。这个等待过程称为旋转延迟(Rotational Latency),当数据扇区通过磁头时,磁头上的感应线圈会检测盘片磁性材料的磁化状态变化,这些变化对应于存储在盘片上的二进制数据(0和1),磁头上的读取传感器将这些磁化状态变化转换为电信号,然后通过放大器增强,并发送给硬盘的控制器。

  4. 数据处理,硬盘控制器接收到电信号后,会对信号进行解码和错误检查。解码过程将电信号转换回二进制数据,而错误检查则确保数据的完整性和准确性。

  5. 数据传输,一旦数据被处理和确认无误,它就会通过硬盘的接口(如SATA)传输到计算机的主板上,最终被操作系统和应用程序使用。

HDD读取数据的性能受到多个因素的影响,包括磁头的性能、盘片的转速、磁道密度、缓存大小以及硬盘和主板之间的接口速度。

磁头用于在磁盘盘片上读取和写入数据。磁头的质量和设计直接影响读写数据的速度和准确性。更先进的磁头技术可以提高数据传输速率,并降低出错率。多磁头设计可以提高性能,因为它允许同时读写多个盘片的表面,从而提高数据处理能力。

盘片是存储数据的物理介质,其表面涂有磁性材料。盘片的质量、密度和平滑度决定了存储容量和读写速度。更高的存储密度可以在同一物理空间内存储更多数据,从而提高性能。盘片的大小也会影响性能,例如,3.5英寸的盘片通常比2.5英寸的盘片拥有更高的存储容量和更快的数据传输速率。

转速是指盘片旋转的速度,以每分钟转数(RPM)表示。常见的转速有5400 RPM、7200 RPM、10000 RPM和15000 RPM等。转速越高,磁头读写数据的速度通常越快,因为数据区域在磁头下的通过速度更高。高转速也意味着更短的平均寻道时间(磁头定位到数据所在磁道的时间)和更低的平均延迟(盘片旋转将数据移动到磁头下的时间)。

缓存(Cache)缓存是HDD内部的一小块快速内存,用于临时存储频繁访问的数据和即将写入的数据。较大的缓存可以提高性能,因为它减少了对盘片的直接访问次数,从而降低了寻道时间和延迟。

2.2 SSD性能分析

SSD(固态驱动器)读取数据的过程涉及其内部的闪存芯片和控制器。以下是SSD读取数据的简化步骤:

  1. 请求数据,当计算机需要读取数据时,操作系统通过文件系统发送读取请求给SSD控制器。

  2. 翻译地址,控制器接收到读取请求,并将逻辑块地址(LBA)转换为相应的物理页地址。这个过程是必要的,因为文件系统使用逻辑地址,而SSD内部使用物理地址来存储数据。

  3. 寻址闪存单元, 控制器确定数据所在的NAND闪存芯片和存储单元。SSD中的数据分布在多个NAND芯片上,每个芯片包含多个块,每个块包含多个页。

  4. 读取数据,控制器指挥选中的NAND闪存芯片激活相应的块和页,然后从中读取数据。数据通过闪存芯片内的通道传送到控制器。

  5. 传输数据,控制器将读取到的数据发送到SSD的缓存(如果有的话),然后通过数据接口(如SATA或PCIe/NVMe)传输到计算机的内存中。

  6. 完成请求,一旦数据被送达到计算机内存,读取请求就完成了,操作系统将能够使用这些数据进行后续操作。

整个过程非常快速,SSD的读取速度通常远高于传统的机械硬盘。这是因为SSD没有移动部件,数据访问不受机械寻道时间和旋转延迟的限制。此外,高级SSD使用PCIe/NVMe接口可以提供极高的数据传输速率,进一步提升读取性能。

P/E循环次数(Program/Erase Cycles)指的是NAND闪存单元可以被编程(写入)和擦除的次数。它是衡量NAND闪存耐用性的一个重要指标,也被称为写入耐用性或擦写周期。

在NAND闪存中,数据是通过改变存储单元的电荷状态来存储的。每次当数据被写入(编程)或删除(擦除)时,存储单元中的绝缘层会受到一定程度的损耗。随着P/E循环的不断重复,这种损耗会逐渐累积,最终导致绝缘层性能下降,存储单元无法可靠地保存电荷状态,从而无法准确存储数据。

NAND闪存类型存储位数速度耐用性P/E循环次数成本适用场景
SLC (单层单元)1位最快最高最多,10万次以上最高企业级应用、高性能需求
MLC (多层单元)2位中等中等中等,1万到3万次中等消费级市场、一般性能需求
TLC (三层单元)3位较慢较低较少,数千次到1万次较低大容量存储、成本敏感型应用
QLC (四层单元)4位最慢最低最少,几百到数千次最低非常大容量存储、存储密度优先的应用

值得说明的是,上表中的“速度”、“耐用性”和“P/E循环次数”是相对于其他类型的闪存而言的。具体数值会因不同制造商的产品而异。从SLC到QLC,虽然每存储单元的容量增加,但这也导致了写入速度的下降、数据耐用性的降低和擦写周期的减少。制造商通过各种技术(如错误更正代码(ECC)、过度预留空间和写入放大技术)来提高MLC、TLC和QLC闪存的性能和可靠性。

2.3 两种磁盘的性能对比

由于HDD依赖于物理移动部件,它的读取速度通常比没有移动部件的固态硬盘(SSD)慢。然而,由于成本效益较高,HDD仍然在许多存储密集型应用中被广泛使用。关于二者的优势和劣势,可以总结如下:

性能指标SSDHDD
读写速度高速,尤其是PCIe/NVMe接口的SSD相对较慢,特别是随机读写
读写寿命有限的写入/擦除(P/E)循环通常不受写入次数限制,但易受物理损坏
启动时间几乎瞬时启动启动时间较长,因需等待盘片旋转
耐用性抗震动和跌落,更耐用机械部件易受损,耐用性较低
噪音和发热无噪音,低发热运动部件产生噪音,发热量较高
数据恢复数据恢复过程可能更复杂和成本更高数据恢复可能性更高,但不是总能成功
功耗功耗较低功耗较高,尤其在高转速时
价格每GB成本较高每GB成本较低
存储容量通常较小,价格较高提供大容量选项,价格相对经济
存储密度存储密度提高,但仍低于HDD高存储密度,适合大容量存储需求

3 磁盘性能测试

3.1 性能测试方法

测试方案设计是评估存储设备性能的关键环节。从测试方法上,可以分为以下几个方面进行讨论。

  1. 顺序读写与随机读写

顺序读写和随机读写是衡量存储设备性能的两个重要指标。顺序读写是指数据以连续的方式存储和读取,而随机读写则是数据以非连续的方式存储和读取。在实际应用中,顺序读写和随机读写的性能差异可能对系统性能产生显著影响。在OLAP型运用中比较侧重于大规模数据量的读取和计算,对顺序读写的性能要求比较高,而对于一些OLTP的场景,则侧重于关注随机读写的能力,但总体而言,一个号的硬盘,其顺序读写的性能和随机读写的性能可以做到同样优秀。

顺序读写测试通常包括连续读取和连续写入,这些测试可以帮助我们了解存储设备在处理大量连续数据时的性能表现。随机读写测试则包括随机读取和随机写入,这些测试可以帮助我们了解存储设备在处理分散数据时的性能表现。

  1. 不同文件大小与测试模式

在测试存储设备时,我们需要考虑不同文件大小对性能的影响。文件大小可以从较小的几KB到较大的几GB不等。通过测试不同大小的文件,我们可以了解存储设备在处理不同大小数据时的性能表现。

此外,测试模式也对性能评估至关重要。常见的测试模式包括全零、全一、随机数据和实际应用数据。全零和全一测试可以帮助我们了解存储设备在处理简单数据模式时的性能。随机数据测试可以模拟实际应用中的数据分布。而实际应用数据测试则可以更准确地反映存储设备在实际使用场景中的表现。

  1. 长期性能稳定性测试

长期性能稳定性测试是评估存储设备在长时间运行过程中性能变化的重要手段。这类测试通常包括长时间连续读写、周期性读写和间歇性读写等模式。通过长期性能稳定性测试,我们可以了解存储设备在持续工作过程中的性能衰减情况,以及在不同工作负载下的性能表现。

3.2 性能测试工具介绍

  • Iometer是一个开源的磁盘性能测试工具,它可以在Windows、Linux和FreeBSD等操作系统下运行。它可以生成各种负载场景下的磁盘读写吞吐量、队列深度、响应时间等性能指标,并且可以根据测试结果生成图表。Iometer支持多种测试模式,包括顺序读写、随机读写、混合读写等,可以帮助用户评估磁盘的性能瓶颈。

  • ATTO Disk Benchmark是一个简单易用的磁盘性能测试工具,它支持Windows、Mac OS和Linux等操作系统。它可以测试多种文件大小和读写模式,生成读取速度、写入速度、队列深度等性能指标,并且可以根据测试结果生成图表。ATTO Disk Benchmark还支持RAID阵列和SSD的测试。

  • HD Tune是一个Windows平台下的磁盘性能测试工具,它可以测试硬盘的读写速度、缓存大小、寻道时间等参数,并且可以生成详细的测试报告。HD Tune还支持磁盘碎片分析和其他磁盘管理功能。

  • Fio是一个Linux平台下的磁盘性能测试工具,它可以模拟各种负载场景,生成磁盘读写吞吐量、响应时间等性能指标。Fio支持多种测试模式,包括顺序读写、随机读写、混合读写等,并且可以根据测试结果生成图表。Fio还支持多种文件系统和RAID阵列的测试。

4.磁盘性能优化策略

4.1 操作系统优化

4.1.1 文件系统的选择与优化

  • 选择合适的操作系统

不同的操作系统支持不同的文件系统。例如,Windows 支持 NTFS 和 exFAT,而 Linux 支持 ext4、XFS、Btrfs 等。其中,NTFS 是 Windows 中常用的文件系统,它提供了安全性、文件压缩、磁盘配额和大文件支持等特性。 ext4 是 Linux 中广泛使用的文件系统,它具有良好的性能和稳定性,并支持大型文件系统和大文件。选择文件系统时,应考虑兼容性、性能、特性和稳定性。

  • 优化文件系统配置

启用文件系统级别的缓存机制,如在 Linux 中的 noatime 挂载选项,可以减少不必要的磁盘写操作。除此之外可调整文件系统的块大小,以匹配存储的文件类型和大小,以提高空间利用率和减少I/O操作。另外对于SSD,启用TRIM命令可以通知SSD哪些数据块不再使用,从而允许SSD控制器更有效地管理数据,延长SSD的使用寿命。

对于linux而言,关于文件系统的优化,主要是在服务器初始化时调整磁盘的挂载配置来实现,而磁盘的挂载配置主要是在/etc/fstab文件中,在之前的另一篇文章中(juejin.cn/post/725935… ,对此亦有介绍。

4.1.2 磁盘碎片整理

在HDD上,文件可能分散存储在磁盘的不同区域,这种现象称为碎片化。读取这些分散的文件时,磁头需要在磁盘上移动更长的距离,导致读取速度变慢。对于HDD,定期使用操作系统内置或第三方的碎片整理工具,可以重新组织文件数据,使其在磁盘上连续存储,从而提高读取速度。Windows系统中通常内置了磁盘碎片整理工具,用户可以手动运行或设置定期碎片整理计划。对于Linux系统,虽然碎片化的问题较小,但也可以使用 e4defrag 工具对ext4文件系统进行碎片整理。

对于SSD来说,由于其基于闪存的特性和没有机械移动部件,碎片化的影响较小。不推荐进行传统意义上的碎片整理,因为这会导致额外的写入操作,减少SSD的寿命。相反,应该确保操作系统支持并已启用TRIM命令,这有助于SSD自动优化存储空间的使用。

4.2 硬件配置优化

4.2.1 接口技术

在1.1.1节中,我们介绍了硬盘的常用接口,在其他配置相同的情况下,采用了不同的接口,其读写性能也会有所区别。下图为SAS接口与SATA接口的对比,SAS和SATA相同,采用串行技术以获得更高的传输速度。SAS具备2对收发通道,而SATA仅有1对收发通道,SAS的接口技术可以向下兼容SATA,但SATA不可以反向兼容SAS接口。SAS接口的设计是为了改善存储系统的效能、可用性和扩充性,并且提供与SATA硬盘的兼容性。

在物理层,SAS接口和SATA接口完全兼容,从接口标准上而言,SATA是SAS的一个子标准,如下图所示,SAS接口相比SATA多了一组pin脚,这也体现了两者在协议上的差异。

image.png 在使用SATA接口时,确保使用SATA III接口以获得最高的传输速率。对于SAS配置,使用适当的HBA(主机总线适配器)或RAID控制器以支持多个SAS驱动器。

对于NVMe SSD,确保主板支持PCIe 3.0或更高版本,并且SSD被安装在具有足够通道的PCIe插槽中。

image.png

根据性能需求和预算选择适当的接口技术。对于高性能需求的应用,如高频交易或大数据分析,NVMe是最佳选择。考虑主板的兼容性和可用插槽,确保选定的接口技术与系统硬件兼容。 以上部分内容参考自blog.csdn.net/UnionMemory…, 侵删。总而言之,采用更高效的接口,可以有效改善磁盘的性能。

4.2.2 RAID配置和性能

RAID(Redundant Array of Independent Disks)是将多个磁作为硬件专家,针对磁盘性能的优化在硬件配置层面,可以通过合理的RAID配置和选择合适的接口技术来实现。关于RAID的策略,有以下几个级别,常见的RAID级别包括RAID 0、RAID 1、RAID 5、RAID 6和RAID 10等,每个级别在性能和数据保护方面有不同的特点。RAID 0通过条带化数据来提高性能,将数据分布在两个或更多磁盘上,但不提供数据冗余。RAID 10结合了RAID 0的性能和RAID 1的冗余,在提供数据镜像的同时,也提升了读写速度。RAID 5和RAID 6提供了良好的读性能和数据保护,但由于需要进行奇偶校验,写性能可能会受到影响。

RAID级别描述优点缺点最小磁盘数
RAID 0条带化,无冗余最大化性能;提高读写速度无冗余,任一磁盘故障导致整个阵列数据丢失2
RAID 1镜像,数据完全复制提供数据冗余;读取性能提升;一个磁盘故障不会导致数据丢失磁盘利用率低(50%);写入性能无提升2
RAID 5带奇偶校验的条带化读写性能良好;单磁盘故障时不会丢失数据;磁盘利用率较高写入性能受奇偶校验计算影响;重建时间长3
RAID 6双奇偶校验的条带化比RAID 5更高的数据冗余;可承受两个磁盘同时故障写入性能较低;磁盘利用率低于RAID 5;重建时间更长4
RAID 10镜像和条带化的组合(RAID 1+0)高性能;高冗余;单磁盘故障时不会丢失数据高成本;磁盘利用率低(50%)4

可根据需要的性能和数据保护水平来选择RAID级别。例如,对于需要高性能和数据保护的企业数据库,RAID 10可能是一个好选择。

除了关注RAID方式,在实际的工作中,还需要关注RAID本身的配置。笔者就曾经遇到过一个由RAID卡缓存配置不合理带来的问题。在一个配置了SSD的服务器中,我们通过磁盘性能测试发现该服务器配置了SSD之后性能只和普通的HDD相当。经过持续不断地排查才发现是服务器厂商在给我们配置了不带缓存的RAID卡,无适应SSD的高速读写性能,这导致做了RAID策略之后,RAID卡的性能成了拖慢整个磁盘读写效率的瓶颈。

4.2.3 选择好你的硬件

硬件配置的优化是服务器的采购和集群规划阶段就应该考虑的问题,对于一台物理机而言,其硬件配置的性能决定了其后续可优化的上限。而且对于硬件的变更而言,当一台服务器已经上架,换硬件的成本是非常高昂的,有些硬件方案不能升级,只能替换,会带来额外的采购成本。同时,当更换硬件时,这意味着你不仅要停机,而且还要承担新硬件带来的兼容风险。

4.3 应用场景优化

4.3.1 数据库优化

  • 使用高性能存储介质

对于数据库应用,I/O性能至关重要。使用SSD而不是HDD可以显著提升随机读写性能,这对数据库查询和事务处理非常有利。

  • 合理分配存储资源

将数据库的数据文件、日志文件和备份文件分布到不同的物理磁盘上,可以减少磁盘竞争,提高性能。

  • 数据库级的优化

调整数据库的缓存设置,以确保频繁访问的数据保留在内存中。定期维护数据库,包括索引重建和数据碎片整理,以保持高效的数据访问。

4.3.2 虚拟磁盘优化

在云计算的时代,我们面对的不仅仅是物理机,对于前面说到的硬件方式,对于虚拟机而言就无能为力了。但我们也可以从虚拟机的运行原理出发,做一些优化。

  • 使用高性能网络设备

在虚拟化环境中,存储通常通过网络传输。确保存储网络(如iSCSI或NFS)充分优化,使用足够的带宽和低延迟网络设备;

  • 优化虚拟机磁盘文件

对虚拟机磁盘文件(如VMDK或VHD)进行优化,例如,避免使用动态分配的磁盘,因为它们可能会随着时间增长而导致碎片化;

  • 虚拟机磁盘I/O控制技术

使用磁盘I/O控制技术(如VMware的Storage I/O Control)来平衡不同虚拟机之间的资源分配,防止I/O“噪音邻居”问题;

5.小结

磁盘作为服务器存储的主要设备,其性能的高低会直接影响服务器的整体性能。然而磁盘的I/O在一般情况下会大于网络的I/O以,且不像CPU和内存那样一个简单的波动就会对服务器性能引起较大的影响。在大多数情况下,我们往往会忽略对于磁盘性能的关注。本文从磁盘的分类和磁盘读写的原理出发,深入剖析了影响磁盘性能的关键因素。并讨论了磁盘性能的测试及优化的方法,希望能对想深入了解磁盘性能的朋友一些帮助和工作上的参考,由于涉及的面比较宽泛,文中难免有疏漏,欢迎和大家一起探讨。