为什么每秒一个非自愿的上下文切换?(Why one non-voluntary context sw

2019-07-17 13:50发布

该操作系统是RHEL 6(2.6.32)。 我已经分离核心和正在运行在其上的计算密集型线程。 的/ proc / {线程ID} /状态示出了一个非主动上下文切换每一秒。

有问题的线程是SCHED_NORMAL线程,我不想改变这一点。

我怎样才能减少此数量的非自愿上下文切换的? 这是否取决于在/ proc / sys目录/内核的任何计划参数?

编辑 :一些答复建议的替代方法。 之前走这样一条路,我首先要明白为什么我即使在运行时间获得每秒只有一个非自愿的上下文切换。 例如,这是造成CFS? 如果是这样,其参数以及如何?

EDIT2:进一步澄清-第一个问题,我想回答是:为什么我会得到一个非自愿的上下文切换每秒,而不是,比方说,一个开关,每半两秒钟?

Answer 1:

这是一个猜测,但一个受过教育的一个 - 因为你使用一个孤立的CPU调度程序不安排任何任务,除了你自己就可以有一个例外 - 在内核vmstat的代码有一个计时器,每个调度一个单一的工作队列项以每秒一次的CPU计算内存使用统计信息,这是你所看到的被安排每一秒的东西。

工作队列的代码是足够聪明,不安排工作队列内核线程,如果核心是100%闲置但如果它在运行单个任务。

您可以验证这一点使用ftrace 。 如果sched_switch示踪表明实体切换到每秒一次左右(该值四舍五入到最接近的jiffie事件,并在CPU空闲所以这可能扭曲时间定时器不计数)是事件/ CPU_NUMBER任务(或keventd的为老版本的内核),那么它几乎100%的原因确实是vmstat_update功能设置它的定时器来排队一个工作队列项每秒该事件内核线程运行。

需要注意的是,在其中的vmstat将其计时器是可配置的周期-您可以通过vm.stat_interval设置其他值的sysctl旋钮。 增加该值会给你这样的中断在不太准确的内存使用统计信息的成本较低。

我保持与中断隔离CPU工作负载的所有源维基这里 。 我也有在作品中一个补丁让vmstat来未安排工作队列项目如果有下一次的vmstat工作队列运行之间没有任何变化 - 例如,如果CPU中的单任务不使用任何动态内存会发生分配。 不知道这将有利于你,虽然 - 这取决于你的工作负载。



Answer 2:

我强烈建议你尝试,所以当它在CPU上运行,你得到最大的出它来优化代码本身。
总之, 我不知道这会工作 ,但给它一个想试试,让我们知道:

我就基本都被刚才设置的调度策略是FIFO然后给进程的最高优先级可能。

#include<sched.h>
struct sched_param sp = sched_get_priority_max(SCHED_FIFO);
int ret;

ret = sched_setscheduler(0, SCHED_FIFO, &sp);
if (ret == -1) {
  perror("sched_setscheduler");
  return 1;
}

请记住,你的进程作出任何阻塞语句是最有可能会导致调度得到它的CPU。

资源
手册页
编辑:
不好意思,刚才注意到pthread标记; 概念犹抱那么看看这个手册页: http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_setschedparam.3.html



Answer 3:

如果每秒一个中断专用CPU上仍然是太多了,那么你真的需要不通过正常的调度程序走的。 我建议实时和同步优先级,可以留下你的进程安排比一般的先发制人的机制更可靠?



文章来源: Why one non-voluntary context switch per second?