前言 Linux上运行大量的后端的业务程序,往往希望得到更快的响应速度,更小的延迟,甚至有严格的PCT 99的指标。而操作系统的复杂度很高,多个因子之间可能会互相影响,从而影响到业务的指标。 在作者的工作环境中,经常使用到atop工具进行问题分析。atop是一个小巧的、高性能、比较全面的系统/进程级别的监控软件,下面就来介绍一下它的主要功能。 分析 源代码 源代码目前主要维护在github上面,https://github.com/Atoptool/atop 代码的原作者也是现在的maintainer通常会在几周甚至个把月的时间处理一下Pull Request,如果有新的改动需要合入到upstream,还是需要一点耐心的。 基本原理介绍 在源代码中的atop.c中有如下描述:
atop周期性(默认10s,可调整)的采集系统以及进程的指标,进行差分计算,然后把计算的结果打印到屏幕,或者输出的文件。 常见的用法 如果是输出到屏幕,效果如下:
从图中可见,主要分成了两个部分,上面是系统的指标采集,下面是进程的指标的采集。 其中系统的指标中,包括: 进程概况:总数量,在采集的时间内新创建的数量和退出的数量等等 CPU概况:CPU的总概况以及per-cpu的统计,包括内核态、用户态、irq、idle、steal等采集,还有IPC(Instruction Per Cycle)和主频的信息。 内存概况:总内存、空闲内存、cache、dirty、cache等等。 磁盘信息:盘的IOPS和吞吐等信息。 网络:PPS和带宽检测。 以及其他的GPU、NFS等监控。 总体来看,atop的输出更像是top+iostat+sar的输出的组合。 另外一种用法,就是让atop以后台的方式运行,把数据采集并记录到本地的文件中。可以适当调整启动参数(推荐10s的采集间隔),使用systemctl start atop.service启动之后,atop就会把采集到的信息写入到磁盘之中。如果发生了问题,想要回看当时的系统/进程的情况,可以使用atop -r /var/log/atop/atop_dddd -b hh:mm,可以查看dddd日期的hh:mm记录的数据。同时,可以使用t键向下一帧查看,或者shift+t回看上一帧。 在作者的工作环境中,其中这种用法更加广泛。atop每10s相当于给系统的状态做了一个快照,我们找到出现问题的时间点,然后通过atop来发现是否有异常。 更多的使用 在atop的页面上,按y键,可以看到线程级别的数据。
按d键,可以看到IO的情况
按m键,可以看到内存的详细数据
按c键看到详细的参数
以及按g恢复到常规视图,按j可以看到以container聚合的视图(非常适合docker场景),按l调整显示的各项数据等等。 需要注意的时候,atop采集数据的时候,尽量不要加入R选项,因为采集Pss的内存信息会引入内核级别的进程内存锁竞争,导致业务进程的延迟抖动。