NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

CPU 隔离:实践

  • 2022-04-06
  • 本文字数:3140 字

    阅读完需:约 10 分钟

CPU 隔离:实践

SUSE Labs 团队探索了 Kernel CPU 隔离及其核心组件之一:Full Dynticks(或 Nohz Full),并撰写了本系列文章:

 

1. CPU 隔离 – 简介

2. CPU 隔离 – Full Dynticks 深探

3. CPU 隔离 – Nohz_full

4. CPU 隔离 – 管理和权衡

5. CPU 隔离 – 实践

 

本文是第五篇。

 

我们通过前面四篇文章初步掌握了理论概念,现在终于到了实践阶段。本实践操作共配置了 8 个 CPU,将以完全隔离的方式在第 8 个 CPU 上运行一个无意义的用户空间循环,即:不受任何干扰。

内核配置要求


如果您运行的是 SUSE Linux Enterprise Server 15 SP3 (https://documentation.suse.com/sles/15-SP3/) 或更高版本,则无需担心这一问题;否则,一定要保证:

CONFIG_NO_HZ_FULL=y

CONFIG_CPUSETS=y

CONFIG_TRACING=y

 

第一条为在运行一个任务时停止 Tick 提供支持。第二条使任务绑定设置更容易。第三个选项支持对 CPU 隔离进行调试的跟踪能力。

引导要求


使用“nohz_full=” 引导参数,可以在运行单个任务时关闭计时器 Tick,并且大多数非内核负载也会迁移到隔离范围之外的 CPU。由于计划隔离第 8 个 CPU,我们需要通过以下信息引导内核:

nohz_full=7

 

CPU 编号从 0 开始,所以第 8 个 CPU 的编号为 7。此外,无需设置“rcu_nocbs=” 引导参数,如示例中通常显示的那样,nohz_full 可自动调节该参数。

任务绑定


有多种方法可以在隔离的任务和系统其余部分之间划分 CPU,首选方法是使用 cpuset (https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cpusets.html)。对于有特殊需求的人,还有其他解决方案可用。


Cpuset


一旦内核启动,为了确保无关任务不会干扰 CPU 7,我们创建两个 cpusets 分区。名为“isolation” 的目录包含我们隔离的 CPU,它将来会运行隔离任务。另一个名为“housekeeping” 的目录承担常规负载。我们强制禁用“isolation” 分区的负载平衡,以确保任何任务都不能迁移进/出 CPU 7,除非手工移动。

 

在本例中,我们在 SUSE Linux Enterprise Server 15 SP3 上使用默认的 cpuset 挂载点(https://documentation.suse.com/sles/15-SP3/)


cd /sys/fs/cgroup/cpuset

mkdir housekeeping

mkdir isolated

echo 0-6 > housekeeping/cpuset.cpus

echo 0 > housekeeping/cpuset.mems

echo 7 > isolated/cpuset.cpus

echo 0 > isolated/cpuset.memse

cho 0 > cpuset.sched_load_balance

echo 0 > isolated/cpuset.sched_load_balance

while read P

do 

echo $P > housekeeping/cgroup.procs

done < cgroup.procs


对 housekeeping/cgroup.procs 的一些写入操作可能会失败,因为内核线程 pid 无法移出根 cpuset 分区。然而,未绑定的内核线程会自动强制绑定 nohz_full 范围之外的 CPU,因此可以安全地忽略这些故障。


Isolcpus


您还可以使用“isolcpus=” (https://www.suse.com/support/kb/doc/?id=000017747) 内核引导参数实现与以上 cpuset 设置相同的设置。但我们不建议使用这种解决方案,因为以后无法在运行时更改隔离配置。因此,尽管“isolcpus” 仍在使用,但一般“不推荐”。对于尚未支持 cpusets/cgroups 的专用或嵌入式内核,它可能仍然可用。


Taskset, sched_setaffinity(), …


从底层来讲,还可以使用 taskset(https://man7.org/linux/man-pages/man1/taskset.1.html) 等工具或者依赖 sched_setaffinity() (https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html) 这样的 API,将每个任务绑定到所需的 CPU 集合。在不支持 cpuset 的系统中,其优点是允许在运行时更改绑定关系,这与“isolcpus” 不同;缺点是它需要更精细的工作。

IRQ 绑定


我们已经进行了任务绑定,但是硬件中断仍然可以在隔离的 CPU 上触发,并干扰其独占负载。所幸,我们可以通过 procfs (https://www.kernel.org/doc/html/latest/core-api/irq/irq-affinity.html)提供的接口安排在内务管理集上触发这些中断:


# Migrate irqs to CPU 0-6 (exclude CPU 7)

for I in $(ls /proc/irq)

do   

if [[ -d "/proc/irq/$I" ]]   

then       

echo "Affining vector $I to CPUs 0-6"

echo 0-6 > /proc/irq/$I/smp_affinity_list

fi

done


您可能会在其中一个中断向量上遇到 I/O 错误,例如 x86-64 机器上的数字 0,因为这是每个 CPU 上的计时器向量表,由于其本地性的特质,无法将其移开。然而,这个问题大可放心忽略,因为“nohz_full” 就是专门为解决这个问题而设计的。

防止其他干扰


在本例中,我们处理的是基于调度程序和中断的直接干扰。更高阶的话题将在后续文章中介绍,例如防止页面错误等异常(https://man7.org/linux/man-pages/man2/mlock.2.html)

实际测试


现在,大部分内务管理工作负载应在 CPU 0-6 上运行。CPU 7 将在无干扰的情况下运行用户空间代码。我们用启动器做一个无意义的循环。


虚拟用户空间循环


以下代码将当前任务绑定到隔离的 cpuset(即 cpu7),并始终执行一个死循环。它在启动并运行 10 秒后,最终被单独的启动器启关闭。


#include <stdio.h>

#include <fcntl.h>

#include <unistd.h>

#include <errno.h>

int main(void)

{   

// Move the current task to the isolated cgroup (bind to CPU 7)   

int fd = open("/sys/fs/cgroup/cpuset/isolated/cgroup.procs", O_WRONLY);

    if (fd < 0) {

        perror("Can't open cpuset file...\n");

        return 0;

    }

    write(fd, "0\n", 2);

  close(fd);

   // Run an endless dummy loop until the launcher kills us

    while (1)

        ;

       return 0;

}


将该代码包写在名为“user_loop.c” 的文件中,并编译:

 

$ gcc user_loop.c -o user_loop


启动器


除了在隔离的 CPU 7 上运行无意义的循环 10 秒之外,启动器的作用是跟踪可能对敏感工作负载有潜在干扰的事件。在本例中,我们使用 SUSE Linux Enterprise Server 15 SP3 上默认的跟踪 debugfs 装载点:


TRACING=/sys/kernel/debug/tracing/

# Make sure tracing is off for now

echo 0 > $TRACING/tracing_on

# Flush previous traces

echo > $TRACING/trace

# Record disturbance from other tasks

echo 1 > $TRACING/events/sched/sched_switch/enable

# Record disturbance from interrupts

echo 1 > $TRACING/events/irq_vectors/enable

# Now we can start tracingecho 1 > $TRACING/tracing_on

# Run the dummy user_loop for 10 seconds on CPU 7

./user_loop &

USER_LOOP_PID=$!

sleep 10

kill $USER_LOOP_PID

# Disable tracing and save traces from CPU 7 in a file

echo 0 > $TRACING/tracing_on

cat $TRACING/per_cpu/cpu7/trace > trace.7


这里跟踪到两个有意思的底层事件:


  • 调度程序上下文切换:报告任何抢占“user_loop” 的任务。这包括工作队列和内核线程。

  • IRQ 向量:报告任何(大多数)中断“user_loop” 的 IRQ,这包括计时器中断。

 

上述代码可以写入名为“launch” 的文件中,该文件与“user_loop” 位于相同的目录中。

完美世界的理想结果


在以 root 身份运行上述“launch” 之后,如果一切顺利,可以在“trace.7” 文件中找到以下内容:

 

<idle>-0 [007] d..2. 1980.976624: sched_switch: prev_comm=swapper/7 prev_pid=0

prev_prio=120 prev_state=R ==> next_comm=user_loop next_pid=1553

next_prio=120

user_loop-1553 [007] d.h.. 1990.946593: reschedule_entry: vector=253

user_loop-1553 [007] d.h.. 1990.946593: reschedule_exit: vector=253

 

在这里,user_loop 任务从时间戳 1980 秒处开始第一次跟踪,从 swapper(空闲任务)进行调度。然后,在 10 秒钟内(1990 – 1980),直到任务最终中断之前,任何事情都没有发生,这样做是为了处理发射器发送的关闭信号。这表明在这段时间内没有任务或中断干扰我们的 user_loop。

 

请注意:只有在完美世界中的完美机器上进行理想设置时,才会出现这种结果。

2022-04-06 12:072503

评论

发布
暂无评论
发现更多内容

软件测试/人工智能|一文告诉你Python字典知识

霍格沃兹测试开发学社

智能双录解决方案助力保险代销机构探索市场新机遇

中关村科金

保险 智能双录

软件测试/人工智能|使用 Pip 管理 Python 包

霍格沃兹测试开发学社

新动力、新引擎,企业知识大模型释放数字生产力

中关村科金

特权账号管理的误区

尚思卓越

运维 数据安全 网安

机器学习与低代码开发:创新驱动的双剑合璧

EquatorCoco

机器学习 软件开发 低代码

Default Folder X mac v6.0.3激活版下载

影影绰绰一往直前

SwitchResX for Mac(屏幕分辨率修改工具) v4.13.2完美激活版

mac

苹果mac Windows软件 switchresx

软件测试/测试开发/人工智能丨ChatGPT为软件测试带来的变化

测试人

人工智能 软件测试

开发体育直播系统如何通过结合赛事数据提升平台价值

软件开发-梦幻运营部

从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能

快乐非自愿限量之名

c++ 项目 qt 截图

这款 IDEA 插件太好用了,堪称日志管理神器!

是月月啊2023

ieda

3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案

3DCAT实时渲染

实时云渲染 实时渲染云 汽车虚拟仿真 汽车3D可视化

IPQ4019 IPQ4029 Platform DR40x9 Provide 23-30KM Long Range Transfer AP Controller Support Openwrt Openwifi|802.11AC Solution

wallyslilly

IPQ4019 ipq4029

春晚回应吉祥物“龙辰辰”被质疑 AI 合成;周星驰 Web3 团队下月上线独立 App 丨 RTE 开发者日报 Vol.102

声网

【EMNLP 2023】基于知识迁移的跨语言机器阅读理解算法

阿里云大数据AI技术

大模型营销助手“打辅助”,加速保险展业

中关村科金

什么是item_get,它在电商中有什么作用?

技术冰糖葫芦

API 接口

软件测试/测试开发丨软件测试中的人工智能

测试人

人工智能 软件测试

软件测试/人工智能|一文告诉你Python集合相关知识

霍格沃兹测试开发学社

从内容生产到企业经营,大模型将如何改变数字营销?

中关村科金

大数据 大模型 智能营销

当前最高4+级!大模型能力获信通院标准符合性验证

中关村科金

大模型 大模型评估

类似MS Project的开源项目工具有哪些?15款开源项目管理工具对比

PingCode

开源 项目管理 项目管理系统

Keka for Mac(压缩解压工具) v1.3.6中文版

影影绰绰一往直前

手把手系列!用 Milvus 和 Python 搭建电影推荐系统

Zilliz

Python 推荐系统 Milvus 电影推荐系统

【JNPF】好用、高性价比的低代码开发平台

这我可不懂

软件开发 低代码 JNPF 全源码

.NET使用分布式网络爬虫框架DotnetSpider快速开发爬虫功能

不在线第一只蜗牛

.net 分布式 爬虫

快速认识什么是:Docker

不在线第一只蜗牛

Docker 运维 容器化

PPT下载 | DataOps +大模型促进数据工程创新

数造万象

用html+css+js做canvas烟花模拟网页动画代码

小齐写代码

从概念到实践,带你掌握层次递归查询

华为云开发者联盟

数据库 后端 华为云 华为云GaussDB 华为云开发者联盟

CPU 隔离:实践_硬件_Frederic Weisbecker_InfoQ精选文章