iofsstat:帮你轻松定位 IO 突高,前因后果一目了然 | 龙蜥技术

简介:磁盘被打满到底是真实的业务需求量上来了呢?还是有什么野进程在占用 IO? iofsstat 帮你精准定位。

编者按sysAK(system analyse kit),是龙蜥社区系统运维 SIG 下面的一个开源项目,聚集阿里百万服务器的多年运维经验,针对不同的运维需求提供了一系列工具,形成统一的产品进行服务。本文总结了实际工作中 IO 打满、IO util 高问题的处理经验,将它梳理成一套理论分析方法并形成 iofsstat 工具,集成到了sysAK 工具集里。以下将由作者带大家一道领略 iofsstat 的独特魅力。

文/李光水:系统运维SIG核心成员、 毛文安:系统运维SIG负责人。

一、 需求背景

经常碰到这样一类问题:磁盘被打满,然后 io utils 高,触发业务监控告警,磁盘使用的是 HDD,出现问题的时候 iops 已经被打到几百、bps 也已经到了上百 MB/s,然后持续个几秒钟结束,然后过个几十秒又出现,这就造成了业务监控频繁告警。业务方会苦恼,磁盘被打满了到底是真实的业务需求量上来了呢?还是有什么野进程在占用 IO。比如之前碰到一例线上问题,平常都是正常的,突然某一天发现 IO 高了很多,然后客户想知道是谁把 IO 整高了,后面通过系统的各个命令组合 +ftrace 脚本统计,找到了贡献最高的进程来自于一个与业务不相关的容器,他会定时启动,谜一般的做大量的文件拷贝动作。

二、现有工具

在定位问题这类问题的过程中,我们会通过系统的现有工具,定位具体的进程、文件或者容器,然后采取下一步措施解决问题,如停掉进程、容器并查看问题现象是否消失。一般地,如下几类工具会使用比较频繁:

  • 基于内核 diskstats 衍生的工具,如 iostat、sar-类命令的IO统计功能、vmstat-d

——可以宏观的从整个磁盘角度去统计 io 信息,如统计整盘的 iops、bps

  • 基于内核 proc/$pid/io 衍生的工具,如 pidstat -d

——可以统计到进程贡献的总体IO

  • 基于 Taskstats 衍生的工具,如 iotop

——可以统计到进程贡献的总体 IO 以及贡献的 iowait

尽管系统为我们提供了比较丰富的工具,但总有这样一种感觉:使用已有的命令,尽管知道磁盘的 IO 高了,但不知道是哪个进程贡献的;知道系统里面的某个进程贡献的 IO 高了,但又不确定这里有多少 IO 是被我关心的磁盘给消费的,也不知道这些 IO 都是在操作什么文件,总觉得哪哪都差一点儿。所以总结下来,得到如下几点诉求:

● 在磁盘 IO 被打满的情况下,希望观察是哪个进程贡献了比较多的 IO

● 系统上统计到某个进程贡献了大量的 IO,希望观察到这些 IO 最终是被哪个磁盘给消费,或者这些 IO 是在访问哪个文件,如果这个进程是来自某个容器,希望依然可以获取访问的文件以及此进程所在的容器

而本文所介绍的 iofsstat,实现了从进程角度来统计 IO 信息、文件读写信息,满足了之前提到的几个诉求,可以应用到 io utils 高、io 打满类问题的定位中。

三、iofsstat 功能介绍

3.1 统计指定磁盘的进程文件 IO

主要统计某进程对某文件贡献了多少 IO,对用户呈现的指标为进程角度+磁盘角度,磁盘角度这个毋庸置疑是为了能够看到磁盘的全貌,进程角度,是更细粒度的,可以看到对应的在这个时刻,各进程的贡献情况(PS:这里并非进程贡献的总和要等于磁盘整体的统计,因为统计的原理不一致,这里可以更多的关注两个角度之间的关联性,如在某一时刻,磁盘统计到高了,这个时候可以看到对应的这个时刻的各个进程的贡献程度),各指标如下:

进程角度:

comm:进程名、pid:进程id、cnt_rd:读文件次数、bw_rd:读文件"带宽"、cnt_wr:写文件次数、bw_wr :写文件"带宽"、inode:文件inode编号、filepath:文件路径,当在一次采集周期内由于进程访问文件很快结束情况下,获取不到文件名则为"-"。

如进程来自某个容器,在文件名后缀会显示 [containterId:xxxxxx]

磁盘角度:

xxx-stat:r_iops:磁盘总的读 iops、xxx-stat:w_iops:磁盘总的写 iops、xxx-stat:r_bps:磁盘总的读 bps、xxx-stat:w_bps:磁盘总的写 bps、xxx-stat:wait:磁盘平均 io 延迟、xxx-stat:r_wait:磁盘平均读 io 延迟、xxx-stat:w_wait:磁盘平均写 io 延迟、xxx-stat:util%:磁盘 io utils

sysak iofsstat -d vdb1 --fs 1 #间隔1秒统计一次vdb磁盘上的进程读写文件情况2022/01/19 14:13:48
vda-stat:  r_iops     w_iops    r_bps    w_bps    wait   r_wait   w_wait  util%0.00       98.00     0.00    91.5MB/s  946.34 0.00     946.34  93.20comm                pid     cnt_rd  bw_rd       cnt_wr  bw_wr       inode       filepath
dd                  55937   0       0           1096    137.0MB/s   9226        /home/data/tfatsf
...

显示结果按照 bw_rd 与 bw_wr 的和做降序排列,如输出结果较多想只看某进程情况下,可以使用 -p PID 只查看指定进程

此功能基于 surftrace 开发,surftrace 是在 ftrace 基础上封装的一系列工具集,用于 trace 内核信息,当前发行版主要包含 surftrace、surfGuide 两大工具,后期还将包含 pylcc(python libbpf compile collections)。更多详情参考可点击文末 surftrace 项目代码链接查看。

3.1.1 进程、磁盘、文件信息

因为复杂的 IO 软件栈,从用户态到落盘,IO 经历了不同的数据结构上的变化,同时经过 fs 和 block 之后,IO 的生产者也可能发生变化,因此在现有的条件下,无法做到不实现内核代码就可以直接获取到这些信息,我们所关注的信息仍需要在内核中解析某些数据结构体外加推演来获取,像获取文件名、IO 大小、进程信息等,比如我们通过在 block 层解析每个 io request 就可以获取到相当饱满的信息:

通过这种方式,首先可以捕捉到所有类别的 IO,也肯定可以获取 io 对应的文件信息,但是在 buffer io 情况下,需要在内核大动干戈的去轮询所有的 task 的 files strcut 反推得到实际写这个文件的进程,而且一旦进程已经关闭了这个文件,将会推导不出进程,因此不可取,另外应尽可能的避开内核 ko,避免后续使用上受限于内核版本问题;因此考虑 fs 层是否存在可用且稳定不会变化的 tracepoint。

实际上满足功能的需求,只需要获取进程信息、IO 大小、dev 编号、文件 inode 编号就够了,而在文件系统层没有现成的符合这些需求的 tracepoint,因此考虑通过 kprobe_events 去 hook 特定函数;kprobe_events 又绕不开因为不同内核版本,数据结构会不一致,造成输入到 kprobe_events 的表达式不一致的问题,幸运的是因为 surftrace 已经帮我们解决了这个问题,我们只需要关注 kprobe 之后数据的解析,而无需关注表达式的变化。

3.1.2 如何获取文件路径

通过 3.1.1 已经获取文件 inode 编号,通过 find -inum 指定磁盘的挂载目录,或者通过 debugfs 方式,获取到文件名,但这种方式不仅耗时间也可能会耗 io;因为已经获取到了进程信息,接下来可以在 /proc/$pid/fd 过滤出来属于指定磁盘下的文件,然后比对文件的 inode 即可获取文件名,简单高效,但缺点是当比对文件过程中文件访问结束被 close 掉了,就获取不到文件名了,但这种情况一般在有问题的情况下出现概率也很低(一般关注的 IO 打满问题基本持续时间也都是秒级别)。

3.2 统计指定磁盘的进程IO贡献

主要统计某进程对某磁盘贡献了多少 IO,对用户呈现的指标为进程角度+磁盘角度,磁盘角度这个毋庸置疑是为了能够看到磁盘的全貌,进程角度,是更细粒度的,可以看到对应的在这个时刻,各进程的贡献情况(PS:这里并非进程贡献的总和要等于磁盘整体的统计,因为统计的原理不一致,这里可以更多的关注两个角度之间的关联性,如在某一时刻,磁盘统计到高了,这个时候可以看到对应的这个时刻的各个进程的贡献程度),各指标如下:

进程角度:

comm:进程名、pid:进程 id、iops_rd:进程贡献的读 iops、bps_rd :进程贡献的读bps、iops_wr:进程贡献的写iops、bps_wr :进程贡献的写bps。

磁盘角度:

同 3.1 节磁盘角度。

sysak iofsstat -d vdb 1 #间隔1秒统计一次vdb磁盘上的进程io贡献情况2022/01/19 12:04:38
vda-stat:  r_iops     w_iops    r_bps    w_bps    wait   r_wait   w_wait  util%0.00       118.00    0.00   104.2MB/s  976.82 0.00     976.82  95.60comm                    pid     iops_rd     bps_rd          iops_wr     bps_wr
[dd]                    98675   1           4.0KB/s         259         32.4MB/s
[kworker/u12:0]         91022   1           4.0KB/s         198         167.5MB/s
[jbd2/vdb1-8]           19510   0           0               1           4.0KB/s
...

显示结果按照 iops_rd 与 iops_wr 的和做降序排列,如输出结果较多想只看某进程情况下,可以使用 -p PID 只查看指定进程,假设看到的是 kworker 类进程贡献的 io 最高,可以进一步通过 3.1 节功能从 fs 角度来查看是哪个进程、哪个文件的 IO 最多。

3.2.1 实现原理

此功能基于 block 的 tracepoint,可获取到指定磁盘的来自各进程的 IO 详细信息,然后统计每个进程的 iops、bps 贡献。

四、性能开销

iofsstat 本质上是基于 ftrace 的实现,不会引发宕机,可以放心使用,由于使用的 ftrace 基本内核版本稳定,因此对内核版本依赖性也低,性能开销方面,经过统计纯 IO 统计功能(3.2 节)开销单核 1% 以下,文件 IO 统计功能(3.1节)稍微高一点,0.x%~3.x%,还在优化。

五、代码开源

iofsstat 代码将在 3 月中旬开源,敬请期待。

Gitee sysak 代码仓链接:sysak: sysAK (system analyse kit) is a toolbox contains useful tools for linux SRE, such as problem diagnosing, events monitoring/tracing, and operating of system and service

surftrace 项目代码链接:https://github.com/aliyun/surftrace

系统运维 SIG 地址:sysom SIG - OpenAnolis 龙蜥操作系统开源社区原文链接本文为阿里云原创内容,未经允许不得转载。 

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

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

相关文章

补招开发岗需要80天?软件开发人员短缺的几个“真相”

作者 | Jani Bagheri 供稿 | Mendix 许多企业已经意识到对遗留系统进行现代化改造、提高运营效率并通过创新的解决方案吸引客户的重要性,意味着企业需要招聘更多的软件开发人员。技术创新需要专业的软件开发人才与开发工具,没有软件开发人员就不会有新技…

html视频标签不显示,HTML视频标签无法正确显示视频

这里是我的JS:function video() {navigator.device.capture.captureVideo(onSuccess, onFail,{limit: 1,duration: constants.MAX_DURATION_OF_VIDEO});function onSuccess(mediaFiles) {console.log("MEDIA FILE");console.log(mediaFiles);var i, path,…

晋中计算机专业对口大学,山西晋中计算机专业好就业吗?,计算机专业

【山西大众技工学校】将学生的日常管理、学习成绩、操行考核融为一体,结合校园全封闭管理形成一套完整的学生管理办法,做到每个环节都有标准与要求,每个过程都有管理和考核。山西晋中计算机专业好就业吗?另一种称为“编译”&#…

实战 Kubectl 创建 Deployment 部署应用

作者 | 洲的学习笔记来源 | CSDN博客本篇文章主要是实战 Kubectl 创建 Deployment 部署应用。通过本期文章:我们将学习创建在 Kubernetes 集群上运行应用程序的 Deployment 所需的最常见的 Kubectl 命令。用 Kubectl 创建 Deployment当运行 Kubernetes 集群&#xf…

性能提升一倍,云原生网关支持 TLS 硬件加速

简介:业界在优化 HTTPS 的性能上也做了诸多探索,传统的软件优化方案有 Session 复用、OCSP Stapling、False Start、dynamic record size、TLS1.3、HSTS 等, 但软件层面如何优化也无法满足流量日益增长的速度,加上 CPU 摩尔定律已入暮年&…

Linux 中如何检查开放的端口

作者 | 刘光录来源 | TIAP无论你的服务器是用的Linux还是桌面系统,了解系统开放的端口,和正在使用的端口,在各种情况下都会有所帮助。比如,如果你的服务器中正在运行着 Apache或者Nginx,那么其端口应该为80或者443&…

微服务应用实现无损上下线实践

简介:本文是阿里云微服务引擎MSE在应用发布时提供的无损上下线和服务预热能力最佳实践介绍。 本文是阿里云微服务引擎MSE在应用发布时提供的无损上下线和服务预热能力最佳实践介绍。假设应用的架构由Zuul网关以及后端的微服务应用实例(Spring Cloud&…

计算机策划知识竞赛有创意的主题,【社团活动】首届创意·科技文化节--第八届计算机趣味知识竞赛决赛...

就21世纪而言,计算机莫过于是至今最成功的创新,作为计算机科学系的学子们担当着社会的前行者,从语言不和的英文代码,到逻辑化的函数循环,甚至有人开玩笑高呼着“c从入门到放弃”。谁又忍心让大家始终学习在枯燥中呢&am…

3月2日,阿里云开源 PolarDB 企业级架构即将发布

简介:2022年3月2日,开源 PolarDB 企业级架构将迎来重磅发布!本次发布会将首次公开开源 PolarDB 的总体结构设计和企业级特性,对 PolarDB for PostgreSQL 的存储计算分离架构、HTAP架构、三节点高可用架构进行全面介绍。 2021年&a…

产学研专家共议中国金融机构数字化转型,“守正创新”成主基调

《中国金融机构数字化转型》白皮书同期发布。 7月12日,由华为云与《清华金融评论》联合主办,清华五道口“数字中国”企业家课程项目提供学术支持的《中国金融机构数字化转型》专题研讨会在线上举办,并在央视财经等平台直播。研讨会邀请到多位…

极速生成缩略图,Serverless 支撑赛事转播锁定冬奥亮点

简介:阿里云函数计算(FC)支撑用户开发赛事视频截图的核心业务代码,实现了弹性高可用免运维的直播视频截图服务,满足用户开发成本低、一键部署的业务需求,比赛期间完美支撑视频转播实时锁定冬奥亮点。 作者…

html拼接日期,html日期加减

//显示某年某月某日function getForecastTime(date) {date new Date(date);var nDate date.getFullYear() "年";nDatedate.getMonth() 1 "月" date.getDate() "日";return nDate;}//日期加减function dateChange(num, date) {debugger;if…

“电信级”运行多年,亚信科技推出核心交易数据库AntDB7.0

亚信科技AntDB数据库为全国24个省份的10亿多用户提供7*24小时实时在线服务,已在通信运营商核心系统持续稳定运行多年。同时,AntDB在金融、交通、能源、公共服务等多个领域商用落地。 数字化浪潮和信创的趋势下,国产数据库市场迎来了快速发展期…

关于质量标准化的思考和实践

简介:最近部门在推质量标准化,通过质量标准化,推动质量内建,从而提高研发部门的交付质量,作者深度参与其中,并在推进过程中总结了一些经验以及思考,在此通过以下定义、共识、实践三个大方向和大…

计算机科学与因果关系,计算机科学与技术

摘要:In order to improve the detection reliability of effective connectivity in brain network, an fMRI (Functional Magnetic Resonance Imaging) analytical approach of effective connectivity is proposed based on the Granger causality (GC) and the …

看懂这5幅图,研发效能分析和改进就容易了

简介:作为 CTO 或企业管理者,我们如何去了解和衡量研发团队的研发效能呢?作为 PMO 和效能负责人,我们该从哪几个维度来回答关于研发效能的问题呢?如何通过效能数据分析,帮助企业管理者透明化研发效能水平和…

关于挂载存储的这个小细节,值得你关注一下

作者 | 江小南来源 | 江小南和他的小伙伴们引言前两天,公司有个同事跑过来问我一件事:我在制作镜像的时候明明把文件已经放到镜像里面去了,为什么kubernetes部署应用的时候文件没有了?听完这话,我看了看Dockerfile是这…

PolarDB 并行查询的前世今生

简介:本文会深入介绍PolarDB MySQL在并行查询这一企业级查询加速特性上做的技术探索、形态演进和相关组件的实现原理,所涉及功能随PolarDB MySQL 8.0.2版本上线。 作者 | 遥凌 来源 | 阿里技术公众号 本文会深入介绍PolarDB MySQL在并行查询这一企业级查…

上海音乐学院计算机基础,上海音乐学院

2018年(第11届)中国大学生计算机设计大赛计算机音乐创作类决赛于8月26日—30日在浙江音乐学院举行,上海音乐学院音乐工程系大二学生蔡岳均作品《埙钹革》、大四学生赵子仪作品《踏风》(指导老师均为刘灏副教授)在决赛中分别获得计算机音乐创作专业组二、三等奖。中国…

从技术到管理,程序员如何实现螺旋上升?

作者 | 李昊 出品 | 《新程序员》编辑部从开发者到技术管理者应该如何提升能力?在李昊看来,开发和管理之间的“鸿沟”并非很难跨越,他将从“深入理解基层技术管理岗位角色、纠偏对技术管理者的认识误区,以及通过日常执行层真正…