写点什么

CentOS 8 里的这个功能,天翼云 SFS 弹性文件校准了

  • 2022 年 7 月 20 日
  • 本文字数:1916 字

    阅读完需:约 6 分钟

CentOS(Community Enterprise Operating System)作为 Linux 发行版之一,是 Red Hat Enterprise Linux(RHEL)依照开放源代码规定发布的源代码所编译而成。


由于出自同样的源代码,有些要求高度稳定性的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。最近使用 CentOS 8 的小伙伴可能会发现,CentOS 8 的磁盘性能监控工具 iostat 与 CentOS 7 相比,精准性有所下降,天翼云弹性存储团队在实践过程中发现问题,并用 SFS 弹性文件提升了 iostat 的监控精确性。


在 Linux 中最常用的就是 iostat。它能够监控系统磁盘设备的负载,提供磁盘设备的 IO 合并次数,读写带宽、平均 IO 大小,平均队列长度,磁盘利用率等信息。util(utilization)即磁盘设备的利用率,代表了磁盘设备有百分之多少的时间用于处理 IO,如果 util 长期处于 100%,说明 IO 压力过大,磁盘已满负荷工作。


同样都是满负荷工作的情况下,iostat 中 util 的统计在 CentOS 7 与 CentOS 8 中,显示存在明显差异:

CentOS 7:


CentOS 8:


同一个环境,压力测试把磁盘压满的情况下,CentOS 7 的 util 已经显示 100%了,CentOS 8 的 util 可能还不到 75%。


iostat 中的 util,代表过去的一段时间内,存储设备处理 IO 的时间占总时间的百分比。设备处理 IO 的时间是由设备在内核中的 io_ticks 属性维护:

io_ticks 代表设备处理 IO 的总时间,是一个不断累加的值。io_ticks 不关心队列中有多少个 IO 在排队,它只关心设备有 IO 的时间。即不考虑 IO 有多少,只考虑 IO 有没有。


如果时间过去了 1s,其中的 500ms 设备中有 IO,io_ticks 就会增加 500,util 就是根据这个算式计算出的:io_ticks/总 ticks=500/1000=50%。


CentOS 7 升级到 CentOS 8,util 显示出现了如此大的差异,就是因为在 io_ticks 的算法上,进行了变动。


tips:

对于机械盘,IO 是串行的,util 能准确的反映磁盘的繁忙程度。但对于 SSD,由于 IO 可以并行处理,通过 util 就无法直接表示磁盘繁忙程度,但还是有一定参考价值。


原理分析

在 CentOS 7 中,在每次 IO 开始、合并、结束及查询时,都会调用 part_round_stats_single 判断当前是否有 IO 请求在被处理,若有 IO 请求则根据时间戳与当前时间差值累加 io_ticks,相对比较准确:


这中间就需要用到一个重要的变量,磁盘的 inflight。inflight 表示当前设备中未完成的 IO 请求数量,在 CentOS 7 中是通过每次 IO 开始时加 1,结束时减 1 来实现对 inflight 的维护。 


而在最新内核中,由于多队列的应用,计算 inflight 时会遍历所有处理中的 IO 请求,判断是否在当前磁盘以统计 inflight。


如果为了统计 io_ticks,每次都去遍历所有 IO,就会影响 IO 的效率。所以在 CentOS 8 中,计算 io_ticks 时抛弃了 inflight 值,通过每次 IO 时调用 update_io_ticks,如果发现不在同一个 jiffies 就对 io_ticks 加 1,并将当前时间赋予 stamp。

但是这个改进有一个很明显的问题,在存储较快时不会有问题(iops > 1000)。但是在存储较慢时,比如一个 IO 持续多个 jiffies,当 IO end 的时候经历了多个 jiffies,结果也只对 io_ticks 加 1,会导致 utils 精度丢失很多。


这个问题存在了近 2 年,才在 2020 年得到了修复,通过每次 IO end 的时候将 stamp-jiffies 的时间加入 io_tick,减少误差:


但还是不能解决以下这种场景:如果第一个 io 还没有结束,经过了 n 个 jiffies,第二个 io 进来了,它会将 stamp 设置为当前 jiffies,这个时候,stamp 比之前第一个 IO 记录的值就少了 n,IO 结束时的增加的 io_ticks 就会少 n,同样丢失了精确度。如下图所示:

由于内核没有在每次 IO 时计算 inflight,也就无法判断是否需要对 io ticks 加上 jiffies,这个问题就遗留了下来,导致了 iostat 监控结果的不准确,目前来说开源社区也没有太好的解决方案。


天翼云的改进

针对社区高版本内核对慢速设备 util 统计不精确的问题,天翼云 SFS 弹性文件设计了兼容老版本 io_ticks 统计方法的方案,适用于对于 util 精确度要求较高的场景,可以实时开启/关闭基于 inflight 的精准 io_ticks 统计,让用户在使用 CentOS 8 系统的同时也能享受到 CentOS 7 的精准 iostat 监控水平。



sfs-tools 定义了需要跟踪的内核函数及从内核函数中提取相关的时延等数据的方法,并实现了对数据的二次加工和展示,其架构设计如下:


sfs_tools 可以作为独立的工具使用,也可以作为文件网关的一个特性对外提供各项监控数据。目前该工具已集成天翼云文件存储的监控告警平台。


除此之外,天翼云 SFS 弹性文件还在纠正了精准度的基础上进一步提供了自研的性能监控工具,通过对内核文件函数接口的跟踪,在不影响性能的情况下,提供基于函数及文件级别的 iops,读写延迟等监控数据,方便了更多开发者、用户对主流开源系统的使用。


未来,天翼云将继续坚持自主创新,发挥自身技术优势,持续提升创新能力与核心竞争力,为自主可控、可靠高效的云计算基础架构添砖加瓦,为国家信息技术产业的发展提供坚实的技术保障。

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2022.02.22 加入

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

评论

发布
暂无评论
CentOS 8里的这个功能,天翼云SFS弹性文件校准了_Centos 7_天翼云开发者社区_InfoQ写作社区