性能:如何降低SSD峰值延迟

SSD性能问题

  • SSD损耗
  • IO访问延迟偶尔过大

SSD为啥会损耗

在这里插入图片描述

SSD工作时:当写入SSD的物理数据量,大于应用程序打算写入SSD的逻辑数据量时,就会造成“写入放大”。

  • 如果是传统硬盘HDD,就不会有写入放大的问题。那么SSD为什么会有写入放大呢?这是因为SSD内部的工作原理和硬盘很不一样。

  • 我们知道,HDD是可以直接写入覆盖的。和HDD不同,SSD里面的页面只能写入一次,要重写的话,必须先回收擦除,而且只能在“块”这个级别进行擦除。因此,SSD内部就需要不断移动所存储的数据,来清空需要回收的块。也就是说,SSD内部需要进行块级别的“垃圾回收”。垃圾回收器必须有效的在SSD内部不断的回收块,回收以前使用的页面空间,然后才能在这个块上写入新数据。

  • 因此,对SSD的写入需求,比对HDD的写入需求更高。

写入放大的缺点是什么呢?就是会更快的损耗SSD的生命

  • 每个SSD都有固定数量的擦除周期,如果在很短时间内写到SSD太多数据,就会导致SSD损耗太快,有可能过早烧坏SSD
  • 换句话说,很高的写入速率,可能会导致SSD在到达其预期生命之前就发生故障

所以,我们要注意一个常用的指标叫:年损耗率(Burn Rate)。这个指标是怎么定义的呢?是用 SSD 的预期寿命推导出来的。比如一个 SSD 预期寿命是 4 年。那么每年可以损耗 25%,这就是年损耗率。

如何减少SSD损耗

前面讲的“写入放大”,其实也有一个相应的指标来衡量,就是写入放大系数,它代表物理写入SSD的数据和应用程序写入的逻辑数据之比。比如,如果写入放大系统是2,就表示写入每10KB的逻辑数据,SSD实际上写了20KB。为了控制SSD的年损耗率,我们要尽量降低写入放到系统。

那么如何减少写入放大系数呢?常见的方法有两种:

  1. 保留一定的空闲存储空间,这是因为写入放大系数是和SSD存储空闲率相关的
  2. 使用Trim

这两种方法可以同时使用。

保留一定的存储空间

  • 每个SSD都有一定数量的预留空间,这个空间不是SSD可用容量的一部分。这样做是有原因的。尽管我们可以使用工具来调整SSD卡上的可用容量,但是不建议减少预配置的可用空间,因为这将降低写入性能,并可能大大缩减SSD的使用寿命

  • 我们在存储数据到SSD的时候,也不用存的太满,也就是不要追求太高的空间使用率。一般来讲,存80%到85%就可以了

  • SSD的空闲可用空间越多,内部垃圾收集的开销越低,就越有可能降低写入放大系数。但是这种关系不是线性的,所以存在收益递减的问题

使用Trim

  • Trim是个命令,是操作系统发给SSD控制器的特殊命令。
  • 使用Trim命令,操作系统可以通知SSD某些页面存储的数据不再有效了。
  • 比如,对于文件删除操作,操作系统会将文件的扇区标记为空闲,以容纳新数据,然后就可以将Trim命令发送给SSD

Trim命令有什么好处呢?

  • SSD收到Trrim命令后,SSD内部的控制器会更新其内部数据页面地图,以便在写入新数据时不去保留无效页面。
  • 并且,在垃圾回收期间不会负责无效页面,这样就实现了更有效的垃圾收集,也就减少了写操作和写入放大系统。同时获得了更高的写吞吐量,延长了驱动器的使用寿命

Trim 命令和机制虽然看起来很美好,但是实际中会产生一些问题。原因在于,不同的 SSD厂商对 Trim 命令的处理方式,以及具体的垃圾回收机制很不一样;有的实现还不错,有的就差强人意了,因此 Trim 的性能在每种 SSD 那里会有所不同。

另外,默认情况下,操作系统一般不启用Trim。因此,当文件系统删除文件时,它只是将数据块标记为“未使用”。但是SSD控制器并不知道设备上哪些页面可用,因此无法真正释放设备上的无效空间。所以,在没有启动Trim的情况下,一旦SSD设备的可用容量填满,即使文件系统知道设备上有可用容量,SSD也会认为它自己已经存满。

在这里插入图片描述

想减少SSD损耗,却导致访问延迟过大

怎么启用Trim呢

  • 要在 SSD 上启用连续 Trim,必须在 mount 这块 SSD 的时候使用“Discard”安装选项。
  • 如果一块 SSD 已经安装了,想启动 Trim,那就需要卸载后重新安装,“Discard”选项才能生效。也就是说,使用 remount 命令是不起作用的。
  • 所以,对于单个系统而言,最好在 grub 中启用 mount 选项,并重新启动。

Trim的使用,虽然带来了降低SSD损耗的好处,但是也带来了一些坏处,特别是IO访问可能延迟加大的问题

为什么Trim会影响应用程序性能

在这里插入图片描述

  • 原因和SSD内部的实际机制有关。每个SSD内部都有一个FTL(Flash Translation Layer)映射表,该表将操作系统的逻辑块地址映射(LBA,Logical Block Address)到SSD上的物理页面地址(PPA, Pyhisical Page Address)。映射表在驱动器被写入时不断更新,以后每个读取和写入IO都要引用。

  • 一般来说,映射表示存储在SSD驱动器的RAM中,以便快速访问;但是它的副本也存储在SSD中,目的是电源故障时能够保留LBA和PPA的映射。随着SSD上面的内容和数据的不断变化,这些变化包括新写入IO或者垃圾回收,RAM中的映射表也不断更新,并且持续写入SSD中

  • 如果在文件系统上启用了Discaard选项,那么每次映射文件时,都会生成Trim命令,因为每次Trim都会更改映射表,所以对映射表的更改也就实际的记录到SSD中。这项操作可能需要花费比较长的时间,比如几毫秒才能完成,在这个更改过程中,普通的数据读取和写入IO都会被阻塞,并且阻塞到所有的映射表调整都被完全处理为止。

由于Trim的处理会阻塞普通的数据读取和写入IO,直到Trim完成映射表记录才返回,所以Trim的延迟对普通读写IO的延迟具有重大影响,尤其对高分位数(比如 P99、P99.9) 的读写 IO 延迟影响更大。减少 Trim 延迟就是减少 IO 延迟。所以,我们需要尽量减少 Trim 的等待处理时间

另外值得你注意的是,每个 SSD 厂商和每款 SSD,对 Trim 的具体处理方式都可能不同,颇有些厂商的某些 SSD 具有严重的问题。这就要求我们在选购 SSD 时候,要特别小心,尤其是要做彻底的性能测试。

如何避免Trim带来的延时

Trim 的好处是可以减少 SSD 的损耗,延长 SSD 的寿命;坏处是会造成应用程序的 IO 读写延迟变大

那么怎么才能尽量避免 Trim 带来的坏处呢?这里有两种方式:一是对Discard 选项本身的调优,二是使用fstrim命令。这两种方式分别对应使用 Discard 被启用和不被启用的两种情况。

在这里插入图片描述

对Discard调优

对于已经启用Discard的场景下,Trim命令默认是没有大小限制,也就是说,一次发送会尽可能多的删除命令。但是如果一次删除的数据太多,SSD可能需要很长时间才能返回,其他读写IO就会感受到很大的延迟。

我们就可以微调了。这里我们就可以借助另外一个参数,discard_max_bytes 对Discard 进行调优。这个参数是一个操作系统内核参数,从名字也听得出,它可以指定一次Trim 的最大数据量

调整这个参数的优点,是可以根据实际可接受 IO 延迟的需要,来随意微调。举个例子,假如可接受 IO 延迟比较大,那就可以设置一个较大的discard_max_byes 数值,比如2GB。使用这个参数的坏处是,当有大文件删除时,如果没有相应的重新调整参数,Trim的吞吐量会受影响。

fstrim调优

在没有启用 Discard 的场景下,可以采用 fstrim 来调优。

fstrim也是一个命令,它可以控制Trim,来删除SSD上的文件系统不再使用的数据。默认情况下,fstrim将删除文件系统中所有未使用的块,但是这个命令有其他的选项,根据删除范围或大小来进行微调。

这个命令一般用于 Discard 没有被启用的场景下。为了达到最好的效果,都是周期性的,或者采用外部事件触发来运行这个命令,比如用 Cron 来每天固定时间运行;或者每当SSD 存储使用率到了某个大小就运行。

采用 fstrim 这个方式的优点是,可以根据实际需要来决定何时运行,并且更好地微调和控制 Trim 的工作。

这个方式也有缺点,就是如果不够小心,运行这个命令时可能导致很长时间的 SSD 读写挂起阻塞,在这个阻塞的过程中,SSD 完全没有响应,不能读写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值