我正在一个 Linux 容器中运行 memcached 服务,该容器固定到特定的物理核心。正如预期的那样,当请求数量增加时,CPU 也会增加。请求是从另一台机器上的工作负载生成器发送的。但是,对于给定数量的请求,在不同情况下使用的 CPU 数量会以违反直觉的方式变化。该机器有 4 个物理核心(0、1、2、3),并且超线程已禁用。
1)Memcached 在单核(CPU0)上单独运行
2)Memcached 在单核(CPU0)上运行,而 CPU 密集型应用程序(执行许多浮点运算)在(CPU3)上运行。
例如,在场景 1 中,每秒处理 60000 个请求时,Memcached 的 CPU 使用率为 88%。在场景 2 中,每秒处理同样的 60000 个请求时,Memcached 的 CPU 使用率较低,为 78%。这是怎么可能的?为什么当 CPU 密集型应用程序在不同的核心上运行时,Memcached 的 CPU 使用率会下降?
mpstat 中的每个核心的一些中断结果:
场景1(memcached在CPU0上单独运行):
CPU usage of Memcached = 88%
Average: CPU HI/s TIMER/s NET_TX/s NET_RX/s BLOCK/s BLOCK_IOPOLL/s TASKLET/s SCHED/s HRTIMER/s RCU/s
Average: 0 0,00 231,61 0,20 102893,92 0,00 0,00 0,00 4,14 0,18 42,53
Average: 1 1,80 18,33 0,00 0,00 0,00 0,00 0,98 4,25 0,02 15,98
Average: 2 0,00 22,96 0,00 0,00 0,00 0,00 0,00 3,47 0,02 20,49
Average: 3 0,00 20,59 0,00 0,00 0,78 0,00 0,00 3,43 0,02 18,71
场景2:(memcached 在 CPU0 上,CPU 3 上 CPU 密集型应用程序)
CPU usage of Memcached = 78%
Average: CPU HI/s TIMER/s NET_TX/s NET_RX/s BLOCK/s BLOCK_IOPOLL/s TASKLET/s SCHED/s HRTIMER/s RCU/s
Average: 0 0,00 204,87 0,21 102268,58 0,00 0,00 0,00 2,77 0,40 133,05
Average: 1 0,03 24,94 0,00 0,00 0,00 0,00 0,55 5,56 0,06 23,38
Average: 2 0,00 17,23 0,00 0,00 0,00 0,00 0,00 4,23 0,04 16,12
Average: 3 0,00 250,00 0,00 0,00 0,74 0,00 0,00 2,50 0,00 37,69