一种动态实现核隔离的方法
本文分享自天翼云开发者社区《一种动态实现核隔离的方法》,作者:y****n
一、技术背景
相关概念:
核隔离:指定的 cpu 核心只参与最低限度的 OS 内核计算;
DPDK(Date planedevelopment kit):是一个用来进行包数据处理加速的软件库。
Cpu 亲和性:进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性。
背景:
网元节点上,对 cpu 消耗比较多的进程可以分为几个类别:
1、系统运行相关进程(通过 systemd 启动和管理的进程以及内核线程)
2、网元相关进程(比如 dpos、gobgpd 进程)。
然而在现网中发现,由于系统运行相关进程与网元相关进程在同内核下运行时,会概率性的抢占 pmd 线程的 cpu,从而导致 dpdk 丢包,影响网元性能。一般使用的隔离系统进程方法如修改 grub 文件、tuned 调优方式都需要重启才能生效,对于已经部署到现网的网元而言,这些方式会对用户业务造成极大的影响。
因此,需要寻求一种核隔离方法,使得系统进程和网元进程互相隔离,互不影响,以解决网元设备在系统进程抢占业务进程 cpu 内核时可能出现的网络延时变高,丢包等问题,提高网络通信的性能和可靠性。并且对于现网上运行的网元节点能够做到无感知。
二、方案设计及实现
本方案主要是隔离 systemd 启动和管理的进程的 cpu 核,限制其运行在网元进程的预留核上。
1、确定 cpu 预留核分配策略
根据系统规格的不同,确定不同的 cpu 内核分配策略。如 1Numa8Cores 的系统,可将系统进程分配到 0-2 核上;或者 2Numa96Cores 的系统。可将系统进程分配到 numa0 的前 3 个 cpu 核以及 numa1 的后 3 个 cpu 核上,其余的内核为网元进程所占用。分配策略需按照服务器规格以及实际需求进行设计。
2、设置 systemd 进程亲和性
通过修改/etc/systemd/system.conf 文件中的 CPUAffinity 中的值,将其改为第一步中的预留核数,如 0-2。
通过 systemd
3、设置 systemd 子进程亲和性
对于 systemd 启动和创建的进程主要分为几类:
1、正在运行的 systemd 子进程
2、后续由 systemd 创建或者重启的子进程
对于后续需要由 systemd 创建的进程或者重启的进程,其 cpu 亲和性会自动与 systemd 保持一致,因此只需要考虑正在运行的 systemd 子进程的核隔离。对此,采用 taskset -cp cpus pid 的方式进行设置。taskset 是 linux 操作系统中的一个命令,它可以对进程进行 CPU 亲和性设置,即让进程在指定的 CPU 核心或者 CPU 核心集合上运行。
通过 cgroup 和 taskset 两种方式的结合,可以实现在现网运行过程中,动态的对系统相关的进程(尤其是 systemd 启动和管理的进程)进行核隔离的目的。
评论