第 6 章 CPU
本章概述了影响 Red Hat Enterprise Linux 7 中的应用程序性能的 CPU 硬件详情和配置选项。第 6.1 节 “注意事项” 讨论影响性能的 CPU 相关因素。第 6.2 节 “监控和诊断性能问题” 教您如何使用红帽企业 Linux 7 工具诊断与 CPU 硬件或配置详情相关的性能问题。第 6.3 节 “配置建议” 讨论可用于解决 Red Hat Enterprise Linux 7 中 CPU 相关性能问题的工具和策略。
6.1. 注意事项
阅读本节以了解系统和应用程序性能如何受到以下因素的影响:
- 处理器互相连接的方式以及内存等相关资源。
- 处理器如何调度线程来执行.
- 处理器如何在 Red Hat Enterprise Linux 7 中处理中断.
6.1.1. 系统拓扑
在现代计算中,中央处理器的理念令人困惑,因为大多数现代系统都有多个处理器。这些处理器如何互相连接和其他系统资源(系统的拓扑 ),可能会对系统和应用程序性能以及系统调优注意事项产生巨大影响。
现代计算中使用两种主要拓扑类型:
- 对称多处理器(SMP)拓扑
- SMP 拓扑允许所有处理器在相同的时间里访问内存。但是,由于共享和相等内存访问本质上会强制从所有 CPU 进行序列化内存访问,因此 SMP 系统扩展限制现在通常被视为不可接受。因此,实际上,所有现代服务器系统都是 NUMA 计算机。
- 非一致性内存访问(NUMA)拓扑
- NUMA 拓扑的开发时间比 SMP 拓扑更近。在 NUMA 系统中,一个套接字上对多个处理器进行物理分组。每个套接字都有一个专用的内存区域,以及对该内存具有本地访问权限的处理器将统称为节点。位于同一节点上的处理器能够快速访问该节点的内存数据库,而且对不在节点的内存库的访问速度也较慢。因此,访问非本地内存会降低性能。鉴于这种性能损失,具有 NUMA 拓扑的系统上对性能敏感的应用程序应该访问与执行应用程序的处理器位于同一节点上的内存,并尽可能避免访问远程内存。在具有 NUMA 拓扑的系统上调优应用程序性能时,务必要考虑应用的执行位置,以及哪一个内存银行最接近执行点。在具有 NUMA 拓扑的系统上,
/sys
文件系统包含有关处理器、内存和外设设备如何连接的信息。/sys/devices/system/cpu
目录包含有关系统中处理器如何相互连接的详细信息。/sys/devices/system/node
目录包含有关系统中 NUMA 节点的信息,以及这些节点之间的相对距离。
6.1.1.1. 确定系统拓扑
有许多命令可帮助您了解系统的拓扑。numactl --hardware 命令提供了系统拓扑的概述。
$ numactl --hardware available: 4 nodes (0-3) node 0 cpus: 0 4 8 12 16 20 24 28 32 36 node 0 size: 65415 MB node 0 free: 43971 MB node 1 cpus: 2 6 10 14 18 22 26 30 34 38 node 1 size: 65536 MB node 1 free: 44321 MB node 2 cpus: 1 5 9 13 17 21 25 29 33 37 node 2 size: 65536 MB node 2 free: 44304 MB node 3 cpus: 3 7 11 15 19 23 27 31 35 39 node 3 size: 65536 MB node 3 free: 44329 MB node distances: node 0 1 2 3 0: 10 21 21 21 1: 21 10 21 21 2: 21 21 10 21 3: 21 21 21 10
由 util-linux 软件包提供的 lscpu 命令收集有关 CPU 架构的信息,如 CPU、线程、内核、插槽和 NUMA 节点的数量。
$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 40 On-line CPU(s) list: 0-39 Thread(s) per core: 1 Core(s) per socket: 10 Socket(s): 4 NUMA node(s): 4 Vendor ID: GenuineIntel CPU family: 6 Model: 47 Model name: Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz Stepping: 2 CPU MHz: 2394.204 BogoMIPS: 4787.85 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 30720K NUMA node0 CPU(s): 0,4,8,12,16,20,24,28,32,36 NUMA node1 CPU(s): 2,6,10,14,18,22,26,30,34,38 NUMA node2 CPU(s): 1,5,9,13,17,21,25,29,33,37 NUMA node3 CPU(s): 3,7,11,15,19,23,27,31,35,39
由 hwloc 软件包提供的 lstopo 命令会创建您系统的图形表示。lstopo-no-graphics 命令提供了详细的文本输出。
6.1.2. 调度
在 Red Hat Enterprise Linux 中,最小的进程执行单元称为线程。系统调度程序决定哪个处理器运行线程,以及线程运行的时间。但是,由于调度程序的主要顾虑是保持系统处于忙碌状态,因此可能无法最佳地为应用程序性能调度线程。
例如,当 Node B 上的处理器可用时,NUMA 系统上的应用程序在节点 A 上运行。为了让节点 B 处于忙碌状态,调度程序将一个应用程序的线程移到 Node B。但是,应用程序线程仍然需要访问节点 A 上的内存。因为线程现在在 Node B 上运行,并且 Node A 内存不再是线程的本地内存,所以访问它所需的时间会更长。线程在节点 B 上运行可能需要更长的时间,需要等待节点 A 上的处理器变得可用,并在原始节点上执行具有本地内存访问权限的线程。
对性能敏感的应用通常得益于设计人员或管理员确定线程的运行位置。有关如何根据性能敏感应用程序需求正确调度线程的详情请参考 第 6.3.6 节 “调优调度策略”。
6.1.2.1. 内核刻录
在以前的 Red Hat Enterprise Linux 版本中,Linux 内核会定期中断每个 CPU,以检查需要执行哪些工作。它利用结果对流程调度和负载平衡做出决策。这种常规中断称为内核环。
无论核心是否起作用,都会出现这一偏差。这意味着,即使空闲内核也经常被迫进入更高的功率状态(最多每秒 1000 倍)来响应中断。这导致系统无法有效地使用几代 x86 处理器中包含的深度睡眠状态。
在 Red Hat Enterprise Linux 6 和 7 中,默认情况下,内核不再中断空闲 CPU,而这往往处于低功率状态。此行为称为无空循环内核。当一个或多个任务正在运行时,定期中断被按需中断替代,从而使 CPU 保持空闲或更低的电源状态更长,并降低功耗。
红帽企业 Linux 7 提供了一个动态无循环选项(
nohz_full
),通过减少内核对用户空间任务的干扰来进一步增强确定性。这个选项可在带有 nohz_full
内核参数的指定内核中启用。当在核心上启用这个选项时,所有计时活动都会移到非延迟敏感内核中。这对高性能计算和实时计算工作负载非常有用,其中用户空间任务对与内核定时器环关联的微秒级延迟特别敏感。
有关如何在 Red Hat Enterprise Linux 7 中启用动态无勾号行为的详情请参考 第 6.3.1 节 “配置内核调整时间”。
6.1.3. 中断请求(IRQ)处理
中断请求或 IRQ 是从硬件部分向处理器发送立即关注的信号。系统中的每个设备都会被分配一个或多个 IRQ 号,以允许它发送唯一中断。启用中断后,接收中断请求的处理器将立即暂停当前应用线程的执行,以解决中断请求。
由于中断正常操作,高中断率可能会严重降低系统性能。可以通过配置中断关联或在批处理中发送多个较低优先级中断(联合多个中断 )来减少中断所花费的时间。
有关调整中断请求的详情请参考 第 6.3.7 节 “在 AMD64 和 Intel 64 中设置 Interrupt Affinity” 或 第 6.3.8 节 “使用 Tuna 配置 CPU、线程和中断关联性”。有关网络中断的详情请参考 第 9 章 网络。