这是一个猜测,但有根据 - 因为您使用一个独立的 CPU,所以调度程序不会在其上调度除您自己的任务之外的任何任务,但有一个例外 - 内核中的 vmstat 代码有一个计时器,该计时器在每个任务上调度一个工作队列项CPU 每秒一次来计算内存使用统计信息,这就是您所看到的每秒调度的内容。
工作队列代码足够聪明,如果内核 100% 空闲,则不会调度工作队列内核线程,但如果它正在运行单个任务,则不会。
您可以使用ftrace验证这一点。如果 sched_switch 跟踪器显示您每隔一秒左右切换一次的实体(该值四舍五入到最接近的 jiffie 事件,并且当 cpu 空闲时计时器不计数,因此这可能会扭曲计时)是 events/CPU_NUMBER 任务(或旧内核的 keventd ),那么几乎 100% 的原因确实是vmstat_update函数将其计时器设置为在事件内核线程运行时每秒排队一个工作队列项。
请注意,vmstat 设置其计时器的周期是可配置的 - 您可以通过 vm.stat_interval sysctl旋钮将其设置为其他值。增加此值会降低此类中断的发生率,但会降低内存使用统计的准确性。
我在此处维护一个 wiki,其中包含对隔离 CPU 工作负载的所有中断源。如果在一个 vmstat 工作队列运行到下一个运行之间没有变化,我也有一个补丁可以让 vmstat 不安排工作队列项目 - 例如,如果你在 CPU 上的单个任务不使用任何动态内存,就会发生这种情况分配。不过,不确定它是否会让您受益——这取决于您的工作量。