OC 云原生 SLI 如何通过内核级观测解决容器抖动难题

在云原生深水区,偶发性的容器抖动往往是 SRE 难以捕捉的"幽灵"。传统的 top / free 等工具只能看到秒级平均值,却无法捕捉毫秒级的长尾延迟。

近期,OpenCloudOS 引入了云原生 SLI(Service Level Indicator)框架,通过内核埋点与主动通知技术,实现了对容器视角的 CPU 调度延迟、内存分配延迟等关键指标的精准捕获。本文将深入解析 SLI 的原理、核心指标及实战用法。该框架的整套代码也已在OpenCloudOS内核中开源,可划至文末查看仓库地址。

一、 云原生 SLI是个啥?它能解决什么问题?

OpenCloudOS 的 SLI 机制是一套基于内核关键路径的主动监控框架。

过去,我们查问题是"从外向内"猜,而 SLI 是"从内向外"报。也就是说,SLI是直接在 Linux 内核的 CPU 调度、内存分配、IO 等核心路径上进行轻量级埋点,以极低的开销实时记录容器内进程的等待时间。

它解决的核心问题是: 将黑盒的系统级延迟,转化为白盒的、可度量的容器级指标。

二、 SLI与主流监控框架的对比及其典型应用场景

在云原生监控领域,我们手里其实并不缺工具(比如 cAdvisor、PSI 或是eBPF)。那为什么 OpenCloudOS 还要在内核里"造轮子"搞出一套 SLI?或许你可以从下面的对比中窥见一二。

综合来看,SLI的核心能力在于主动监控、主动上报、监控精准度高、内核级实时计算且开销极低。

另外,我们这里也列举一些SLI主要覆盖以下核心场景:

  • CPU 调度抖动:进程在 Runqueue 中等待 CPU 时间片的时间或者任务长时间抢占CPU。

    解决问题 :定位 CPU 争抢、CPU Throttling 或宿主机负载过高导致的调度滞后。

  • 内存分配抖动:进程申请内存时,由于直接回收或内存碎片整理导致的阻塞时间。

    解决问题 :发现隐形的内存压力,即使看起来内存没用满,分配内存也可能很慢。

  • 网络/IO 抖动:TCP 连接建立耗时、块设备 I/O 等待时间。

    解决问题 :定位网络丢包重传或磁盘慢 I/O 引起的业务卡顿。

三、 实战教学:如何在 OpenCloudOS 中使用 SLI

目前OpenCloudOS8(内核5.4)、OpenCloudOS9(内核6.6)及它们各自对应的企业版TencentOS3、TencentOS4中都已具备SLI能力,相关代码也已在其内核仓库中开源。代码详情请至文末查看。

3.1 SLI启动接口

默认情况下,为了极致性能,SLI 功能是关闭的。你需要先在系统层面开启监控总开关:

复制代码
# 启动SLI CPU/内存功能(默认为关闭)echo 1 > /proc/sli/sli_enabled
# 开启SLI IO功能(默认为关闭),该开关与上面的sli_enabled开关没有关联echo 1 > /proc/sli/sli_io_enabled
# cgroup下启用mbuf功能echo 1 > /proc/sys/kernel/qos_mbuf_enable注:当前sysctl_qos_mbuf_enable使能后创建的cgroup才能使用mbuf功能
复制代码
3.2 观测直方图

如果想要知道某个容器到底有没有发生抖动?直接进入它的 cgroup 目录,读取对应的 .sli 文件,内核会以直方图的形式清晰展现延迟的分布情况。直方图用于展示不同事件耗时分布信息,包括CPU、内存以及IO。

Cgroup v1/v2下,在各个Cgroup子系统中,非root Cgroup下存在如下文件,用于导出对应子系统中不同事件耗时信息的直方图分布:

cgroupv1下,对应文件如下:

  • cpuacct.sli - 对应 CPU 事件

  • memory.sli - 对应内存事件

  • blkio.sli - 对应 IO 事件

cgroupv2下,对应文件如下:

  • sli.cpu - 对应 CPU 事件

  • sli.memory - 对应内存事件

  • sli.io - 对应 IO 事件

在使能 sli_enabled 后,CPU 和内存直方图功能开始生效,使能 sli_io_enabled 后,IO直方图功能生效。

3.2.1 CPU直方图观测

复制代码
复制代码
# 1. 进入 Cgroup 目录并创建测试组# 注意:如果是 Cgroup v2 环境,路径请改为 cd /sys/fs/cgroupcd /sys/fs/cgroup/cpuacctmkdir testcd test
echo $$ > ${path}cgroup.procs
# 2. 启动两个死循环进程,并强制绑定在同一个 CPU 核心(核心 1)上# 这会人为制造严重的 CPU 调度争抢taskset -c 1 bash -c "echo \$\$ > cgroup.procs; while true; do true; done" &taskset -c 1 bash -c "echo \$\$ > cgroup.procs; while true; do true; done" &
# 3. 等待几秒钟让内核记录排队卡顿的数据sleep 5
# 4. 查看 SLI 记录的 CPU 调度延迟直方图# 注意:如果是 Cgroup v2 环境,文件名请改为 cat sli.cpucat cpuacct.sli | grep 'schedlat_rundelay' -A 8

执行完上述操作后,可以看到CPU分配延迟直方图,例如:

3.2.2 内存直方图观测

可通过如下步骤观察内存回收事件耗时:

复制代码
复制代码
# 1.进入内存 Cgroup 目录并创建测试组# 注意:如果是 Cgroup v2 环境,路径请改为 cd /sys/fs/cgroupcd /sys/fs/cgroup/memory mkdir testcd test
# 2. 限制内存并加入当前进程# 注意:如果是 Cgroup v2 环境,请将 memory.limit_in_bytes 改为 memory.maxecho $((1024*1024*1024))  > memory.limit_in_bytes echo $$ > cgroup.procs 
# 3. 启动压测工具stress-ng --vm 4 --vm-bytes 75% --vm-keep &
# 4. 查看 SLI 记录的内存抖动直方图# 注意:如果是 Cgroup v2 环境,文件名请改为 cat sli.memorycat memory.sli

执行完上述操作后,你就可以直接通过读取文件,看到内核为你统计的内存分配延迟直方图 ,例如:

3.2.3 IO直方图观测
同样,可以通过将任务加入blkcg中,查看对应blkcg中IO相关事件耗时:
复制代码
复制代码
# 1. 进入 IO Cgroup 目录并创建测试组# 注意:如果是 Cgroup v2 环境,路径请改为 cd /sys/fs/cgroup,echo +io > cgroup.subtree_control启用io子系统cd /sys/fs/cgroup/blkiomkdir testcd test
# 2. 将当前进程加入该组echo $$ > cgroup.procs
# 3. 制造 IO 压力dd if=/dev/zero of=/tmp/t1 bs=1M count=1024oflag=direct
# 4. 查看 SLI 记录的 IO 延迟直方图# 注意:如果是 Cgroup v2 环境,文件名请改为 cat sli.iocat blkio.sli

执行完上述操作后,你就可以看到IO延迟直方图 ,例如:

3.3 阈值监控

同时,SLI提供了阈值监控功能,当CPU、内存、IO对应事件延迟超过阈值后,会触发事件告警功能。延迟信息可通过Monitor机制主动通知业务,或者通过mbuf打印到日志中。

Cgroupv1下,阈值设置对应各个Cgroup子系统下的sli.control文件,CPU、内存以及IO 子系统中包括如下监控事件:

● cpuacct.sli.control

period: 0

mbuf_enable: 0

schedlat_wait: threshold: 0, count: 0

schedlat_block: threshold: 0, count: 0

schedlat_ioblock: threshold: 0, count: 0

schedlat_sleep: threshold: 0, count: 0

schedlat_longsys: threshold: 0, count: 0

schedlat_rundelay: threshold: 0, count: 0

schedlat_irqtime: threshold: 0, count: 0

longterm_rundelay: threshold: 0

longterm_irqtime: threshold: 0
● memory.sli.control

period: 0

mbuf_enable: 0

memlat_global_direct_reclaim: threshold: 0, count: 0

memlat_memcg_direct_reclaim: threshold: 0, count: 0

memlat_direct_compact: threshold: 0, count: 0

memlat_global_direct_swapout: threshold: 0, count: 0

memlat_memcg_direct_swapout: threshold: 0, count: 0

memlat_direct_swapin: threshold: 0, count: 0
● blkio.sli.control

period: 0

mbuf_enable: 0

iolat_delay: threshold: 0, count: 0

Cgroupv2下,对应配置文件为sli.control,包含cpu、内存以及io事件

period: 0

mbuf_enable: 0

schedlat_wait: threshold: 0, count: 0

schedlat_block: threshold: 0, count: 0

schedlat_ioblock: threshold: 0, count: 0

schedlat_sleep: threshold: 0, count: 0

schedlat_longsys: threshold: 0, count: 0

schedlat_rundelay: threshold: 0, count: 0

schedlat_irqtime: threshold: 0, count: 0
memlat_global_direct_reclaim: threshold: 0, count: 0

memlat_memcg_direct_reclaim: threshold: 0, count: 0

memlat_direct_compact: threshold: 0, count: 0

memlat_global_direct_swapout: threshold: 0, count: 0

memlat_memcg_direct_swapout: threshold: 0, count: 0

memlat_direct_swapin: threshold: 0, count: 0

longterm_rundelay: threshold: 0

longterm_irqtime: threshold: 0

iolat_delay: threshold: 0, count: 0

其中,period为监控周期,单位为jiffies,表示在该监控周期内,对应事件延迟超过threshold count次后,将触发对应事件告警,其中threshhold的单位为us。

阈值设置步骤如下:

复制代码
sysctl -w kernel.sched_schedstats=1echo 1 > /proc/sli/sli_enabled echo 1 > /proc/sys/kernel/qos_mbuf_enablecgroup v1下:echo mbuf_enable=1 > /sys/fs/cgroup/cpuacct/cpuacct.sli.controlmkdir /sys/fs/cgroup/cpuacct/testcd /sys/fs/cgroup/cpuacct/testecho schedlat_sleep_threshold=10,count=1 > cpuacct.sli.controlecho period=8 > cpuacct.sli.controlecho $$ > cgroup.procssleep 1cat cpuacct.mbuf cgroup v2下:cd /sys/fs/cgroupecho mbuf_enable=1 > sli.controlmkdir test cd testecho period=10 > sli.controlecho schedlat_sleep_threshold=10,count=1 > sli.controlecho $$ > cgroup.procssleep 1cat mbuf
复制代码

执行sleep1后查看mbuf,其中输出内容包含sleep超过10us的事件,例如:

四、 欢迎参与共创

从"摸黑排查"到"微秒级精准捕获",云原生 SLI 只是 OpenCloudOS 众多内核黑科技的冰山一角。

如果你在业务抖动排查上曾踩过无数"坑",或者你对 eBPF、内核可观测性技术充满热情,我们诚挚地邀请你体验 OpenCloudOS SLI能力,并参与社区贡献和反馈。

你可以通过如下方式参与贡献:

  • 在体验、测试过程中,发现功能缺失、发现bug,在下面仓库中给我们提Issue(bug反馈、需求建议均可);

  • 分享你的排查案例;

  • 或基于我们做二次开发,无论是功能模块补充开发亦或其他。

项目所在代码仓:

OpenCloudOS Kernel:https://gitee.com/OpenCloudOS/OpenCloudOS-Kernel

SLI Monitor项目相关PR:https://gitee.com/OpenCloudOS/OpenCloudOS-Kernel/pulls/618


OpenCloudOS 开源社区是由操作系统、云平台、软硬件厂商与个人携手打造中立开放、安全稳定且高性能的 Linux 操作系统及生态。目前已实现从源社区、商业版、到社区稳定版全链路覆盖,旨在输出经海量业务验证的企业级稳定操作系统版本,为行业解决国产操作系统上下游供应问题,促进基础软件可持续发展。

点击下方图片,了解加入社区权益与方式↓

技术干货 · 目录

上一篇OpenCloudOS + GLM-5 全流程部署实战下一篇日处理700万条告警的智能管家, OCManager 正式开源

阅读 309

云原生 SLI