我有2个独立CPU的服务器(4个超线程):
BOOT_IMAGE=/vmlinuz-4.4.0-72-generic root=/dev/mapper/valet--vg-root ro isolcpus=3,7,11,15 irqaffinity=0-2,4-6,8-10,12-14
这是我服务器的拓扑:
机器(共39GB)
NUMANode L#0 (P#0 24GB)
Package L#0 + L3 L#0 (12MB)
L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
PU L#0 (P#0)
PU L#1 (P#8)
L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
PU L#2 (P#1)
PU L#3 (P#9)
L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2
PU L#4 (P#2)
PU L#5 (P#10)
L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3
PU L#6 (P#3)
PU L#7 (P#11)
HostBridge L#0
PCIBridge
PCI 8086:10c9
Net L#0 "enp1s0f0"
PCI 8086:10c9
Net L#1 "enp1s0f1"
PCIBridge
PCI 15b3:1015
Net L#2 "enp4s0f0"
OpenFabrics L#3 "mlx5_0"
PCI 15b3:1015
Net L#4 "enp4s0f1"
OpenFabrics L#5 "mlx5_1"
PCIBridge
PCI 102b:0532
PCI 8086:3a22
Block(Disk) L#6 "sda"
Block(Disk) L#7 "sdb"
Block(Removable Media Device) L#8 "sr0"
NUMANode L#1 (P#1 16GB) + Package L#1 + L3 L#1 (12MB)
L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4
PU L#8 (P#4)
PU L#9 (P#12)
L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5
PU L#10 (P#5)
PU L#11 (P#13)
L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6
PU L#12 (P#6)
PU L#13 (P#14)
L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7
PU L#14 (P#7)
PU L#15 (P#15)
我有这样简单的应用程序:
main() {
uint64_t cc = 0;
while (1) { cc += 1; }
return 0;
}
使用此命令taskset -c 7 ./app
运行它我希望此进程上的nonvoluntary_ctxt_switches大约为0,但它是:
voluntary_ctxt_switches: 1
nonvoluntary_ctxt_switches: 2589
并且每秒增加~100。
此外,我期待voluntary_ctxt_switches正好为0,因为我没有执行任何阻止的调用。
我检查了/proc/interrupts
的CPU 7,可以看到下一个增加:NMI, LOC, PMI, RES
。
所以:
1)为什么上下文切换的数量如此之高以及究竟是什么原因?
2)我是否正确地说NMI和PMI中断是无害的并且不重要?
3)为什么我的RES中断值很高?
等待你的回答!