2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

CPU 隔离:简介

  • 2022-04-01
  • 本文字数:1892 字

    阅读完需:约 6 分钟

CPU 隔离:简介

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

 

1. CPU 隔离 – 简介

2. CPU 隔离 – Full Dynticks 深探

3. CPU 隔离 – Nohz_full

4. CPU 隔离 – 管理和权衡

5. CPU 隔离 – 实践

 

本文是第一篇。

 

CPU 隔离是一组强大的功能,可以为那些依赖特定且通常对延迟或性能有极端要求的工作负载设置提供支持。有些 DPDK(数据平面开发套件:https://www.dpdk.org/) 用例可能属于这种情况。然而,关于 CPU 隔离的文档和注释即使没有滞后于最新的开发进程,也是过于零散。要理清现有调试范围背后的益处和权衡取舍并非易事。本系列文章旨在阐明并引导用户了解我们在 Linux 社区(https://www.kernel.org/)和 SLE15 产品中 (https://www.suse.com/products/server/)维护的这个晦涩的 Linux Kernel 子系统。

 

回归本源


内核的作用是提供基本的服务,从而通过一个统一接口使用硬件资源,这是工作负荷运行的基础。

 

我们以城市基础设施为例:道路、能源、供水、污水处理为人类活动提供支持。每个人都希望基础设施是透明并且可靠的。我们希望它们能发挥作用,同时希望永远不要意识到它们的存在。但有时,我们不得不这样做,因为最终每一项基础设施都需要维护。

 

内核与此类似。它使用系统调用,同步请求来提供服务,并使用异步处理来履行职责并维护内部状态,例如中断、计时器和内核线程。当然,这是一种简化描述,省去了许多细枝末节。


内务管理和内核噪音


如果其中一些异步工作对用户有明显的影响,比如页面回收(内存交换操作),则其余的大部分工作都是无感知的。计时器和中断在很短的时间内(通常以微秒计)执行;许多内核线程,其中一些是工作队列,执行时间也不应过长,尤其是它们的 CPU 时间通过调度程序进行平衡的时候。这些内核异步代码片段通常被称为“内务管理”工作。其中一些可以与特定的 CPU 绑定,另一些则可以解除绑定,因此可以在任何 CPU 上执行。


现在,如果多面手用户的工作负载不会因内核管理而产生负担,一些更专业的需求显然可能会受到干扰。对于需要整个 CPU 时间且不能容忍任何时钟周期被占用的处理任务,情况正是如此。DPDK (https://www.dpdk.org/)就是这样一个例子,即直接通过用户空间轮询获取高带宽网络数据包,而且任何来自内核的微小干扰都可能导致数据包丢失。这种随机噪声通常被称为“抖动”,其他类型的工作负载可能通过更接近无抖动的 CPU 来实现其目标:例如,希望以最大化方式为客户机提供 CPU 资源的虚拟化主机、为获得稳定结果而进行的 CPU 绑定的基准测试、特定的实时需求等。

 

定时器中断


让我们从定时器中断出发,更详细地探索内核管理的世界。定时器作为内核的核心组件,过去一直是难以消除的干扰源。中断是指在每个 CPU 上以 100 到 1000 Hz 的频率执行的周期性定时器中断,有些架构提出了更高的数值。它执行多项工作:

 

  • 运行过期的通用计时器回调

  • 跳过 posix CPU 定时器,并运行已经过期的定时器

  • 计时:维护内部时钟 (jiffies) 和外部时钟 (gettimeofday())

  • 调度程序:维护内部状态、公平性和优先级(任务优先级)

  • 维护全局平均负载

  • 维护性能事件等

 

毫无疑问,对于依赖于无干扰、无抖动 CPU 的极端工作负载来说,这种每秒执行 100 到 1000 次的中断可能是一个问题。虽然很快,但这些中断仍然会占用一些 CPU 周期,并会破坏 CPU 缓存,导致在中断后恢复用户任务时丢失缓存。因此,我们希望节省这些工作负载的时间。

 

这个问题难以解决,因为 CPU 的计时器中断不能像许多其他硬件 IRQ 一样与另一个 CPU 绑定。它也不能采用线程方式。从根本上说,考虑到其工作性质,这个问题必须在 CPU 范围内局部解决。事实上,直到内核版本 2.6.21(2007)发布,打破中断周期的机制根本不存在。其行为如下图所示:


图 1:周期计时器中断的实现

 

从图中可以看出,中断会盲目触发并一直中断 CPU,无论 CPU 是在内核空间、用户空间还是处于空闲状态。这种布局仍可以使用 CONFIG_HZ_PERIODIC 恢复;早在 2007 年,这种恢复方式必须解决的第一个问题是优化功耗。事实上,当 CPU 空闲时,不需要中断,因为没有真正的工作要做,而 CPU 可以从关闭周期性中断中获益,以进入低功耗模式。这就是 CONFIG_NO_HZ_IDLE(以前称为 CONFIG_NO_HZ: https://lwn.net/Articles/223185/)被引入内核的原因,它在进入空闲状态时停止周期性中断,并在退出空闲状态时重新启动。此后,我们工作负载上的情况就如下图所示:


图 2:dynticks-空闲计时器中断的实现

 

请记住:对于以无抖动 CPU 为目标的工作负载,我们更希望在无中断的情况下运行实际任务。详情请关注本系列第二篇文章。

2022-04-01 17:215559

评论

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

Ubuntu 20.04 启用休眠(Hibernate)配置过程

OutOfMemory1024

Ubuntu20.04

采访彩食鲜 CTO乔新亮:程序员如何持续的登上新台阶

风翱

4月日更 采访提纲

不惧业务规模与复杂性,实现敏捷的云转型“三步走”就对了 | 云途专栏

亚马逊云科技 (Amazon Web Services)

大数据-Big Data

进击的梦清

大数据

硬核,阿里自爆4月份Java题库答案(技术+人事),Github获赞76K

Java架构师迁哥

如何打造更为精准的个性化推荐?Amazon Personalize 有独门技术秘籍!

亚马逊云科技 (Amazon Web Services)

乘“云”加速疾病诊断研发,亚马逊云科技新阶段“诊断开发计划”已开启!

亚马逊云科技 (Amazon Web Services)

运动的这两个价值,你知道吗?|靠谱点评

无量靠谱

Hadoop-离线批处理技术

进击的梦清

大数据 hadoop 批处理

Guide to UUID in Java

OutOfMemory1024

Java

Ansible 简单使用

耳东@Erdong

4月日更

python 内置数据结构list、set、dict、tuple(三)

若尘

List 数据结构 set 元组 Python编程

还在写大量 if 来判断?试试用一个规则执行器来替代它

xcbeyond

4月日更

Open Source Load Testing Tool Review 2020

OutOfMemory1024

Load Testing Open Source

Linux OOM Killer

OutOfMemory1024

Linux

警惕数据泄露!快给你的数据加上安全密钥!

亚马逊云科技 (Amazon Web Services)

如何从零开始学Python:(5)如何处理列表中嵌套多个列表?

广之巅

Python 4月日更

低开销获取时间戳

捉虫大师

Java

《专访阿里研究员吴翰清:云时代,如何建设更安全的互联网环境?》(采访提纲)

xiezhr

网络安全 阿里吴翰清

牛P牛P!Github上堪称2021最全、最新Java面试题库到底有多香?

比伯

Java 程序员 架构 编程语言 技术宅

尴尬!看完阿里P7大佬自爆的Java面试复盘笔记,才知道自己才是井底之蛙

Java架构师迁哥

基于mysqldump聊一聊MySQL的备份和恢复

麦洛

MySQL MySQL 运维 数据备份

计算机原理学习笔记 Day12

穿过生命散发芬芳

计算机原理 4月日更

Storm-实时计算系统

进击的梦清

大数据 批处理 Storm

想要做网页游戏怎么办 ?PixiJs 篇(二)

空城机

JavaScript 大前端 游戏 4月日更 pixi

微服务架构核心基础讲解

麦洛

微服务

Redis - 跳表以及其内部结构

insight

redis 4月日更

AIOps智能运维

进击的梦清

运维自动化 AIOPS 智能

Zip和7-zip谁更强,如何选择?

麦洛

ZIP格式 ZIP zip4j

轻松搞定XML和对象之间的互转,就它了!

麦洛

xml XStream

纳尼?就凭这拿到了阿里巴巴50K的开发岗offer?

Java架构师迁哥

CPU 隔离:简介_硬件_Frederic Weisbecker_InfoQ精选文章