我有一个运行Linux内核4.19.71的系统,使用Intel Xeon Platinum 8160
CPU,它有24个物理内核,每个内核有2个线程,它有48个逻辑内核。我正在尝试虚拟化(qemu
和kvm
(,并希望将一组核心与操作系统和系统管理程序隔离开来,以便这些核心只运行应用程序代码。所以我添加了isolcpus=
内核指令:
isolcpus=1-23,25-47
然而,我仍然看到一些内核线程被安排在我正在隔离的内核上,例如:
# ps -A -L -o pid,nlwp,tid,c,psr,comm |sort -n -k 5 | grep 27
148 1 148 0 27 kworker/27:0-mm_percpu_wq
149 1 149 0 27 kworker/27:0H-events_highpri
267 1 267 0 27 kworker/27:1-mm_percpu_wq
799 1 799 0 27 kworker/27:1H-events_highpri
...
#
第5列是处理器(核心(id,在这种情况下是27,根据上面的isolcpus=
,它不应该受到内核的干扰,但它在那里运行kworker线程。
这是否意味着存在异常,并且内核仍然可以在隔离的内核上调度任务,或者我错过了一些明显的东西?
谢谢。
我也在处理这个问题,我还没有找到一种方法来防止这些内核线程在隔离的CPU集上被调度。
从RedHat的文档来看,这似乎也不可行。
隔离CPU
您可以使用isolcpus引导参数将一个或多个CPU与调度程序隔离。这将阻止调度程序在该CPU上调度任何用户空间线程。
我一直在使用isolcpus
和cset shield
的组合,以防止大多数内核的内务线程被安排在我的隔离CPU中。
我使用perf sched
来记录CPU上的上下文切换,使用perf map
来可视化它们。
在第一个实验中,只使用了cset shield
。
$ grep -e '=>' exp_1.sch
*A0 445210.783227 secs A0 => kworker/11:1-ev:165
*. 445210.783275 secs . => swapper:0
*B0 445210.783304 secs B0 => kworker/u24:4-e:130904
*C0 445210.783420 secs C0 => WORKER2:160974
. *D0 C0 445210.783844 secs D0 => kworker/10:0-ev:1672
*E0 . C0 445210.784703 secs E0 => WORKER0:160969
*F0 . C0 445210.789628 secs F0 => kworker/9:1-eve:163
E0 *G0 . 445210.802886 secs G0 => WORKER1:160973
E0 *H0 . 445210.811638 secs H0 => ksoftirqd/10:76
E0 *I0 . 445210.939469 secs I0 => kworker/u24:2-e:158157
*J0 G0 . 445211.527639 secs J0 => ksoftirqd/9:70
E0 G0 *K0 445212.087622 secs K0 => ksoftirqd/11:82
E0 *L0 . 445212.347277 secs L0 => kworker/10:1H-k:277
*M0 I0 C0 445213.321971 secs M0 => kworker/u24:1-e:160121
E0 *N0 . 445214.463593 secs N0 => migration/10:75
*O0 N0 . 445214.463597 secs O0 => migration/9:69
O0 N0 *P0 445214.463598 secs P0 => migration/11:81
*Q0 G0 M0 445225.372366 secs Q0 => kworker/9:1H-kb:330
在这里,您可以看到我的工作负载线程(WORKER{0,1,2}
(、与CPU[9-11]相对应的工作负载(kworker/{9,10,11}:
(,以及其余的ksoftirqd/{9,10,11}:
、migration/{9,10,11}:
、kworker/u24
和";空闲";线程CCD_ 16。
在第二个实验中,我使用了cset shield
和isolcpus
。
$ grep -e '=>' exp_2.sch
*A0 1033.342241 secs A0 => WORKER0:3646
A0 *B0 1033.342675 secs B0 => kworker/11:1-ev:165
A0 *. 1033.342694 secs . => swapper:0
A0 *C0 . 1033.343470 secs C0 => WORKER1:3647
A0 C0 *D0 1033.344634 secs D0 => WORKER2:3648
A0 *E0 D0 1033.346306 secs E0 => kworker/10:1-ev:164
*F0 . D0 1033.364736 secs F0 => kworker/9:1-eve:163
A0 *G0 . 1036.433541 secs G0 => migration/10:75
*H0 G0 . 1036.433541 secs H0 => migration/9:69
A0 G0 *I0 1036.433548 secs I0 => migration/11:81
在这种情况下,您只能看到WORKER{0,1,2}
、kworker/{9,10,11}
、migration/{9,10,11}
和swapper
任务。