当前位置: 首页 > 科技观察

风云再续:他抖任他抖,IO诊断在我手

时间:2023-03-22 12:34:28 科技观察

情况继续:让他瑟瑟发抖,IO诊断在我手转载本文请联系云顶论剑公众号。1.介绍说,上次庆南协助曾泰处理官岛网络抖动重大案件,接到紧急报告,一艘盐船在邗沟剧烈摇晃倾覆。狄仁杰带着青囊,迅速启程前往邗沟。2、案件在邗沟现场破案。这时,大运河上一片寂静。绿包递给狄仁杰两根从案发现场打捞上来的盐船龙骨,上面有“iostat标记”,沉声说道,“邗沟沉船案,两年来已经发生过很多次了。每次我到了邗沟,突然狂风大作,船开始摇摇晃晃,更有什者,船直接解体了。为此,我收集了解体船的碎片,发现其中确实有玄机船体的摇晃。”运河上护送官盐的小船,或迎着风浪平稳前行,或摇摇晃晃,分崩离析。如果我们能够知道每个部分抖动的时间长短,并分析其相关部分,就可以找出幕后的真凶。面对这块龙骨碎片,青囊不禁想起了之前处理IO问题时发生的一件怪事。那个时候,系统也在剧烈的晃动着。blktrace等工具无法清楚地解释震动发生的位置。后来又研究了IO领域的抖动问题,说明IO性能在一段时间内无法保持一致,会突然下降到一个不符合我们预期的性能区间。在业务影响方面,数据存储效率低下,无法维持稳定的对外服务,影响用户体验。目前来看邗沟沉船案,很有可能跟IO抖动有关,不由得喜出望外。狄仁杰接过碎片,仔细看了看iostat中的指标,沉吟片刻,说道:“磁盘vda是政府部署的云盘,号称有us级延迟。现在你可以看到,最高写入iops不超过十,最高写入IO不超过十。”100KB/s,为什么在这么低的IO负载下,还有几十ms的await飙升,真是让我百思不得其解。”await是一个从时间维度描述IO性能的指标,单位表示为平均处理时间一定时间内每个IO请求的响应时间,单位为微秒或毫秒,也可以理解为IO的响应时间,这个指标是暴露内核IO子系统的块层后,系统工具iostat处理的结果。因此,它既包含了IO软件栈中某个IO的处理时间,也包含了磁盘的处理时间,因此highawait现象是IO抖动问题的典型特征。“底哥,莫愁先生,对于这种IO抖动的问题,我最近刚好开发了一个诊断工具——iosdiag,已经集成到sysAK工具集中,或许可以为葛先生解决问题。”青南笑着说道。所有人的目光都在放光,如同流光一般,朝着青桑汇聚而去。狄仁杰笑道:“青桑神通果然层出不穷,我告诉你,iosdiag是什么?”3.iosdiag功能介绍青桑说:iosdiag是sysAK工具平台中一款IO存储诊断工具。已经具备两个功能:IO延时检测功能和IOHANG诊断功能。前者用于分析当前IO存储链路中的延迟抖动问题,确定抖动边界。读者可以检测当前系统中的IOHANG事件,判断问题边界。IO延迟是指IO在其生命周期中所经历的每条IO路径上的时间损失。通常可以分为OS耗时和磁盘耗时。OS中比较关心的IO栈是IO栈。堆栈还包含复杂的块、驱动程序等部分;俗话说,每次遇到IO抖动问题,都会有人挠头挠头,天就黑了。iosdiag中的iolatency工具实现了IO延迟检测功能。它喜欢隐藏在内核IO堆栈中。可收看六个频道,全方位收听,不同关键路径上的时间戳信息收集在乾坤宝袋中;然后以此为基础,计算出IO路径上的所有延迟数据,从而确定IO耗时(磁盘耗时或软件内部耗时)最大的路径,可以说是神通广大,法力无边。并且iosdiaglatency已经成功定位了很多线上IO抖动问题,目前有以下特点:支持抓取IO延迟超过指定耗时IO支持获取IO路径延迟信息,准确划定磁盘和OS耗时(包括block,Drive,磁盘,IO端耗时)问题信息格式化输出,更直观,有完整的单个IO信息,所有IO统计,进程级IO耗时分析,可以直接知道问题出在哪里"很好!懂的人我真的是青囊,这个谜团应该用iosdiag延迟来解决。”听着庆南的介绍,狄仁杰脸上的难过渐渐散去,取而代之的是喜色,何不去诊治。4.解决iosdiagjitter问题狄仁杰迫不及待,让青桑运行sysakiosdiaglatency,开始了激动人心的IOjitter诊断之旅。[root@VM20200727-16/root]#sysakiosdiaglatency-b10-t10以上命令表示sysakiosdiaglatency会在系统中运行10秒,收集这段时间内系统中延迟超过10ms的IO,然后退出诊断。届时,每条路径上的IO延迟将是不可见的。时间一分一秒过去,所有人都充满了期待。看到iosdiag诊断结束后,狄仁杰立即打开了诊断日志文件。果然大家发现一共收集了9个IO,其中flush/fuaio有6个但是经过统计,主要的IO耗时其实都集中在OS的block中(最大耗时51.4ms)..."diskname":"vda","total_ios":9,"flush/fua":6"delays":[...{"component":"os(block)","percent":"58.988%","max":51442,"min":14,"avg":20686},{"component":"os(driver)","percent":"0.034%","max":22,"min":4,"avg":12},{"component":"disk","percent":"40.966%","max":51291,"min":250,"avg":14366},{"component":"os(complete)","percent":"0.009%","max":7,"min":2,"avg":3}]..."iosdiag真是神器!”,狄仁杰忍不住赞叹,对青楠竖起了大拇指。“刚刚知道os(block)需要很多时间。你能详细了解一下原因吗?”你可以展开这个IO看看,也可以揭开其中的奥秘。”青楠笑着回答道。slowio","component":"os(block)","delay":"51442us","total_delay":"51738us","cpu":0,"comm":"jbd2/vda1-8->kworker/4:1H","pid":"358->352","diskname":"vda","op":"FWFS","sector":59159840,"data_len":4096},"detail":{...}}”这个IO是jbd2线程(op:FWFS)发起的flush/fua请求,总耗时51.7ms,block层却耗时51.4ms,实在是不正常。就像我们对block层的flush实现机制的理解一样,flush/fua请求在真正写入数据前后需要执行多次flush请求。不仅需要串行执行,还需要workqueue的介入,极其繁琐。可以看出,导致本次IO耗时长的可能有两种:workqueue调度慢或者磁盘本身慢。听了庆难的分析,狄仁杰神色一喜,认为自己离真相不远了,问道:“有没有什么资料可以查一下,有没有更进一步的原因?”除了严重,磁盘路径也占了40%的耗时?所以,我猜测问题肯定是磁盘引起的,我们可以再找一个捕获到的writeIOrequest来展开。从诊断日志文件。{"summary":{"check_time":"ThuOct1411:21:362021","event":"slowio","component":"disk","delay":"32465us","total_delay":"32520us","cpu":0,"comm":"jbd2/vda1-8->kworker/0:1H","pid":"358->357","diskname":"vda","op":"WS","sector":59159848,"data_len":98304},"detail":{"delays":[{...},{"component":"block","delay":43},{"component":"driver","delay":8},{"component":"disk","delay":32465},{"component":"complete","delay":4}],"points":[...]}}至此,大家发现正常的写IO在磁盘端有32.4ms的延迟。同时这个IO也是通过workqueue下发的,但是block端的消耗只有43us,所以可以看出没有workqueue调度慢的问题,就是磁盘有问题。自从升级磁盘以来,已经稳定在线几个月,没有出现highawait的问题,沉寂许久的大运河又重新出现在了过去。官盐船南下北上,淮北人终于可以吃上官盐了。五、后记一个月后,洛阳传来办案成功的消息。看完奏折,武则天惊叹,“邗沟沉船多次翻覆,工具应有尽有,就是打不破,只有狄怀英用了绿包的iosdiag,简直神了“是的。短时间内就能完成的工具。真是太神奇了。就这个绿色袋子,怎么还有人?”这时,一位内部历史学家突然回复道,“绿包,英文名sysAK,是来自龙蜥社区(OpenAnolis)的一个开源项目,里面包含了很多工具和魔法技能。”武则天惊叹道:“sysAK真是神技啊!”此时,千里之外的大运河边,杨柳依依和狄仁杰依依不舍地告别了庆难,“多亏了你这些天解决了各种疑难杂症,你的许多神奇技能也让我大开眼界,真不想放过你。”“这些天来,我深受长辈们的喜爱,只是有要紧的事情要做,不便久留,日后若是长辈们再次需要,哪怕是远在天边。”天上,青囊定能解除长老们的后顾之忧。”