kernel stills安排代码在隔离的内核上运行



我有一个运行Linux内核4.19.71的系统,使用Intel Xeon Platinum 8160CPU,它有24个物理内核,每个内核有2个线程,它有48个逻辑内核。我正在尝试虚拟化(qemukvm(,并希望将一组核心与操作系统和系统管理程序隔离开来,以便这些核心只运行应用程序代码。所以我添加了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上调度任何用户空间线程。

我一直在使用isolcpuscset 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 shieldisolcpus

$ 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任务。

相关内容

  • 没有找到相关文章

最新更新