在云原生深水区偶发性的容器抖动往往是 SRE 难以捕捉的“幽灵”。传统的 top / free 等工具只能看到秒级平均值却无法捕捉毫秒级的长尾延迟。近期OpenCloudOS 引入了云原生 SLIService 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 testecho $$ ${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/memorymkdir testcd test# 2. 限制内存并加入当前进程# 注意如果是 Cgroup v2 环境请将 memory.limit_in_bytes 改为 memory.maxecho $((1024*1024*1024)) memory.limit_in_bytesecho $$ 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 bs1M count1024oflagdirect# 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.controlperiod: 0mbuf_enable: 0schedlat_wait: threshold: 0, count: 0schedlat_block: threshold: 0, count: 0schedlat_ioblock: threshold: 0, count: 0schedlat_sleep: threshold: 0, count: 0schedlat_longsys: threshold: 0, count: 0schedlat_rundelay: threshold: 0, count: 0schedlat_irqtime: threshold: 0, count: 0longterm_rundelay: threshold: 0longterm_irqtime: threshold: 0● memory.sli.controlperiod: 0mbuf_enable: 0memlat_global_direct_reclaim: threshold: 0, count: 0memlat_memcg_direct_reclaim: threshold: 0, count: 0memlat_direct_compact: threshold: 0, count: 0memlat_global_direct_swapout: threshold: 0, count: 0memlat_memcg_direct_swapout: threshold: 0, count: 0memlat_direct_swapin: threshold: 0, count: 0● blkio.sli.controlperiod: 0mbuf_enable: 0iolat_delay: threshold: 0, count: 0Cgroupv2下对应配置文件为sli.control包含cpu、内存以及io事件period: 0mbuf_enable: 0schedlat_wait: threshold: 0, count: 0schedlat_block: threshold: 0, count: 0schedlat_ioblock: threshold: 0, count: 0schedlat_sleep: threshold: 0, count: 0schedlat_longsys: threshold: 0, count: 0schedlat_rundelay: threshold: 0, count: 0schedlat_irqtime: threshold: 0, count: 0memlat_global_direct_reclaim: threshold: 0, count: 0memlat_memcg_direct_reclaim: threshold: 0, count: 0memlat_direct_compact: threshold: 0, count: 0memlat_global_direct_swapout: threshold: 0, count: 0memlat_memcg_direct_swapout: threshold: 0, count: 0memlat_direct_swapin: threshold: 0, count: 0longterm_rundelay: threshold: 0longterm_irqtime: threshold: 0iolat_delay: threshold: 0, count: 0其中period为监控周期单位为jiffies表示在该监控周期内对应事件延迟超过threshold count次后将触发对应事件告警其中threshhold的单位为us。阈值设置步骤如下sysctl -w kernel.sched_schedstats1echo 1 /proc/sli/sli_enabledecho 1 /proc/sys/kernel/qos_mbuf_enablecgroup v1下echo mbuf_enable1 /sys/fs/cgroup/cpuacct/cpuacct.sli.controlmkdir /sys/fs/cgroup/cpuacct/testcd /sys/fs/cgroup/cpuacct/testecho schedlat_sleep_threshold10,count1 cpuacct.sli.controlecho period8 cpuacct.sli.controlecho $$ cgroup.procssleep 1cat cpuacct.mbufcgroup v2下cd /sys/fs/cgroupecho mbuf_enable1 sli.controlmkdir testcd testecho period10 sli.controlecho schedlat_sleep_threshold10,count1 sli.controlecho $$ cgroup.procssleep 1cat mbuf执行sleep1后查看mbuf其中输出内容包含sleep超过10us的事件例如四、 欢迎参与共创从“摸黑排查”到“微秒级精准捕获”云原生 SLI 只是 OpenCloudOS 众多内核黑科技的冰山一角。如果你在业务抖动排查上曾踩过无数“坑”或者你对 eBPF、内核可观测性技术充满热情我们诚挚地邀请你体验 OpenCloudOS SLI能力并参与社区贡献和反馈。你可以通过如下方式参与贡献在体验、测试过程中发现功能缺失、发现bug在下面仓库中给我们提Issuebug反馈、需求建议均可分享你的排查案例或基于我们做二次开发无论是功能模块补充开发亦或其他。项目所在代码仓OpenCloudOS Kernelhttps://gitee.com/OpenCloudOS/OpenCloudOS-KernelSLI Monitor项目相关PRhttps://gitee.com/OpenCloudOS/OpenCloudOS-Kernel/pulls/618OpenCloudOS 开源社区是由操作系统、云平台、软硬件厂商与个人携手打造中立开放、安全稳定且高性能的 Linux 操作系统及生态。目前已实现从源社区、商业版、到社区稳定版全链路覆盖旨在输出经海量业务验证的企业级稳定操作系统版本为行业解决国产操作系统上下游供应问题促进基础软件可持续发展。点击下方图片了解加入社区权益与方式↓技术干货 · 目录上一篇OpenCloudOS GLM-5 全流程部署实战下一篇日处理700万条告警的智能管家 OCManager 正式开源阅读 309云原生 SLI​