抖动是一个极其复杂的问题,它涉及到的原因非常多,本文试图理一下排查的思路,可能并不能涵盖所有内容。

1.对于虚拟机来说,引起抖动的问题可能发生在虚拟机内部或者发生在宿主机上,那么第一步就是要先找出这个问题机器。
比如网络抖动,那么直接就分别在宿主机和虚拟机中进行抓包来找出问题机器,定位到问题机之后再进一步查看。

2.针对抖动问题,首先就是要抓到现场的数据,抖动一般都是比较短暂时间出发的行为,因此需要比较细粒度的trace方法
常用的有atop、perf record等等

3.引起抖动问题的因素有多种,需要一一进行排除,首先就是调度延迟
查看是否是由于调度延迟高引起的,进程响应延迟,从而引发了抖动问题,这可以通过perf sched功能进行抓取调度延迟进行分析
在本例中,我们是遇到了一个抖动问题,怀疑是syscpu使用率高导致的抖动的问题,并且通过ps或者pidstat查看到系统中的sys分布比较均衡,那么此时就需要考虑是否是调度导致的,使用如下方法来确认
(1) 可以使用perf查看调度延迟

perf sched record -- sleep 10

(2)使用perf生成火焰图查看热点,主要是记录cpu clock在各个函数上的热点

sudo perf record -F 99 -a -g -- sleep 10
sudo perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > perf.svg

4.查看是否是系统调用耗时引起的,针对抖动业务的进程,找到pid,跟踪它的系统调用耗时

strace -c -p pid
perf trace -p pid -s --duration 200

5.如果问题出现在虚拟机中,需要注意的是根本原因却不能排除和宿主机无关,因为虚拟机的运行是依赖于KVM对资源的调度的,因此虚拟机上的卡顿也可能是虚拟化引入的。
典型的一个例子,宿主机上创建了多个虚拟机,没有做好资源隔离,导致虚拟机之间的相互竞争,从而引入了抖动问题