共计 3943 个字符,预计需要花费 10 分钟才能阅读完成。
导读:OpenCloudOS 社区是由操作系统、软硬件厂商与集体独特倡导发动的操作系统社区我的项目,提供自主可控、绿色节能、安全可靠、高性能的下一代云原生操作系统,与生态搭档一起打造中立的操作系统开源生态。作为社区重要的技术方向,OpenCloudOS 社区的云原生操作系统自研了一系列的云原生个性,本文次要介绍 CgroupFS 和 SLI。
一、CgroupFS 个性
1、计划背景
容器的隔离次要是依赖 Linux 操作系统的 Namespace 和 Cgroup,与依赖硬件辅助虚拟化的虚拟机隔离不同,前者存在不少隔离破绽。随着云原生场景的大规模应用,大量利用的容器化暴露出了容器隔离性问题。
特地是 /proc、/sys 文件系统中的一些资源统计信息,还没有齐全的容器化,导致在物理机 / 虚拟机中的一些常用命令(比方 free/top)在容器中运行时,不能精确展现容器视角的信息,而是展现零碎级别的全局信息。对于依赖这些零碎信息运行的容器化利用,可能导致谬误的运行后果甚至无奈运行。
2、计划摸索
业界目前广泛采纳 lxcfs 的计划解决容器隔离破绽问题。然而 lxcfs 计划有其固有的缺点:
1)须要依赖额定的组件 lxcfs;
2)lxcfs 在用户态基于 FUSE 实现,开销相比内核更大;
3)lxcfs 稳定性比拟差,可能在容器的生命周期状态切换时触发 hang、信息获取不到等问题。
每个 container 都须要对应一个 lxcfs 服务过程
3、计划实现
CgroupFS 计划基于内核态实现,其外围设计为,设计一个新的虚构文件系统,其中蕴含须要实现的容器视角的 /proc、/sys 等 fs,其目录构造放弃与全局 procfs 和 sysfs 统一,以保障对于用户工具的兼容性。理论读取相干文件时,通过 CgroupFS 的读者过程的上下文来动静生成对应的容器信息视图。以下内容基于 OpenCloudOS LTS 分支:
https://github.com/OpenCloudOS/OpenCloudOS-Kernel/commits/lts/5.4.119-20.0009
4、计划实现成果
1)创立挂载点目录 /cgroupfs 挂载 cgroupfs:
mount -t cgroupfs cgroupfs /cgroupfs/
2)容器启动命令如下:
docker run -itd --cpus 2 --cpuset-cpus 2,4 --memory="512m" --memory-swap="1g"
-v /cgroupfs/sys/devices/system/cpu/:/sys/devices/system/cpu
-v /cgroupfs/proc/cpuinfo:/proc/cpuinfo
-v /cgroupfs/proc/stat:/proc/stat
-v /cgroupfs/proc/meminfo:/proc/meminfo
image-id /bin/bash
容器启动后,会将 cgroupfs 下的文件 bind mount 到容器中对应地位。
3)运行实例
开启 CgroupFS 后,在容器中执行常用命令的成果:(容器规格:2 CPU,限定可用内存 512M,可用内存和可用 swap 总计 1G)容器内 proc 文件系统下显示 CPU 信息:
容器内 free 命令显示内存信息:
容器内 top 命令显示 CPU 个数信息::
容器内 nproc 显示 CPU 总数信息
二、SLI 个性
1、计划背景
在云原生场景大量利用运行都在容器化。但在高资源利用率场景下,容器也会存在问题。例如:容器间的相互烦扰,容器资源限度引起的性能抖动等问题。目前 Linux 的零碎性能指标,要么是基于过程级别的统计数据,要么就是基于全局的统计数据,这些都无奈直观、无效的反馈容器级别的性能问题。
OpenCloudOS 社区中的容器级别的性能跟踪机制——SLI,从容器的角度对 CPU、内存资源的竞争状况进行跟踪、观测,从而为容器性能问题的定位、剖析提供牢靠的指标。
2、计划摸索
SLI 计划抉择 | 长处 | 毛病 |
---|---|---|
内核原生实现 | 1、在内核里实现,跟踪开销最小,性能最优。2、能够调用内核所有接口,性能开发不会被制约。 | 1、扩展性较差。2、开发、部署周期较长(波及到内核降级或者热补丁替换) |
eBPF | 1、扩展性较好,能够依据须要动静的批改 eBPF 代码。2、开发、部署周期短,开发难度绝对简略 | 1、eBPF 代码有较多安全检查,这会引入较大的开销,从而导致跟踪性能开销较大。2、eBPF 对调用接口有严格的限度,导致很多内核接口函数无奈调用,会重大制约性能开发。 |
SLI 是一个常态化性能跟踪机制,须要对很多内核热点函数进行跟踪,这就要求 SLI 的实现必须是低开销的。此外,SLI 会应用很多内核外围函数,这些函数都无奈被 eBPF 调用到。所以通过衡量,咱们决定在内核里实现 SLI 机制,从而实现跟踪性能开销的最小化。
mbuf 个性
容器场景下,各个容器是互相独立的应用程序。因为不同容器在运行过程中,各自的资源应用状况、运行状况都不同,须要有一个独立的中央记录不同容器内核层面的异样日志信息,下层利用能够依据日志信息,间接定位到对应容器,从而进行正当的调度等操作;mbuf 就应运而生。事实上,mbuf 不仅仅能够利用在容器环境里,内核其余模块也能够依据本人的需要依照 mbuf 标准进行应用;
mbuf 的实现
1)内核启动时申请预留一段内存,该内存在搭档零碎之外。
2)设置反对最大的 items 数量;每个 item 是 mbuf 的应用单位,其自身会保护一个 ring 作为 ring buffer,确保循环应用而不会溢出。
3、计划实现
SLI 个性 | 个性形容 |
---|---|
用户态周期性采集 | SLI 通过 Cgroup 接口提供容器的性能数据,用户态能够通过这些数据对容器性能进行监控。 |
mbuf 问题定位 | SLI 能够将问题产生时的内核栈信息打印到 mbuf 内存里,从而帮忙用户定位性能问题的起因。 |
计划监控指标
监控指标 | 指标形容 | 指标意义 |
---|---|---|
容器内负载状况监控 | 容器内处于 R/D 态的过程均匀数量(别离是 1min、5min、15min 的容器均匀负载) | R 过程数量指标:评估容器内过程数量是否 overloadD 过程数量指标:D 状态过程的数量能够反馈 IO 期待以及锁竞争等的状况 |
过程在内核态执行工夫 | 监控容器过程在内核态的执行工夫。 | 内核态工夫可能是因为零碎调用、中断或者缺页异样等起因引起的。内核态的执行工夫过长,会导致用户业务有较大提早,从而引起性能抖动问题。 |
调度提早 | 监控容器过程的调度提早信息(容器过程在调度队列上的等待时间) | 反馈容器的 CPU 竞争状况,过大的调度提早会导致业务呈现性能抖动。 |
iowait 提早 | 监控容器过程的 IO 期待提早信息(过程 IO 实现而引起的延迟时间) | 反馈容器过程的 IO 性能问题,过大的 IO 提早会让业务文件拜访产生性能问题 |
内存提早 | 监控容器过程的内存申请提早信息 | 反馈容器的内存申请性能状况,过大的内存申请提早会导致业务呈现性能抖动。 |
4、计划成果
1)开启 SLI 的形式:
echo 1> /proc/sli/sli_enabled
2)用户态周期性采集应用形式
监控指标 | 拜访形式 |
---|---|
容器内负载状况监控 | /sys/fs/cgroup/cpuset/<Pod A>/cpuset.loadavg |
过程在内核态执行工夫 | /sys/fs/cgroup/cpuacct/<Pod A>/cpuacct.sli 对应其中的 schedlat_longsys 项 |
调度提早 | /sys/fs/cgroup/cpuacct/<Pod A>/cpuacct.sli 对应其中的 schedlat_rundelay 项 |
iowait 提早 | /sys/fs/cgroup/cpuacct/<Pod A>/cpuacct.sli 对应其中的 schedlat_ioblock 项 |
内存提早 | /sys/fs/cgroup/memory/<Pod A>/memory.sli |
3)mbuf 问题定位数据采集形式
须要首先使能 mbuf:
echo 1 > /proc/sys/kernel/qos_mbuf_enable
触发堆栈保留到 mbuf 的阈值设置
监控指标 | 阈值设置 |
---|---|
过程在内核态执行工夫 | 提早阈值设置文件:/proc/sli/sched_latency_threshold 例如:echo “schedlat_longsys_thr=4” > /proc/sli/sched_latency_threshold |
调度提早 | 提早阈值设置文件:/proc/sli/sched_latency_threshold 例如:echo “schedlat_rundelay_thr=24” > /proc/sli/sched_latency_threshold |
iowait 提早 | 提早阈值设置文件:/proc/sli/sched_latency_threshold 例如:echo “schedlat_ioblock_thr=16” > /proc/sli/sched_latency_threshold |
内存提早 | 内存提早阈值设置文件:/proc/sli/memory_latency_threshold 例如:echo “page_alloc_threshold=24” > /proc/sli/memory_latency_threshold |
获取 mbuf 中的堆栈信息:
cat /sys/fs/cgroup/cpuacct/<Pod A>/cpuacct.mbuf
4)SLI 利用实例
下图是应用 SLI 监控 redis 容器内存烦扰采集的数据。
从测试数据来看,每次间接回收的延时,都会对应一次 redis 的抖动。
三、小结
通过 OpenCloudOS 容器引擎内核撑持技术的全景图,能够看到 CgroupFS 和 SLI 都是重要的模块。
欢送扫描下方二维码,退出社区用户群,理解 OpenCloudOS 最新动静,获取技术相干的反对,分享交换应用体验。