直播回顾:如何对付臭名昭著的 IO 夯?诊断利器来了 | 龙蜥技术

简介:听到IO夯总是让人头疼,那有没有可以分析IO夯问题的利器?

编者按:sysAK(system analyse kit),龙蜥社区(OpenAnolis)系统运维 SIG 下面的一个开源项目,聚集阿里百万服务器的多年运维经验,针对不同的运维需求提供了一系列工具,形成统一的产品进行服务。作者总结了实际工作中处理的 IO 夯问题的经验,将它梳理成一套理论分析方法并形成 iosdiag 工具,集成到了sysAK 工具集里。本文将由作者带大家一道领略一下 iosdiag 在 IO 夯领域叱咤风云的魅力。本文整理自龙蜥大讲堂第三期技术解读,直播回顾可在龙蜥社区官网查看。

作者:李光水(君然)系统运维SIG核心成员、 毛文安(品文)系统运维SIG负责人。

一、引言

这是作者第二次备战双十一,怀着激动的心情迎接双十一的到来,不曾想迎来的是一枚深水炸弹:赶紧处理一下业务那边出现的 Load 高问题。

“为什么 Load 高呢?”

“因为有 500 多个进程变成了 D 状态。”

“那为什么会有这个多进程 D 状态呢?”

“因为出现了 IO 夯问题...”

曾几何时,听到 IO 夯,作者会有点头皮发麻,为啥呢?因为没有有效手段去定位这个问题,或者就算是有手段,也得经历山路十八弯,成不成还的看运气,若是幸运,还能分析点啥出来,若是不幸运,把机器整挂掉,得不偿失。时至今日,遇到 IO 夯问题再也不虚了,因为作者现在手里有可以分析 IO 夯问题的利器——sysak iosdiag

先来看看这个栈,500 多个进程是因为在内核下等待某个磁盘的块设备互斥锁而进入 D 状态,如图 1-1 所示:

图 1-1

互斥锁正被执行读 IO 请求的内核进程 kworker 持有,如图 1-2 所示,只有读 IO 流程完成之后才能释放锁。但是因为 IO 夯住了,读 IO 流程无法顺利完成,所以就没法正常释放锁了。所以接下来就需要找到是访问哪块磁盘出现了 IO 夯?IO 究竟夯在哪里?

图1-2

之后作者使用 sysak iosdiag 工具找到了出现 IO 夯问题的磁盘,同时也定位出来这个 IO 是夯在了磁盘侧,如图 1-3 所示:

图1-3

作者通过查询 virtio 的后端磁盘的硬件队列的 IO 信息,发现 IO 实际已经处理完了,进一步查询 vring 信息,发现后端没有更新 used ring,最终将问题原因锁定到了 virtio 后端。最后此问题的具体修复方法我们在此不再一一表述,总之,该工具可以方便的定界到问题出自前端驱动还是后端设备侧,节省了不少人力。

经过此问题,作者也简单做了下总结,聊一下 IO 夯的那些事。

二、史诗级的IO架构

在聊 IO 夯之前,了解一个 IO 会经过哪些路径还是很有必要的。网上有各式各样的 IO 架构图,足以让人看到眼花撩乱;作者从一个 IO 的生命周期的角度画了一幅图,然后描述一个 IO 在不同阶段的那些事儿(下图中去掉了部分软件层次,如 dm、lvm 等),流程有点长,请耐心看完~

图 2-1

  1. 假设我们以一次用户态程序的写 IO 为例,那么在调用 write 时候会传入一个数据 buf,这个 buf 在内核层面也是有对应page的。在默认情况下,IO 会以 buffer io 方式往下走;
  2. 假设以 buffer io 方式往下走,走到文件系统层,会将 1 中 buf 里面的数据拷贝到内核 page cache 中,然后把这些 page 置脏,如果此时系统的脏页水位还没有达到系统所设置的阈值,这里就返回了,对用户而言这次 IO 结束了;如果此时脏页水位达到系统所设置的阈值,那么就会启动刷脏流程,这里根据脏页水位具体达到的不同阈值,对用户进程会有不同的处理策略,如短暂休眠或不休眠,在此之后依旧会返回,用户一次 IO 结束;
  3. 刷脏是通过 writeback 机制进行,这一流程的触发,可能是通过定期触发,或者如 2 所说水位已经超过系统所设定的阈值了,又或者是用户执行了同步命令或者调用了 sync/fsync 之类的 api 等等。writeback 机制将脏页回写包装成一个个 work,然后这些 work 由系统的 worker 进程,也就是内核的 kworker 进程来执行。刷脏的过程以一个个 inode 为单位,然后将其中的脏页进一步包装成 bio 结构(bio 结构中,会有一个 bio_vec 来描述被包装的脏页 page,简单理解就是会有一个 page 指针指向这个脏页),之后将 bio 提交到 block 层;当然如果此次 IO 涉及到文件系统元数据的变更,中途内核进程 jbd 也会往 block 层提交 bio;
  4. bio 进入 block 层之后会经历一系列的限制性的处理,如这个 bio 所包装的数据长度是否过大,有或者是否已经触发到 IO 限流,因为这些机制有点小复杂,就不在图上展示了。在此之后,会尝试与已有的 IO 请求进行合并,具体合并则根据 bio 所描述磁盘上起始扇区和长度与 IO 请求中 bio 描述的磁盘地址是否连续来进行合并。如能合并就不再往下,直接返回了;
  5. 如不能合并,则申请一个新的 IO 请求,在多队列架构中,根据磁盘的队列个数和队列深度,在磁盘初始化阶段,在内存上对每条硬件队列已经预先分配了一个 request 集合,同时会有对应的 bitmap 来表示每个请求是否已经被申请。当没有请求可以被申请到时,说明此队列上的 IO 请求已经满了,申请的进程将进入深度休眠等待队列上的 IO 请求已经成功刷到磁盘并释放 IO 请求,才能申请到;
  6. 申请到之后,将 bio 包装成 IO 请求——request,将 IO 请求添加到进程的 plug 队列中,当积蓄到一定量的 IO 请求之后,一把“泄洪”到派发队列上;(补充说明:plug队列“蓄流”机制属内核行为,用户无法控制,plug 队列能积累的 IO 请求数也是有限制的;触发“泄洪”,有可能是 plug 队列满了自己触发的,也有可能是提交完一段数据之后,主动调用的内核接口触发);
  7. request 进入派发队列之后,会被派发到驱动层,上图以 virtio blk 为例,request 会被封装成一个个 sg,这些 sg 里面有描述数据 page 的物理地址、本次 IO 访问的磁盘起始扇区、数据长度等信息。之后驱动将 sg 推入到 vring 缓存中,vring缓存在主机上,是主机上 virtio blk 前端和后端磁盘共享的一块可 dma 访问的内存。sg 推入 vring 之后,会 kick 磁盘提取 IO 并通过 dma 完成数据传输,IO 完成之后,磁盘给主机一个中断,virtio blk 驱动从 vring 中取出完成的 request,进入 io cpmplete 路径;
  8. request 进入 io complete 路径之后,首先执行在 bio 结构体中设置的回调函数,这些回调函数一般在创建 bio 的的流程中指定,其一般负责唤醒等待进程、释放锁资源的操作;之后会记录 io stat 信息,这些信息也是系统 iostat 工具的指标来源;最后释放掉 request,这个释放并不是将 request 内存清空,而是清除该 reqeust 对应的在硬件队列 request 集合上的 bitmap 位,以便于后来的 IO 可以再去申请使用;
  9. 至此,一个 IO 的生命周期结束,而对于 direct io 的方式,整个过程会缺少数据buf复制到内核 page cache、脏页回写这个步骤。上面提到的流程可能不是一个完成 IO 生命周期的全部,由于 IO 链路的复杂性,中间也省掉了部分流程,有兴趣的读者可以再去摸索摸索,或者加入我们系统运维 sig 交流群,欢迎一起探讨。

三、臭名昭著的IO夯

3.1 何为IO夯

IO 夯,可简单理解为 IO 路径在一定程度上堵住了,轻则经过特定路径的 IO 不可访问,重则整条 IO 路径堵住不可用,任你多少 IO 丢下来,我就是没反应。为什么 IO 路径会堵住呢,无外乎是在等待资源。

等待资源一般涉及的是 IO 路径上不可重入的临界区,要求进程持有资源进入、释放资源退出,又或者是事物处理型,允许接受有限个进程的事物,但要等待这些进程的事物全部被处理完之后,才能接收新的进程事物,开始处理新一轮的流程。而当处于临界区内的进程,由于内核 bug 或存储介质原因,导致无法顺利完成 IO 后正常退出,最终造成临界区外的进程因为拿不到资源而处于阻塞状态,导致无 IO 可用。由此可见,只要临界区内的进程不退出这种尴尬的状态,整条 IO 路径就不可用。

图 3-1

内核下有条 io complete 的关键路径,这条路径属于可重入路径,其主要职责为对 IO 结束后的收尾工作,一般地,会先执行一个 IO 回调流程,而后更新一些 IO 的stat信息,最后结束生命周期。内核中也有一些特殊类的 IO,在 IO 子系统中的处理方式与一般的 IO 有所差异,如 flush/fua io,而作者曾经碰到过一起 flush/fua io 夯的问题。flush/fua io 在使用日志型的文件系统场景下可能会比较常见,如 ext4 文件系统,为了保证文件系统元数据能够真正的持久化存储到磁盘的日志区域,jbd 线程在提交 commit record 的时候会发起这种 IO,而flush/fua io的处理流程也是比较繁琐的:

图 3-2

如上图所示,IO 子系统在处理这个 IO 时,会先发起一个 flush io 到磁盘(在内核中唤作pre-flush),等这个 IO 结束之后,再发起真正的数据 IO,当磁盘执行完数据 IO 之后,再此发起一个flush io(在内核中也唤作 post-flush),终于 flush io 结束之后,数据 IO 进入complete 路径。在这个数据 IO 里面,一般会存在比较关键的 IO 回调,其涉及到释放 buffer head 的 lock bit 或者 page cache 的 lock bit,而且往往等待这个 lock bit 的是 jbd 线程本身;作者曾经就遇到 pre-flush io 因为 race 问题被直接释放掉了,导致后续的 IO 流程没有走到,data io 没有得到处理,buffer lock 得不到释放,造成 jbd 夯住,最终引起这个分区的 IO 都得不到响应。

经过本小节的介绍,结合章节 2 的 IO 结构图(图 2-1),可以发现 IO 夯是可以发生 IO 路径上的任何地方

3.2 IO夯的危害

从 3.1 可知,IO 夯会造成有 IO 需求的进程无 IO 可用;从业务稳定性角度来看,对于那些有 IO 访问需求的业务进程,IO 夯可能会引起进程长期阻塞,且在 IO 路径恢复之前,都无法对外提供服务。从系统稳定性角度来看,IO 夯可能会引起大量的进程进入 D 状态,导致系统高负载,甚至系统夯住,shell 命令无法执行,机器无法登陆,最终不得不重启系统去解决。

3.3 IO夯问题分析方法现状

当遇到 IO 夯问题时,我们通常会分析 dmesg 中 hungtask 调用栈、或者是 iosta 信息、sysfs/debugfs 中的统计信息,再结合以往经验去推测问题可能出在哪。当我们碰到如下图 3-3 所示的 iostat 信息时,根据经验,会怀疑是磁盘侧有 IO 没回,因此怀疑io夯在磁盘上,让存储的同学去排查磁盘侧。但这种经验却不一定靠谱,如果是在磁盘返回到 io complete 之间有内核 bug,iostat 也会出现下图中的信息。

图 3-3

那如何分析 IO 夯问题是最有效的呢?答案肯定是要找出来夯住的 IO 请求,然后根据请求里面的信息去分析当前这个请求是处于什么状态、已经走到哪个路径了。但遗憾的是,目前没有实现这个功能的通用工具,唯一能快速实现这一需求的,就只有对问题现场做 crash 分析了,找到夯住的 IO 请求,根据 IO 请求中的信息,再结合代码流程,一步步深入最终找到问题原因,但前提是业务可以容忍这么操作。

3.4 利器简介——sysak iosdiag

sysAK iosdiag,是 sysAK 工具平台中的 IO 诊断工具,已具备 IO 时延探测、IO 夯诊断两大功能,其中 IO 夯诊断可用于检测当前系统中 IO 夯事件并确定问题边界。工具的大体架构图 3-4 所示:

图 3-4

首先通过 sysAK 的 iosdiag 功能去使能 IO 夯诊断,这里诊断到 IO 夯之后,会对 IO 进行数据分析,然后形成诊断结论,诊断结论是以 json 的数据格式保存在一个日志文件里面,同时也支持将数据上传到指定的地方,目前支持 oss 的上传方式,不上传的话,数据也会存在机器本地,供调用者去查看。

图 3-5

工具的性能开销情况:单核 cpu 低于 1%、内存消耗低于 10MB、消耗少许磁盘空间保存诊断结果。

工具支持的内核版本种类:3.10/4.9/4.19多种版本。

iosdiag 诊断结果输出,力求信息准确、结果直观,期望即便不具备内核IO子系统知识的同学也能快速上手。工具会输出一些结论性的信息,如什么时间点,检测到了 IO 事件,这是一个什么样的 IO,从哪个 cpu 发出来的,从哪个磁盘的哪个位置访问多大的数据量,然后这个 IO 夯在哪个路径上,夯住了多久。

图 3-6

四、TODO

工具目前只能覆盖到进入内核 block 层的 IO,在 block 之上的覆盖不到,因此作者目前也在研究如何扩大工具的覆盖面;其次,工具在结果输出上还不够直观,使用者还无法简单明了地从输出信息上看到问题,针对这一点,作者也一直在优化。

原文链接
本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cad致命错误如何处理_Golang 如何优雅地处理错误

- 后端早读课翻译计划 第二篇- 本文提供了一个优雅的处理 Golang 中错误的方法,解决了 Golang error 只有字符串信息的局限性,提供了上下文信息、错误类型判断的功能。尽管 go 具有一个简单的错误模型,但是乍一看,事情并没有那么容…

快速云原生化,从数据中心到云原生的迁移实践

简介:本文将介绍在帮助用户快速完成迁云中的解决方案、最佳实践以及迁云工具。 云原生的时代已经到来,云原生技术正在重塑整个软件生命周期,阿里巴巴是国内最早布局云原生技术的公司之一。 容器服务团队在过去的几年时间内帮助很多用户成功…

实力总结四类 Bean 注入 Spring 的方式

作者 | 阿Q来源 | 阿Q说代码一提到Spring,大家最先想到的是啥?是AOP和IOC的两大特性?是Spring中Bean的初始化流程?还是基于Spring的Spring Cloud全家桶呢?今天我们就从Spring的IOC特性入手,聊一聊Spring中把…

广州大学计算机网络期末考试2013,广州大学计算机网络技术试卷(A卷)

广州大学2006-2007 学年第 1 学期考试卷课程计算机网络技术考试形式(开/闭卷,考试/查)一、填空题(15分)1、现有一计算机要和另一设备进行通信,要实现此目标首先要考虑通过何种接口把计算机和相应设备连接起来;解决此问题属于层的任务。(2分)2…

阿里云全站加速DCDN升级

简介:相比传统CDN加速,全站加速DCDN具有更广阔的应用场景。在当下企业全面数字化的进程中,为了更全面地满足广大企业客户的个性化加速需求,全站加速DCDN从简单开通到个性化定制、从内容分发到安全防护,对客户侧的使用体…

Redis 内存满了怎么办?这样置才正确!

作者 | 码哥呀来源 | 码哥字节上回在《Redis 数据过期了会被立马删除么?》说到如果过期的数据太多,定时删除无法删除完全(每次删除完过期的 key 还是超过 25%),同时这些 key 再也不会被客户端请求,就无法走…

2000坐标系高程与85高程转换_【科普】测量人必须知道的几大坐标系

导读 不了解坐标系的测绘测量人员,不是好员工!无论科研的还是外业的,亦是如此。小编今天就为大家盘点出这几大传统坐标系,各位大大赶快收藏起来吧! 1 北京54坐标系 新中国成立以后,我国大地测量进入了全面发展时期,在全国范围内开展了正规的,全面的大地测量和测图工作,…

云原生数据仓库AnalyticDB支撑双11,大幅提升分析实时性和用户体验

简介:2021年双十一刚刚落幕,已连续多年稳定支持双十一大促的云原生数据仓库AnalyticDB,今年双十一期间仍然一如既往的稳定。除了稳定顺滑的基本盘之外,AnalyticDB还有什么亮点呢?下面我们来一一揭秘。 作者 | Analytic…

漫画:什么是IaaS、PaaS、SaaS?

‍‍作者 | 小灰来源 | 程序员小灰假如你想要一栋属于自己的房子,你有什么样的选择呢?第一种方式,我们可以自己上山砍树准备木材,然后自己去烧制砖瓦,还需要自己研磨油漆等其他材料.....材料准备齐全以后,我…

app获取个人信息是否合法_重拳出击!42款APP过度收集用户信息被点名

驱动中国2019年9月10日消息 近年来我国不断加强对互联网应用中个人信息的保护,但因相关监管机制尚不健全,实际上多数APP并未遵循最少够用原则,仍存在违规收集使用个人信息现象。日前,广东省公安厅持续加强对超范围收集用户信息行为…

无接触式智能服务 用“减法”重塑企业前台场景

简介:为了更好解决企业对前台工作效率、服务体验等诉求,阿里巴巴企业智能事业部联合阿里行政,推出的“非接触式服务”——云前台,集物品暂存、自助领取、物品临时借用、查询周边配套信息、一键呼叫视频客服、报销单收取等功能于一…

阿里园区的这个“格子间” 成为企业高效协同新利器

简介:第一期《数智进化论》带你走进阿里园区的“网红”格子间——视频会议吧,了解它是如何提升办公空间利用率,解决会议室资源供给不足的问题。 会议室是企业员工进行创意、讨论、决策的重要协作场所。传统会议室数量有限、大小相对固定&…

仅用一个 HTML 标签,实现带动画的抖音 Logo

作者 | 零一来源 | 前端印象今天给大家表演 仅用一个HTML标签实现带动画的抖音LOGO,涉及了很多知识点,欢迎交流讨论先上结果,最终实现效果如下:成品图还原度应该还可以吧?抖音Logo结构想要用CSS来画抖音的Logo&#xf…

vaex 处理海量数据_核心业务“瘦身”进行时!手把手带你搭建海量数据实时处理架构...

01 背景在线交易服务平台目的是减轻核心系统计算压力和核心性能负荷压力,通过该平台可以将核心系统的交易数据实时捕获、实时计算加工、计算结果保存于SequoiaDB中。并能实时的为用户提供在线交易查询服务。在线交易服务平台基于实时处理架构设计,通过将…

自己动手写符合自己业务需求的eslint规则

简介:eslint是构建在AST Parser基础上的规则扫描器,缺省情况下使用espree作为AST解析器。rules写好对于AST事件的回调,linter处理源代码之后会根据相应的事件来回调rules中的处理函数。另外,在进入细节之前,请思考一下…

双11特刊|一站式在线数据管理平台DMS技术再升级,高效护航双11

简介: 10万企业共同选择的数据库服务平台 阿里云数据库已连续多年稳定支撑天猫双11,历经极端流量场景淬炼。除了保障稳定顺滑的基本盘,今年大促期间数据库通过全面云原生化,大幅提升用户体验,让技术帮助业务产生更有价…

账户配置阻止使用计算机.怎样开机,开机自启动设置怎么操作 开机自启动设置如何禁止【图文介绍】...

我们都知道,如今的电脑被我们广泛地运用着, 因为它具有很多的功能,比如我们可以通过电脑实现我们平时工作的需要,还可以不出 门 便能够网上购物,非常方便快捷。电脑一般来说都是由硬件系统和软件系统组成的。有时候可能…

Gartner:2021年全球半导体收入增长26%

供稿 | Gartner 出品 | CSDN 云计算 根据Gartner公司的最终统计结果,2021年全球半导体收入同比增长26.3%,总计5950亿美元。 Gartner研究副总裁Andrew Norwood表示:“引起当前芯片短缺的各种事件继续影响全球原设备制造商(OEM&…

pandas 判断是否等于nan_Python之pandas笔记

一、创建1.创建 Series (一维,带标签的数组)t pd.Series(np.arange(10), index list(string.ascii_uppercase[:10]))2.创建 DataFrame (二维,Series的容器 )t pd.DataFrame(np.arange(6).reshape((2,3)), indexlist(ab),columnslist(csr) )3.DataFrame…

解密 Dubbo 三大中心的部署架构

简介:Dubbo作为一个微服务框架,Dubbo SDK与应用服务绑定在同一个进程内,它跟随着应用服务被部署在分布式集群各个位置,为了在分布式环境下实现各个应用服务间的协作, Dubbo 定义了一些中心化组件。 作者 | 华钟明 01…