AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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:073273

评论

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

数字身份发展趋势前瞻:身份韧性与安全

芯盾时代

身份安全 iam 统一身份管理平台

GreptimeDB vs. ClickHouse vs. ElasticSearch 日志引擎性能对比报告

Greptime 格睿科技

数据库 Elastic Search Click house 性能报告

Kubernetes时代的APM部署革新:基于Webhook的Agent动态注入

云智慧AIOps社区

APM 应用监控

昆仑万维重磅发布天工AI高级搜索功能,做最懂金融投资、科研学术的AI搜索

新消费日报

如何配置 GreptimeDB 作为 Prometheus 的长期存储

Greptime 格睿科技

存储 时序数据库 Promethues

一文说清什么是数据要素

郑州埃文科技

数据要素

DolphinScheduler集成Arthas实现接口调用监控,提升调度任务可靠性

白鲸开源

工作流调度 Apache DolphinScheduler #开源

如何利用模版进行设置仿真默认参数z

思茂信息

教程 模板 cst

【堡垒机小知识】堡垒机用户认证是什么意思?一般有哪些方式?

行云管家

网络安全 堡垒机

指标+AI+BI:构建数据分析新范式

袋鼠云数栈

基于IM场景下的Wasm初探:提升Web应用性能|得物技术

得物技术

rust web前端 Wasm

语忆科技携手火山引擎数据飞轮 探索智能客服场景新可能

字节跳动数据平台

大数据 数仓 数智化转型 数据飞轮

【征程 6 工具链性能分析与优化-2】模型性能优化建议

地平线开发者

自动驾驶; #算法

DistilQwen2:通义千问大模型的知识蒸馏实践

阿里云大数据AI技术

人工智能 知识蒸馏 通义千问

泄漏检测与修复综合管理系统(源码+文档+部署+讲解)

深圳亥时科技

计算不停歇,百度沧海数据湖存储加速方案 2.0 设计和实践

百度Geek说

人工智能 数据库 百度 数据湖

基于图遍历的Flink任务画布模式下零代码开发实现方案

京东科技开发者

【征程 6 工具链性能分析与优化-1】编译器预估 perf 解读与性能分析

地平线开发者

第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举办!

测吧(北京)科技有限公司

测试

第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举办!

测试人

人工智能 软件测试 测试开发 高校

细谈 Linux 中的多路复用epoll

威哥爱编程

Linux epoll Java.

一起单测引起的项目加载失败惨案

京东科技开发者

常规LED广告显示屏运营成本怎么估算

Dylan

广告 运营 LED display LED显示屏 全彩LED显示屏

HyperWorks作业递交面板设置

智造软件

CAE Hypermesh hyperworks

低代码平台服务编排提升

鲸品堂

低代码 交付工具 企业号 2024年11月PK榜

AI工具百宝箱|一键解锁o1/ChatGPT/Gemini/Claude等应用的网站,等你来体验!

可信AI进展

深度解析1688阿里巴巴平台商品详情API接口

代码忍者

API 接口 pinduoduo API

非凸科技助力第49届ICPC亚洲区域赛(成都)成功举办

非凸科技

ICPC

2025郑州等保测评机构名称看这里!

行云管家

等保 等级保护 郑州

服装品牌必备:智能商品管理系统,打造高效运营新引擎!

第七在线

经济下行,当下企业如何破局?

禅道项目管理

需求管理 IPD 市场分析 IPD落地 IPD培训

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