Cache性能分析
Cache是提升性能、改善用户体验的关键模块。在分析Cache性能时,需要关注Cache配置对系统读写性能的影响。
Cache配置对读性能的影响
对于读业务,Cache可以通过提前预取增大I/O在Cache中命中的概率,减少读取硬盘的I/O数量,从而降低时延,并得到更高的性能表现。
从LUN中读取数据时,存储系统按照指定的策略提前将数据从硬盘预取到Cache中。存储系统支持四种预取策略:不预取、智能预取、固定预取和可变预取。
- 不预取:不进行预取,只到硬盘上读取主机请求需要的数据,适用于I/O为全随机的场景。
- 智能预取:默认配置,根据I/O特性动态决定是否进行预取,如果为顺序I/O则进行预取;如果I/O不连续则不预取。大部分场景下,推荐使用智能预取。
- 固定预取:每次预取长度为设定的固定值。适用于在一个LUN上有多路顺序I/O,且I/O的大小固定的场景。在媒资、视频监控场景下可尝试使用固定预取。
- 可变预取:每次预取长度为I/O大小的倍数(倍数由用户配置,范围为0~1024)。适用于在多路顺序I/O流,且I/O的大小不固定的场景。在媒资、视频监控场景下可尝试使用可变预取。
当预取策略设置不当时,可能会出现预取浪费或预取不足。
- 预取浪费,即预取的数据量远大于主机实际读取到的数据量。
例如,全随机I/O的场景设置了固定预取策略,则必然发生预取浪费。预取浪费会导致读性能较低,达不到硬盘的读带宽上限,或出现读带宽的波动。是否出现预取浪费,可通过SystemReporter性能监控工具中对比存储池读带宽与存储池所属的硬盘域的读带宽来判断,如果存储池读带宽远小于硬盘域的读带宽,则说明发生了预取浪费。此时可尝试调整预取策略为不预取。
- 预取不足,即对顺序I/O流没有提前在盘上做足量的预取,导致所有I/O都必须直接写入硬盘读取数据,而无法提前在Cache中命中返回。
例如,顺序小I/O的场景(数据库日志)设置了不预取策略,则必然发生预取不足。预取不足会导致I/O时延偏大。是否出现预取不足,可以通过SystemReporter性能监控工具查看LUN的读Cache命中率来判断。当映射给数据库日志LUN的读Cache命中率偏低,可以尝试调整预取策略为智能预取或固定预取。
Cache配置对写性能的影响
Cache的回写/透写策略和高低水位配置会对系统的写性能有影响。
Cache写策略
Cache的写策略包括回写和透写。
- 回写:每一个写I/O到达Cache就返回给主机写入成功响应,然后通过Cache对数据进行重新排序和合并,再统一写入到磁盘。
- 透写:每一个写I/O请求都直接写入磁盘,整体性能的表现受限于磁盘本身所能提供的性能,主要取决于磁盘类型、转速,寻道时间等关键参数。透写的可靠性高于回写。
执行CLI命令create lun创建LUN时,可以设置缓存写策略。在DeviceManager界面创建LUN时不能设置缓存写策略,默认为回写。
Cache的写策略默认设置为回写。
- 在机械盘的情况下,由于写入Cache的速度比机械盘读写快很多,因此对于回写可以得到比透写时更好的性能表现。
- 在SSD盘的情况下,回写对比透写不一定有性能优势,取决于算法的具体实现。
在业务运行过程中,当出现电池故障、系统单控、高温转透写、LUN Fault页面超标等原因时可能会触发LUN转透写。
可以根据DeviceManager管理界面或者CLI命令查看LUN属性得到当前的Cache写策略。通过执行show lun general命令查看Cache写策略。
admin:/>show lun general lun_id=0
ID : 0
Name : 000_Report_LUN001
Pool ID : 0
Capacity : 5.000GB
Subscribed Capacity : 5.187GB
Protection Capacity : 0.000B
Sector Size : 512.000B
Health Status : Normal
Running Status : Online
Type : Thick
IO Priority : Low
WWN : 6111545100326912061d0d4500000000
Exposed To Initiator : No
Data Distributing : 97,3,0
Write Policy : Write Back
Running Write Policy : Write Through
Prefetch Policy : Intelligent
Read Cache Policy : Default
Write Cache Policy : Default
Cache Partition ID : --
Prefetch Value : --
Owner Controller : 0A
Work Controller : 0A
Snapshot ID(s) : --
LUN Copy ID(s) : --
Remote Replication ID(s) : --
Split Clone ID(s) : 0
Relocation Policy : Highest Available
Initial Distribute Policy : Automatic
SmartQoS Policy ID : 0
Protection Duration(days) : 0
Has Protected For(h) : 0
Estimated Data To Move To Tier0 : 0.000B
Estimated Data To Move To Tier1 : 0.000B
Estimated Data To Move To Tier2 : 0.000B
Is Add To Lun Group : No
Smart Cache Partition ID : --
DIF Switch : No
Remote LUN WWN : --
Disk Location : Internal
LUN Migration : --
Progress(%) : --
Smart Cache Cached Size : 0.000B
Smart Cache Hit Rage(%) : 0
Mirror Type : --
Thresholds Percent(%) : --
Thresholds Switch : --
- “Write Policy”表示Cache的写策略。
- “Running Write Policy”表示当前Cache的写策略。
当出现LUN透写的情况,此时请排查触发LUN转透写的原因,如电池故障、系统单控、高温转透写、LUN Fault页面超标等。
Cache高低水位
Cache高低水位是指Cache中存储脏数据的最高限制值和最低限制值。如果Cache的高、低水位设置不合理,会影响Cache的写性能。
当Cache中脏数据容量达到最高限制值时,系统将Cache中的脏数据高速同步到硬盘中;当Cache中存储的脏数据容量小于最高限制值而大于最低限制值时,系统将Cache中的脏数据中速同步到硬盘中;当Cache中存储的脏数据容量小于最低限制值时,系统低速同步脏数据到硬盘中。
高低水位的设置建议:
- 高水位不宜设置的太高。如果高水位设置的值太高页面缓冲小,如果前端I/O数量突然增加,会产生I/O波动和时延增大的现象,从而影响写性能。
- 低水位不宜设置太低。如果低水位设置的值太低,会导致后端将缓存数据频繁写入磁盘,降低写性能。
- 高低水位的间距不宜太小。如果取值间距太小,不能很好的利用后端带宽。
- 系统推荐的Cache高水位和低水位的取值分别为80%和20%。
请用户检查当前的Cache高低水位是否符合配置建议。如果不符合请按照规则调整,再观察性能是否有好转。可以通过quota show pttinfo命令查看Cache高低水位配置的详细信息,也可以通过SystemReporter查看Cache相关的性能指标。
通过在CLI下执行change system cache命令可以对高低水位进行配置。关于命令的使用方法请参见对应版本的高级运维命令参考手册。
修改高低水位会影响Cache向硬盘写数据的频率和大小。若无特殊需求,建议不要随意修改Cache高低水位。