一种动态实现核隔离的方法

本文分享自天翼云开发者社区《一种动态实现核隔离的方法》,作者: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启动和管理的进程)进行核隔离的目的。

点赞
收藏

评论区

加载中...

相关推荐

TIDB集群安装部署方案————————上篇

1.   安装TIDB生成环境硬件要求组件CPU内存硬盘类型网络数量(最低要求)TiDB16核48GBSAS万兆网卡(2块最佳)2PD8核16GBSSD万兆网卡(2

CPU核数怎么计算?

物理cpu数主板上实际插入的cpu数量,可以数不重复的physicalid有几个(physicalid)Linuxcat/proc/cpuinfo|grep"physicalid"|sort|uniq|wclcpu核数单块CPU上面能处理数据的芯片组的数量,

Python实现多进程

Python可以实现多线程,但是因为GlobalInterpreterLock(GIL),Python的多线程只能使用一个CPU内核,即一个时间只有一个线程在运行,多线程只是不同线程之间的切换,对多核CPU来说,就是巨大的浪费。如4核CPU,实际上只利用了一个核,CPU利用率只有25%。要充分利用多核CPU,可以实现Python的多进程。首先,im

Linux系统性能检测常用命令

查看CPU数量总核数物理CPU个数X每颗物理CPU的核数总逻辑CPU数物理CPU个数X每颗物理CPU的核数X超线程数查看物理CPU个数:cat/proc/cpuinfo|grep"physicalid"|sort|uniq|wcl

Linux日常运维小结

1\.如何看当前Linux系统有几颗物理CPU和每颗CPU的核数?物理cpu个数:cat/proc/cpuinfo|grepc'physicalid'CPU一共有多少核:grepcprocessor/proc/cpuinfo将CPU的总核数除以物理CPU的个数,得到每颗CPU的核数。2\.查看系统负载有两个常用的命

Nginx 作为web server 的优化要点

常用优化要点nginx使用的是固定数量的workers,每个worker都处理进入的请求。最佳实践是每个CPU内核配置一个worker.如何知道您的系统有几个CPU?$ grep ^processor /proc/cpuinfo | wc l对于一个四核处理器,配置文件类似:\Oneworkerper