最后更新: 2025-09-28, 作者: hao022
问题描述
在实际工作中,经常遇到业务程序卡顿问题。哪些场景会导致程序卡顿呢?从 Linux 内核角度看:
- 容器进程超出CPU配额,在未来的一段时间无法得到调度。
- 宿主机存在高优进程或容器,低优先级进程获取CPU资源被挤压。
- 进程数突增,导致业务进程在调度队列排队过久,运行延迟。
- 进程等待IO资源,一直处于D状态。
- 容器或者物理机因内存资源不足进入直接回收,同步操作阻塞进程运行。
上面只是一些例子,在实际的生产环境,影响因素还很多。另外 “卡顿” 假象也很多。:(
如何解决
针对上面场景,HUATUO :
- 支持容器的throttle指标,通过该指标能够清晰的看出容器进程是否被“限流”。
- 支持容器内外部争抢指标(滴滴操作系统内核)。
- 支持调度队列指标。通过该指标能够看出调度队列长度,判断是否经历了调度延迟。
- 支持自动化的autotracing,当处于D状态的进程数过多时,阈值触发自动获取容器所有D状态调用栈,进程信息等,方便排查哪里出现了资源阻塞。
- 支持针对直接回收耗时检测,超出阈值则打印被阻塞的进程信息,容器信息,调用栈等。
查看指标
- 安装华佗,见 https://huatuo.tech/quickstart/
- 获取指标:
curl -s localhost:19704/metrics
- huatuo_bamai_cpu_stat_container_nr_throttled 表示容器进程被"限流"的次数
huatuo_bamai_cpu_stat_container_nr_throttled{container_host="xxx",container_hostnamespace="xxx",container_level="xxx",container_name="xxx",container_type="Sidecar",host="xxx",region="r"} 22
- huatuo_bamai_runqlat_container_nlat_04 表示容器进程在调度队列等待的时间,其中落在第四分区(表示50+ms)的次数为24。
huatuo_bamai_runqlat_container_nlat_04{container_host="xxx",container_hostnamespace="xxx",container_level="xxx",container_name="xxx",container_type="Normal",host="xxx",region="r"} 24
- loadavg 表示容器级别的 loadavg 状态,HUATUO 自动触发捕获:
实际案例
-
问题描述:X 业务容器请求下游服务突发超时。在超时时间点,HUATUO 捕获到大量的 dload 内核事件。dload 具体信息如下,同时结合内核代码可以确认当时该容器因内存紧张进入了回收逻辑,回收过程对pagecache进行刷脏,并阻塞在 wait_iff_congested 函数等待IO 完成。
-
业务出现突然耗时增加:
-
HUATUO 捕获如下dload 事件:
-
内核在回收内存过程因IO进入睡眠
篇尾:
- 关注微信公众号【HUATUO 开源技术】留言,或扫码添加工作人员微信,邀请您加入用户群(请备注姓名+单位):
- 代码仓库:https://github.com/ccfos/huatuo
- 官方网站:https://huatuo.tech/