应用篇:如何使用 HUATUO 解决应用程序卡住问题

最后更新: 2025-09-28, 作者: hao022

问题描述

在实际工作中,经常遇到业务程序卡顿问题。哪些场景会导致程序卡顿呢?从 Linux 内核角度看:

  1. 容器进程超出CPU配额,在未来的一段时间无法得到调度。
  2. 宿主机存在高优进程或容器,低优先级进程获取CPU资源被挤压。
  3. 进程数突增,导致业务进程在调度队列排队过久,运行延迟。
  4. 进程等待IO资源,一直处于D状态。
  5. 容器或者物理机因内存资源不足进入直接回收,同步操作阻塞进程运行。

上面只是一些例子,在实际的生产环境,影响因素还很多。另外 “卡顿” 假象也很多。:(

如何解决

针对上面场景,HUATUO :

  1. 支持容器的throttle指标,通过该指标能够清晰的看出容器进程是否被“限流”。
  2. 支持容器内外部争抢指标(滴滴操作系统内核)。
  3. 支持调度队列指标。通过该指标能够看出调度队列长度,判断是否经历了调度延迟。
  4. 支持自动化的autotracing,当处于D状态的进程数过多时,阈值触发自动获取容器所有D状态调用栈,进程信息等,方便排查哪里出现了资源阻塞。
  5. 支持针对直接回收耗时检测,超出阈值则打印被阻塞的进程信息,容器信息,调用栈等。

查看指标

  1. 安装华佗,见 https://huatuo.tech/quickstart/
  2. 获取指标:
    curl -s localhost:19704/metrics
    
  3. 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
    
  4. 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
    
  5. loadavg 表示容器级别的 loadavg 状态,HUATUO 自动触发捕获:

实际案例

  1. 问题描述:X 业务容器请求下游服务突发超时。在超时时间点,HUATUO 捕获到大量的 dload 内核事件。dload 具体信息如下,同时结合内核代码可以确认当时该容器因内存紧张进入了回收逻辑,回收过程对pagecache进行刷脏,并阻塞在 wait_iff_congested 函数等待IO 完成。

  2. 业务出现突然耗时增加:

  3. HUATUO 捕获如下dload 事件:

  4. 内核在回收内存过程因IO进入睡眠


篇尾: