小编说:
今天为大家介绍一款实用工具——阿里开源内核诊断工具diagnose-tools。diagnose-tools是由阿里巴巴开发的linux内核诊断工具,用于linux性能分析,特别是大规模集群系统中的抖动问题分析。
diagnose-tools工具是阿里工程师谢宝友在过去一年多时间开发的,代码行数超过 5万行。同时,他也是《深入理解并行编程》、《自研操作系统:DIM-SUM设计与实现》的作者。
1. 引言
作为一名Linux工程师,难免会遇到系统宕机、夯机、性能抖动等问题。在夯机时,常见的做法是编写一个简单的脚本去遍历系统中所在线程的堆栈。例如:
#!/bin/sh
#****************************************************************#
# ScriptName: load.sh
# Author: baoyou.xie@aliyun.com
# Create Date: 2020-08-13 19:32
# Modify Author: @alibaba-inc.com
# Modify Date: 2020-08-13 19:32
# Function:
#***************************************************************#
for pid in `ls /proc/`; do
for tid in `ls /proc/$pid/task`; do
echo pid: $pid, tid: $tid
cat /proc/$pid/task/$tid/stack
done
done
只要找到进程的调用链,有经验的工程师会很快知道引起系统卡顿的原因。换句话说,类似问题比较容易解决。
确实,在单机中,解决这些问题的方法很多,看起来也很简单。但是,这样的脚本可能存在如下问题:
1. 在生产环境中,一台100个CPU的服务器,往往有数万甚至数十万个线程,运行这样的脚本要花费一分钟时间。
2. 如果在上千台机器中部署这样的脚本,必然会引起生产故障。
3. 这样的脚本只能找到线程在内核中的堆栈。如果应用程序运行在用户态,就没有办法知道这些应用程序到底在做什么,为何引起系统卡顿。
2. 难题
互联网一线工程师最头疼的难题是“集群内RT偶发抖动”,以及系统卡顿。
其中,RT抖动问题最大的难点在于:
常规的单机诊断手段有以下不足:
可以说,集群范围内的RT偶发抖动是一个业界难题,被全世界的运维工程师所讨厌。
在日常业务稳定性分析的过程中,作者用内核模块实现了一些小工具,并将这些小工具集成到diagnose-tools中。为了将工具方便应用到线上生产环境,作者特意使用Linux内核模块实现了diagnose-tools工具。
这些小工具解决了不少线上的稳定性问题。特别是在2019年“双11”压测中,发挥了重要作用,为2019年最稳的“双11”贡献了力量。
3. 用途
在系统卡顿的时候,往往伴随着系统Load指标升高。这可以通过top/uptime等命令看到当前系统的Load指标。一旦发现系统Load升高,就可以使用load-monitor子功能找到当前系统中处于D状态和R状态的进程。这些状态的进程与系统Load指标息息相关。diagnose-tools工具不但能找到这些进程的名称,还能打印出进程的内核态堆栈/用户态堆栈/进程组/CGROUP组等信息。最重要的是,工具还可以为此生成火焰图,这样就可以一目了然地找到问题原因。
当然了,你可以运行如下命令来看看工具的效果:
sh /usr/diagnose-tools/test.sh load-monitor
在服务器Linux中,随着系统负载的增加,会暴露出Linux内核中不少有隐患的代码。例如:过长的循环、锁竞争、不合理的流程。这些代码会导致系统调用变慢,从而引起卡顿。sys-delay功能是找到这些异常代码的好工具。
sys-delay功能的实现原理,是在应用程序进入系统调用的地方,挂接一个trace-point钩子,记录下进入时间,在退出系统调用的时候结束监控。并且启动一个定时器,监控执行时间过长的调用链。
这个功能找到不少异常流程,相关的工程师制作了热补丁,提升了阿里混部系统的平滑度。
run-trace功能是解决应用程序RT抖动的利器。为至少10个业务方解决了2019年“双11”压测过程中的问题。可以略微夸张一点地讲,这个功能为2019年最稳的“双11”发挥了不小的作用,这也间接促进了2019 年“双11”成功获得国家科技进步奖。
run-trace功能的原理是在计算RT开始和结束的地方,挂接钩子,系统记录下在此期间应用程序的所有行为。可以针对应用程序进行微秒级的采样,得到应用程序的用户态调用链,找到应用程序异常期间的所有异常事件。
与开源社区大名鼎鼎的perf工具相比,diangose-tools工具的perf功能不算强大,但是很有特色。特别是在运行数十个容器的宿主机中,使用此工具可以针对部分CPU进行采样,并且完整输出进程用户态/内核态调用链,这些特色是开源perf工具所没有的。此功能也协助分析了不少线上生产环境中的问题。
除了这些功能外,diagnose-tools工具还有20多个小功能。包括网络、I/O相关的诊断工具。限于篇幅,作者并不能在此详细列出所有功能的介绍。有兴趣的读者可以:
1.参考源码目录 /documents/usage.docx里的详细介绍。
2.参考源码目录SOURCE/script/test.sh,试着使用每个功能并观察其结果。
3.添加linux-kernel微信号与作者联系。
4. 效果
通过工具,我们最终在线上生产环境中,发现了不少内存回收、系统堆叠、不合理的监控工具引起的问题。
同时根据工具的诊断结果,产生了19个内核优化补丁,同时也调整线上生产系统的Linux配置参数。
最终实现的效果是:将混部机房的Load高告警数量降低了67%,节省了数千台物理机。同时也将阿里云存储抖动告警降低了50倍。
5. 特点
要达到这样的效果,主要在于工具轻量化的特点。这是本工具优于脚本/ebpf/systemtap的地方。它的性能开销小到何种地步呢?举个例子,在10G网络吞吐量的情况下,对每个报文进行监控,仅仅占用3%的CPU。
正是由于轻量化的特点,才可以将工具常态化运行在集群中,抓住异常信息。最终实现秒级系统资源监控,突破了一个业界技术难题。
6. 适用范围
除了轻量化的特点外,diagnose-tools工具的适用面也比较广,不仅可以用于阿里生产环境的操作系统,也可以用于标准linux 2.6 / 3.x / 4.x / 5.x版本。当然了,还可以用于常见的Linux发行版,例如ubuntu/centos/debian,甚至也有公有云客户将它用于定制linux中。
diagnose-tools还可以获取用户态应用程序的调用链,而不管这些应用程序是用JAVA / C / C++ 还是Go语言开发。甚至,作者希望业界同人对工具进行改造,以支持python等其他开发语言编写的应用程序。
在实践中,也可以基于diagnose-tools进行二次开发,与业务调度程序配合,完成更复杂的功能。实际上,已经有业务方在这样使用diagnose-tools工具了。
7. 现状
diagnose-tools工具已经被一些公有云客户、友商、开源爱好者使用,并且帮助解决了不少Linux性能问题,特别是抖动问题。
目前,diagnose-tools工具已经开放源码。更详细的信息,请大家参考:
https://github.com/alibaba/diagnose-tools
有一些热情的开源爱好者已经为diagnose-tools提供了patch,这些patch已经被合入到工具中,并且被作者用于线上生产系统的问题诊断中。
欢迎更多的开源爱好者参与到diagnose-tools工具的开发中来!
本文作者新书《自研操作系统:DIM-SUM设计与实现》已上市!