Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171496
  • 博文数量: 512
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4500
  • 用 户 组: 普通用户
  • 注册时间: 2022-03-07 15:28
个人简介

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

文章分类

全部博文(512)

文章存档

2024年(63)

2023年(247)

2022年(202)

我的朋友

分类: LINUX

2022-07-20 15:13:38


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,读写延迟等监控数据,方便了更多开发者、用户对主流开源系统的使用。

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

 

阅读(482) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~