简介: io_uring 作为一种新型高性能异步编程框架,代表着 Linux 内核未来的方向,当前仍处于快速发展中。阿里云联合 InfoQ 发起《io_uring 介绍及应用实践》的技术公开课,围绕 OpenAnolis 龙蜥社区 Anolis OS 8 全方位解析高性能存储场景。
写在前面
cgroup 作为容器底层技术的半壁江山,很多文章已经介绍并总结得很好了,关于 cgroup 是什么、有什么用以及一些相关概念,这些内容并不是本文的重点所以也将不再赘述。
友情提醒:以下内容默认读者已经初步了解 task、cgroup、subsys、hierarchy 是什么及它们之间的关系。
我们为啥关注 cgroup 控制平面性能?
云原生目前是云计算领域的重点发展方向,其中的函数计算场景中,函数执行的速度是重要的性能指标,要求能够快速、高并发地创建和销毁实例。在此场景下的隔离特性普遍都会涉及到大量 cgroup 的相关操作,而现有的cgroup框架设计并发性很差,或许在设计之初并未考虑到大规模的控制平面操作(例如:创建和销毁)。而随着技术的演进,大规模的控制平面操作场景逐渐增多,也促使我们开始更加关注控制平面的性能。
本文的阐述是基于4.19版本的内核源代码,旨在分析cgroup提供给用户的接口背后的实现原理,并基于实现原理给出一些用户态使用cgroup的建议,最后在文章的结尾分享了一些内核态优化的思路。
原理分析
图一
图二
以上两张图,是4.19版本的内核中cgroup中最主要的几个数据结构之间的连接关系和cgroup层次结构的连接关系。
cgroup:字面意思
cgroup_root:hierarchy
cgroup_subsys: 子系统,缩写的变量一般为ss
cgroup_subsys_state: 当指向某个subsys时,代表该subsys在某个cgroup中一个实体
css_set、cset_cgrp_link:用于建立task_struct和cgroup之间多对多的关系
这些数据结构抽象之后是这张图:
图三
其实也很好理解,本质上cgroup框架要解决的是:一个cgroup管哪些task,一个task归哪些cgroup管的问题,在实现上可通过cset作为中介来建立这层关系。相比于task和cgroup直连,这种