点击 "阅读原文" 可以获得更好的阅读体验。
前言
这是 Cgroup 系列的第四篇,往期回顾:
- Linux Cgroup 入门教程:基本概念
- Linux Cgroup 入门教程:CPU
- Linux Cgroup 入门教程:内存
通过上篇文章的学习,我们学会了如何查看当前 cgroup 的信息,如何通过操作 /sys/fs/cgroup
目录来动态设置 cgroup,也学会了如何设置 CPU shares 和 CPU quota 来控制 slice
内部以及不同 slice
之间的 CPU 使用时间。本文将继续探讨对 CPU 使用时间的限制。
对于某些 CPU 密集型的程序来说,不仅需要获取更多的 CPU 使用时间,还要减少工作负载在节流时引起的上下文切换。现在的多核系统中每个核心都有自己的缓存,如果频繁的调度进程在不同的核心上执行势必会带来缓存失效等开销。那么有没有方法针对 CPU 核心进行隔离呢?准确地说是把运行的进程绑定到指定的核心上运行。虽然对于操作系统来说,所有程序生而平等,但有些程序比其他程序更平等。
对于那些更平等的程序来说,我们需要为它分配更多的 CPU 资源,毕竟人都是很偏心的。废话少说,我们来看看如何使用 cgroup
限制进程使用指定的 CPU 核心。
1. 查看 CPU 配置
CPU 核心的编号一般是从 0 开始的,4 个核心的编号范围是 0-3
。我们可以通过查看 /proc/cpuinfo
的内容来确定 CPU 的某些信息:
$ cat /proc/cpuinfo
...
processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 26
model name : Intel(R) Xeon(R) CPU X5650 @ 2.67GHz
stepping : 4
microcode : 0x1f
cpu MHz : 2666.761
cache size : 12288 KB
physical id : 6
siblings : 1
core id : 0
cpu cores : 1
apicid : 6
initial apicid : 6
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer hypervisor lahf_lm ssbd ibrs ibpb stibp tsc_adjust arat spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips : 5333.52
clflush size : 64
cache_alignment : 64
address sizes : 43 bits physical, 48 bits virtual
processor
: 表示核心的编号,但这不是物理 CPU 的核心,更确切地可以称之为**逻辑核编号。physical id
: 表示当前逻辑核所在的物理 CPU 的核心,也是从 0 开始编号,这里表示这个逻辑核在第 7 个 物理 CPU 上。core id
: 如果这个值大于 0,你就要注意了,你的服务器可能开启了超线程。如果启用了超线程,每个物理 CPU 核心会模拟出 2 个线程,也叫逻辑核(和上面的逻辑核是两回事,只是名字相同而已)。如果你想确认服务器有没有开启超线程,可以通过下面的命令查看:
$ cat /proc/cpuinfo | grep -e "core id" -e "physical id"
physical id : 0
core id : 0
physical id : 2
core id : 0
physical id : 4
core id : 0
physical id : 6
core id : 0
如果 physical id
和 core id
皆相同的 processor
出现了两次,就可以断定开启了超线程。显然我的服务器没有开启。
2. NUMA 架构
这里需要涉及到一个概念叫 NUMA(Non-uniform memory access)[1],即非统一内存访问架构。如果主机板上插有多块 CPU,那么就是 NUMA
架构。每块 CPU 独占一块面积,一般都有独立风扇。
一个 NUMA
节点包含了直连在该区域的 CPU、内存等硬件设备,通信总线一般是 PCI-E
。由此也引入了 CPU 亲和性的概念,即 CPU 访问同一个 NUMA
节点上的内存的速度大于访问另一个节点的。
可以通过下面的命令查看本机的 NUMA 架构&#x