【公司分享学习】容器磁盘占满导致CPU飙高


这是公司大佬的一次内部分享,我尝试简短总结一下

问题描述

某服务的其中两个副本异常,CPU 飙高。

指标排查

  1. 查看container_cpu_usage_seconds_total监控,CPU 飙升,逼近 limit。

  2. 查看container_cpu_cfs_throttled_periods_total监控,CPU 飙升伴随 CPU Throttle 飙升,所以服务异常应该是 CPU 被限流导致。

  3. 查看container_cpu_system_seconds_total监控,发现 CPU 飙升主要是 CPU system 占用导致,容器内pidstat -u -t 5 1可以看到进程%system占用分布情况。

  4. perf top看 system 占用高主要是 vfs_write 写数据导致。

img.png

  1. iostat -xhd 2看 IO 并不高,磁盘利用率也不高,io wait 也不高。

  2. sync_inodes_sb看起来是写数据时触发了磁盘同步的耗时逻辑

  3. 深入看内核代码,当磁盘满的时候会调用 flush 刷磁盘所有数据,这个会一直在内核态运行很久,相当于对这个文件系统做 sync。

img.png

  1. 节点上df -h看并没有磁盘满。

  2. 容器内df -h看根目录空间满了.

img.png

  1. 看到docker daemon.json配置,限制了容器内 rootfs 最大只能占用 200G

img_1.png

  1. 容器内一级级的du -sh *排查发现主要是一个 nohup.log 文件占满了磁盘。

结论

容器内空间满了继续写数据会导致内核不断刷盘对文件系统同步,会导致内核态 CPU 占用升高,设置了 cpu limit 通常会被 throttle,导致服务处理慢,影响业务。