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

评论

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

对线面试官-线程池连环问

派大星

线程池工作原理 Java 面试题

代码随想录Day28 - 回溯(四)

jjn0703

彻底学透分布式事务看这篇笔记就够了!

小小怪下士

Java 程序员 分布式 分布式事务

慎思笃行,兴业致远:金融行业的数据之道

脑极体

金融数据

javascript数据类型详解

timerring

JavaScript

项目管理的成功秘诀:架构评审的力量

乐思项目管理

架构评审 #项目管理

使用APP源码搭建直播网站难不难

山东布谷网络科技

APP开发 直播APP源码

Java Stream 源码分析

java易二三

Java 编程 计算机

代码随想录Day30 - 回溯(六)

jjn0703

项目管理中的'右转必停'原则:慎重决策与风险管理

乐思项目管理

项目管理 #观察生活

获评最高级别权威认证!融云通过中国信通院「办公即时通信软件安全能力」评测

融云 RongCloud

通信 即时通讯 办公 融云 百幄

代码随想录Day29 - 回溯(五)

jjn0703

最高1000万元基金直投!2023年中国(宁波)创新创业大赛

科兴未来News

Java教学之空指针异常、构造方法、封装

java易二三

Java 编程 程序员 计算机

Servlet学习:监听器、过滤器

java易二三

编程 程序员 计算机

代码随想录 Day27 - 回溯(三)

jjn0703

Spring系列之HikariCP连接池

java易二三

编程 程序员 Spring Boot 计算机 spring类型转换

项目管理中的代码评审:一种有效的实施策略和常见问题解析

乐思项目管理

代码评审 #项目管理

死磕Java八股成功拿下Offer,结果背调没过...

程序员小毕

程序员 面试 高并发 架构师 java面试

致敬图灵!HashData拥抱数据智能新时代!

酷克数据HashData

代码随想录Day31 - 贪心算法(一)

jjn0703

直播网站源码社区功能部署开发:连接世界的互动形式!

山东布谷科技

软件开发 社区 源码搭建 直播网站源码 直播网站

腾讯会议搭桥铺路

B Impact

为什么我强烈建议大家使用枚举来实现单例

java易二三

编程 程序员 计算机 枚举

高可用三大利器 — 熔断、限流和降级

Java研究者

架构 高可用 熔断 限流 java 架构

项目管理中的测试:确保项目成功的关键环节

乐思项目管理

项目管理 软件测试

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