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

系统
话说上回青囊协助曾泰处理完官道的网络抖动大案之后,接到急报说邗沟发生盐船剧烈抖动以致倾覆的大案,狄仁杰又带上青囊火速启程赶往邗沟。

[[432179]]

本文转载自微信公众号「云巅论剑」,作者李光水、毛文安 。转载本文请联系云巅论剑公众号。

一、引子

话说上回青囊协助曾泰处理完官道的网络抖动大案之后,接到急报说邗沟发生盐船剧烈抖动以致倾覆的大案,狄仁杰又带上青囊火速启程赶往邗沟。

[[432180]]

二、邗沟现场断案

此时大运河上一片沉寂,青囊递给狄仁杰两片从案发现场打捞上来,标记有“iostat印记”的盐船龙骨碎片,沉声道,“邗沟覆船案,两年内已发生多次。每到邗沟,大风忽起,船只便开始抖动摇晃;更甚者,船只直接解体。为此,我收集到解体船只的碎片,发现这船体抖动确有玄机。”运河之上押运官盐的船只,遇风浪或保持稳健前行,或摇晃解体,如能知晓各部件抖动之时间长短,分析其关联部位,便能揪出幕后真凶。

面对此龙骨碎片,青囊不禁联想到之前处理 IO 问题时的一件奇事,当时系统也是抖得厉害,blktrace 等工具无法清楚解释在哪里抖的,后来便研究了一下 IO 领域的抖动问题,它表现为在一段时间内,IO 性能无法始终保持一致,会突发性的下跌到不符合我们所预期的性能范围。就业务影响而言,数据存储效率低下、无法维持稳定的对外服务,影响用户体验。目前看邗沟覆船案,极有可能跟 IO 抖动有关,不禁喜上眉梢。

狄仁杰接过碎片,仔细端详 iostat 中的各指标,沉吟片刻道,“磁盘 vda 乃官家所部署的云盘,号称 us 级别延迟,现在可以看到写 iops 最高也不过十、写 IO 最高也不过百 KB/s,何以在如此低的 IO 负载情况下,竟有数十ms的await冲高,着实令我百思不得其解。”

await 是一个从时间维度描述 IO 性能的指标,表示为单位时间内每个 IO 请求被处理的平均耗时,单位为微秒或者毫秒,亦可理解为 IO 的响应时间。这个指标是内核 IO 子系统 block 层透出来后经过系统工具 iostat 加工之后的结果,因此,它既包含了一个 IO 在 IO 软件栈中处理的时间,也包含了磁盘的处理时间。因此 await 冲高现象是 IO 抖动问题中比较典型的特征。

“狄阁老莫愁,针对此类 IO 抖动问题,鄙人正巧最近研制出一诊断利器——iosdiag,已经集成到 sysAK 的工具集,或许可为阁老排忧解难”,青囊笑道。

众人目光炯炯,恍若流光般向青囊汇聚而去,狄仁杰笑道,“青囊之神技,果真层出不穷,且与我等说来,何为 iosdiag?”

三、 iosdiag 功能介绍

青囊道:

iosdiag,是 sysAK 工具平台中的 IO 存储诊断工具,已具备 IO 时延探测功能、IO HANG 诊断功能两大功能,前者用于分析当前 IO 存储链路中的时延抖动问题并确定抖动边界,后者可检测当前系统中 IO HANG 事件并确定问题边界。

IO 时延,指 IO 在其生命周期内所经历的 IO 各路径上的时间损耗,通常情况下,可以分为 OS 耗时和磁盘耗时,而 OS 内比较受关注的就是 IO 栈了,IO 栈里面又包含复杂的 block、驱动等部分;正所谓每每碰到 IO 抖动问题,必有人抓耳挠腮、暗无天日呐。

iosdiag 中的 iolatency工具,实现了 IO 时延探测功能,最喜隐匿于内核 IO 栈之中,竟能眼观六路,耳听八方,以迅雷不及掩耳之势,将各 IO 在生命周期之内,不同关键路径上的时间戳信息尽收于乾坤宝袋之中;而后又基于此,计算 IO 路径上的所有时延数据,来确认 IO 耗时最大的路径(磁盘耗时或者软件内耗时),可谓神通广大,法力无边。

且 iosdiag latency 已经成功定位到多起线上 IO 抖动问题,目前具备如下特色:

  • 支持捕获 IO 延迟超过指定耗时的 IO
  • 支持获取 IO 各路径延迟信息,准确定界磁盘、OS 耗时(包含 block、驱动、磁盘、IO 结束耗时)问题
  • 信息格式化输出,更直观,具备完整单个 IO 信息、所有 IO 统计信息、进程级IO 耗时分析,能够直接了当的知道哪里出了问题

“甚好!知我者,真乃青囊也,此迷局当以 iosdiag latency 破之”,边听青囊介绍,狄仁杰一脸愁容渐渐消散,满面春风取而代之,如今已是柳暗花明,既有 iosdiag latency 利器在手,何不上去诊断一把。

四、iosdiag 抖动问题破解

狄仁杰早已迫不及待,让青囊运行了 sysak iosdiag latency,开始了激动人心的 IO 抖动诊断之旅。

  1. [root@VM20200727-16 /root] 
  2. #sysak iosdiag latency -b 10 -t 10 

以上命令表示,sysak iosdiag latency 将在系统中运行 10 秒,并收集系统中该时间段内延迟超过 10ms 的 IO,随后退出诊断,届时,IO 在各路径上的延迟将无所遁形。时间 1 秒 1 秒过去,众人满怀期待,当看到 iosdiag 诊断结束之后,狄仁杰随即打开了诊断日志文件,果然大有玄机,而后众人发现,总共收集到 9 个IO,其中 flush/fua io 有 6 个,而经过统计主要 IO 耗时竟然集中在 OS 的 block 中(最大耗时 51.4ms)

  1. ... 
  2.         "diskname":"vda"
  3.         "total_ios": 9, 
  4.         "flush/fua":6 
  5.         "delays":[ 
  6.             ... 
  7.             { 
  8.                 "component":"os(block)"
  9.                 "percent":"58.988%"
  10.                 "max":51442, 
  11.                 "min":14, 
  12.                 "avg":20686 
  13.             }, 
  14.             { 
  15.                 "component":"os(driver)"
  16.                 "percent":"0.034%"
  17.                 "max":22, 
  18.                 "min":4, 
  19.                 "avg":12 
  20.             }, 
  21.             { 
  22.                 "component":"disk"
  23.                 "percent":"40.966%"
  24.                 "max":51291, 
  25.                 "min":250, 
  26.                 "avg":14366 
  27.             }, 
  28.             { 
  29.                 "component":"os(complete)"
  30.                 "percent":"0.009%"
  31.                 "max":7, 
  32.                 "min":2, 
  33.                 "avg":3 
  34.             } 
  35.         ] 
  36.         ... 

“iosdiag 果真神器也!”,狄仁杰忍不住赞叹,朝青囊竖起了大拇指。

“只是现下已知 os(block) 耗时严重,可否进一步获悉耗时原因?”

“当然可以,狄阁老且看,诊断结果中不仅包含延迟分布统计信息,同时还包含延迟最大的 IO,我们可以将此 IO 展开来看,或可发现其中玄机”,青囊笑答曰。

  1. "abnormal_seq":{ 
  2.         "summary":{ 
  3.             "check_time":"Thu Oct 14 11:21:36 2021"
  4.             "event":"slow io"
  5.             "component":"os(block)"
  6.             "delay":"51442 us"
  7.             "total_delay":"51738 us"
  8.             "cpu":0, 
  9.             "comm":"jbd2/vda1-8 -> kworker/4:1H"
  10.             "pid":"358 -> 352"
  11.             "diskname":"vda"
  12.             "op":"FWFS"
  13.             "sector":59159840, 
  14.             "data_len":4096 
  15.         }, 
  16.         "detail":{...} 
  17.     } 

“此 IO 为 jbd2 线程发起的 flush/fua 请求(op: FWFS),总耗时 51.7ms,而 block 层耗时竟有 51.4ms,实在是不正常。正如我们对 block 层 flush 实现机制的理解,flush/fua 请求在真正写入数据前后,要执行多次 flush 请求,不仅要求串行执行,而且还需要 workqueue 的介入,繁琐至极。由此可见,有两种可能性导致此 IO 耗时长:workqueue 调度慢或者磁盘本身就慢。”

听完青囊的分析,狄仁杰面露喜色,认为已经离真相不远,追问,“不知是否还有信息可以查看进一步原因?”

“狄阁老此前是否留意到除了 os(block)路径耗时严重之外,还有 disk 路径也占据了 40% 的的耗时?由此,我料问题必定由磁盘引起,我们可再找一个捕获到的写 IO 请求展开来看”,青囊似乎早已了然于胸,淡然从诊断日志文件中随意取出一个写 IO 信息。

  1.     "summary":{ 
  2.         "check_time":"Thu Oct 14 11:21:36 2021"
  3.         "event":"slow io"
  4.         "component":"disk"
  5.         "delay":"32465 us"
  6.         "total_delay":"32520 us"
  7.         "cpu":0, 
  8.         "comm":"jbd2/vda1-8 -> kworker/0:1H"
  9.         "pid":"358 -> 357"
  10.         "diskname":"vda"
  11.         "op":"WS"
  12.         "sector":59159848, 
  13.         "data_len":98304 
  14.     }, 
  15.     "detail":{ 
  16.         "delays":[ 
  17.             {...}, 
  18.             { 
  19.                 "component":"block"
  20.                 "delay":43 
  21.             }, 
  22.             { 
  23.                 "component":"driver"
  24.                 "delay":8 
  25.             }, 
  26.             { 
  27.                 "component":"disk"
  28.                 "delay":32465 
  29.             }, 
  30.             { 
  31.                 "component":"complete"
  32.                 "delay":4 
  33.             } 
  34.         ], 
  35.         "points":[...] 
  36.     } 

至此众人发现,正常的写 IO,在磁盘侧的延迟竟然达到 32.4ms,同时此 IO 也是通过 workqueue 下发,但 block 侧的消耗也仅 43us,由此可见没有 workqueue 调度慢问题,是磁盘有问题。

自打将磁盘升级之后,线上稳定运行数月,未见await冲高问题,而沉寂了许久的大运河也重现往日喧嚣,官家盐船南来北往,淮北百姓终于又能吃上官盐了。

五、后记

一个月后,破案捷报传到洛阳,武则天读完奏折惊叹不已,“邗沟覆船已发多次,各家工具齐上,尚不能破,独狄怀英竟以青囊之 iosdiag 神器,不日便告功成,真乃神乎其技矣。只是这青囊,为何许人也?”

这时忽有内史答曰,“青囊,英文名 sysAK,是龙蜥社区(OpenAnolis)的一个开源项目,里面有诸多工具神技”

武则天惊呼,“sysAK,真乃神技也!”

而此时远隔千里之外的大运河边,杨柳依依,狄仁杰正依依不舍送别青囊,“这些日子多亏有你解决各类疑难杂症,你那诸多神技,也令我大开眼界,我实在不舍你离去”。

 

“这些时日承蒙阁老厚爱,奈何要务在身,不便久留。日后若阁老再有需要,哪怕远在天边,青囊必定肝脑涂地,为阁老解忧。”

 

责任编辑:武晓燕 来源: 云巅论剑
相关推荐

2020-02-11 13:22:20

this函数JavaScript

2020-08-06 10:09:08

抖音木马安全隐私

2019-06-21 09:55:10

刷抖美腿App

2019-11-06 16:33:29

Ignite微软技术

2022-01-22 07:44:12

抖音PC 版电脑刷抖音

2015-11-06 11:02:24

微信罗素生活

2018-06-22 14:03:37

mysql删库

2021-08-16 08:02:34

技术文档代码

2009-06-10 09:37:39

2021-04-29 05:58:20

微信摇一摇抖音

2020-07-22 08:58:56

C++特性函数

2021-06-28 05:19:32

抖音电脑

2022-02-22 08:29:59

Vue前端防抖

2021-01-04 10:04:11

人脸识别人工智能数据

2021-04-07 13:31:36

人脸识别人工智能AI

2015-03-18 11:38:38

.com

2022-06-06 12:19:08

抖音功耗优化Android 应用

2023-12-18 07:37:17

JavaScript防抖节流

2015-03-25 09:42:21

2009-06-02 08:14:42

点赞
收藏

51CTO技术栈公众号