CPU隔离是什么?作用是什么?

文章讨论了Linux系统中nohz_full配置如何影响CPU内务管理工作,当一些CPU被隔离时,剩余的CPU(通常是CPU0)会承担这些任务。这包括计时器更新、RCU回调和处理未绑定的工作。随着CPU数量和内存分区的增加,可能需要更平衡的内务管理分配。完全dynticks模式增加了内核进出的开销,特别是RCU跟踪和记录CPU运行时间。文章强调CPU隔离和dynticks优化适用于特定计算密集型工作负载,但可能不适合所有情况,并需要监控和调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在正常的配置下,每个 CPU 都要承担内务管理工作。相反,nohz_full 配置会以隐含方式移除 nohz_full 集合之外的所有的内务管理工作。

也就是说,如果有 8 个 CPU,并隔离 CPU 1、2、3、4、5、6、7:

nohz_full=1-7

则 CPU 0 将单独处理内务管理工作。这些工作涉及:

  • 未绑定计时器回调执行
  • 未绑定工作队列执行
  • 未绑定 kthreads 执行
  • 计时更新(jiffies 和 gettimeofday())
  • RCU 缓冲期跟踪
  • 代替隔离的 CPU 进行 RCU 回调执行
  • 代替隔离的 CPU 执行 1Hz 残余的已卸载计时器 Tick
  • 根据扩展设置:
  • 可以绑定的硬件 IRQ
  • 除隔离的工作负载以外的用户任务

尽管这些项目通常可由一个 CPU 代替其他 7 个 CPU 处理,但这种布局并不趋于无穷尽。随着 CPU 数量的增加,同时,随着内存和缓存的进一步分区,内务管理任务可能需要共担。通常情况下,为每个 NUMA 节点配置一个管理 CPU 是一种不错的方法。如以下配置所示:

由于 CPU 0 - 7 属于节点 0,CPU 8 - 15 属于节点 1,默认设置如下所示:

nohz_full=1-7,9-15

在测试阶段,建议通过 top/htop 等工具检查和监控管理程序的活动,以确保它们没有超负荷。例如,如果以上设置显示 CPU 0 或 CPU 8 的负荷为 100%,则可能需要添加更多的管理 CPU,尽管这种情况更有可能使用更多的节点来处理。

同样需要注意的是,对内核的访问(例如系统调用或内存故障)可能会产生更多的内务管理活动,并导致 CPU 承担更多负载。通常不建议从隔离的 CPU 中请求内核服务,这一点我们将在下一章介绍。

在任何情况下,内核都有内务工作需要处理,这不能忽略。如果所有 CPU 都被传递到“nohz_full=” 内核参数,则 CPU 0 将从隔离集合内随意清理出来,并为其单独分配内务管理工作,使用的消息如下:

NO_HZ: Clearing 0 from nohz_full range for timekeeping

因此,要注意的是:被隔离的 CPU 之所以获得无抖动的特性,是因为其他 CPU 承担了更多工作,而至少一个 CPU 需要为这些工作做出牺牲。

然而,这种情况并非一成不变。从长远来看,我们可以安排在隔离模式下运行所有 CPU,前提是在内核进入时更新计时,并且调度程序的能力进一步增强,能够支持在用户空间中运行长时间的任务,而不需要远程中断才能保持统计信息的最新状态。但我们还没有做到。

内核进入/退出的开销

完全的 dynticks 模式增加了内核进入和退出的大量开销。这些是由于:

  • 系统调用
  • 异常(页面错误、陷阱等)
  • 中断

这些开销首先是由于 RCU 跟踪和排序造成的。这项工作通常由周期性计时器中断来处理。现在,我们已经摒弃了这种方法,最终需要使用代价高昂的完全排序后的原子操作,来计算通过内核边界的往返次数。

这些开销的第二部分来自记录CPU运行时间。同样,内核必须使用内核边界上的探测器来计算任务在内核和用户空间中执行所花费的时间,因为周期性的中断不再执行这项工作。尽管记录 CPU 运行时间使用的排序比 RCU 跟踪要弱,但仍有一些处理会增加总体开销。

结语

CPU 隔离和 full dynticks 可以为某些特定工作负载带来明显好处,但需注意,它在许多情况下并不适用。您必须特别注意以下两点:

  • 所以需要牺牲一个隔离的 CPU,由其处理内核内部的无聊工作。
  • Full dynticks 仅适用于 CPU 计算型的工作负载,或者基于用户空间驱动程序的 I/O。

 

### CPU和内存的基本概念及功能 #### 1. CPU 的定义及功能 CPU(Central Processing Unit,中央处理器)是计算机系统的核心部件,负责执行指令和处理数据。它通过一系列复杂的逻辑电路实现计算、控制和数据传输功能。在 QEMU 中,为了支持多种 CPU 模型,设计了一套继承结构来表示 CPU 对象[^1]。对于 x86 架构的 CPU,QEMU 使用 `builtin_x86_defs` 数组定义了所有支持的 CPU 模型,其中每个模型包含名称、功能级别、扩展功能级别以及特性数组等信息。 CPU 的主要功能包括: - **指令解码**:读取并解析存储在内存中的指令。 - **算术与逻辑运算**:执行加减乘除、比较等操作。 - **数据处理**:根据指令对数据进行读取、写入或修改。 - **控制单元**:协调计算机中其他硬件组件的操作。 主存(即内存)通过控制芯片与 CPU 相连,提供可读写的存储空间。每个字节都带有一个唯一的地址编号,CPU 可以通过这些地址访问内存中的数据和指令[^2]。 --- #### 2. 内存的定义及功能 内存(Memory)是计算机中的临时存储设备,用于存储运行时的数据和指令。它的基本单位是字节(1 byte = 8 bits),每个字节都有一个唯一的地址编号。内存的特点是速度快,但断电后数据会丢失。 内存的主要功能包括: - **数据存储**:为正在运行的程序提供临时存储空间。 - **指令缓存**:存储 CPU 即将执行的指令。 - **动态分配**:根据程序的需求动态分配和释放存储空间。 在 Linux 系统中,可以使用 `free` 命令查看内存的使用情况,包括物理内存和虚拟内存(swap)。例如,`free` 命令可以显示总内存、已用内存、空闲内存以及交换分区的大小等信息[^3]。 --- #### 3. CPU 和内存的关系 CPU 和内存之间存在紧密的合作关系。CPU 通过地址总线访问内存中的数据和指令,并通过数据总线进行数据传输。内存为 CPU 提供了快速访问的存储空间,使得程序能够高效运行。此外,在容器技术中,如 Docker,可以通过配置参数限制 CPU 和内存资源的使用,确保容器之间的资源隔离[^4]。 ```bash # 示例:限制 Docker 容器的内存和 CPU 资源 docker run --memory="512m" --cpus="2" my_image ``` 上述命令中,`--memory` 参数限制了容器的最大内存使用量,而 `--cpus` 参数限制了容器可以使用的 CPU 核心数。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值