操作系统是 RHEL 6 (2.6.32)。我已经隔离了一个核心,并在其上运行一个计算密集型线程。 /proc/{thread-id}/status 每秒显示一次非自愿上下文切换。
有问题的线程是 SCHED_NORMAL 线程,我不想更改它。
如何减少非自愿上下文切换的数量?这是否取决于 /proc/sys/kernel 中的任何调度参数?
EDIT:一些回复提出了替代方法。在走那条路之前,我first我想了解为什么即使在运行数小时的情况下,我每秒也会发生一次非自愿上下文切换。例如,这是由CFS引起的吗?如果是这样,哪些参数以及如何?
EDIT2:进一步澄清 - 我想要回答的第一个问题如下:为什么我每秒进行一次非自愿上下文切换,而不是每半秒或两秒一次切换?
这是一种猜测,但却是一种有根据的猜测 - 由于您使用独立的 CPU,因此调度程序不会调度除您自己的任务之外的任何任务,但有一个例外 - 内核中的 vmstat 代码有一个计时器,该计时器在每个任务上调度一个工作队列项CPU 每秒计算一次内存使用统计信息,这就是您所看到的每秒调度的内容。
工作队列代码足够智能,如果核心 100% 空闲,则不会调度工作队列内核线程,但如果它正在运行单个任务,则不会。
您可以使用以下方法验证这一点ftrace。如果 sched_switch 跟踪器显示您每秒左右切换一次的实体(该值四舍五入到最接近的 jiffie 事件,并且计时器在 cpu 空闲时不计数,因此这可能会扭曲计时)是 events/CPU_NUMBER 任务(或者 keventd 对于较旧的内核),那么几乎 100% 的原因确实是vmstat_更新函数设置其计时器,以便事件内核线程运行时每秒对工作队列项进行排队。
请注意,vmstat 设置计时器的周期是可配置的 - 您可以通过 vm.stat_interval 将其设置为其他值sysctl旋钮。增加此值将降低此类中断的发生率,但代价是内存使用情况统计数据的准确性降低。
我维护一个 wiki,其中包含隔离 CPU 工作负载的所有中断源here。我还有一个补丁正在开发中,如果一个 vmstat 工作队列运行与下一个 vmstat 工作队列运行之间没有变化,那么 vmstat 就不会安排工作队列项目 - 例如,如果 CPU 上的单个任务不使用任何动态内存,就会发生这种情况分配。不过,不确定这会对您有利 - 这取决于您的工作量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)