2012-12-26 34 views
6

操作系统是RHEL 6(2.6.32)。我已经隔离了一个核心,并在其上运行计算密集型线程。/proc/{thread-id}/status每秒显示一次非自愿的上下文切换。为什么每秒有一次非自愿的上下文切换?

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

我该如何减少这种数量的非自愿性上下文切换?这是否依赖于/ proc/sys/kernel中的任何调度参数?

编辑:一些答复建议的替代方法。在去那条路线之前,我第一个想要了解为什么我甚至在超过几小时的运行时间内每秒钟都会得到一个非自愿的上下文切换。例如,这是由CFS引起的?如果是这样,哪个参数又如何?

EDIT2:进一步说明 - 我想回答的第一个问题如下:为什么每秒钟而不是每隔半秒或两秒钟就得到一次非自愿上下文切换?

+1

你为什么在意?即使每秒100次的上下文切换也是现代系统中的噪声。 –

+1

它的金融应用程序的延迟是一个溢价和evey上下文切换可能是一个(或更多)失去的机会。我想了解哪些系统调整参数确定了隔离内核上计算密集线程的非自愿上下文切换速率。 –

+0

它最有可能阻塞锁,正常的磁盘I/O或页面错误。 –

回答

12

这是一个猜测,但是一个受过良好教育的人 - 既然你使用了一个独立的CPU,调度程序就不会安排除你自己之外的任何任务,只有一个例外 - 内核中的vmstat代码有一个计时器,在每个CPU上每秒对队列项目进行一次计算,以计算内存使用率统计信息,这就是您所看到的每秒计划。

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

可以使用ftrace验证这一点。如果sched_switch跟踪器显示每秒切换一次的实体(该值被四舍五入到最接近的jiffie事件,并且定时器在cpu闲置时不计算,所以这可能会扭曲定时)是events/CPU_NUMBER任务(或更老的内核keventd),那么几乎是100%,原因实际上是vmstat_update函数设置其计时器,以便事件内核线程每秒运行一个工作队列项目。

请注意,vmstat设置其定时器的周期是可配置的 - 您可以通过vm.stat_interval sysctl旋钮将其设置为其他值。增加此值会导致此类中断的发生率较低,但会导致内存使用情况统计信息不准确。

我维护一个维基,包含所有隔离CPU工作负载的中断源here。如果在一个vmstat工作队列运行到下一个vmstat工作队列之间没有变化的情况下,如果您的CPU上的单个任务没有使用任何动态内存,那么我还有一个补丁用于让vmstat不安排工作队列项目分配。不知道它会对你有好处,但这取决于你的工作量。

0

我强烈建议你尝试,所以当它在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。

Source
Man page
编辑:
不好意思,刚才注意到pthread标签;这个概念仍然成立,所以看看这个手​​册页: http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_setschedparam.3.html

+0

你能告诉我为什么我看到恰恰是一个非自愿的上下文在没有阻塞语句的代码中切换一秒? –

+0

我不确定,但可能是调度器正在使用RR算法,并且您的进程的时间片已结束,因此您会再次调度并重新启动CPU。 – Fingolfin

0

如果你的专用CPU每秒一个中断仍然太多,那么你真的不需要通过正常的调度程序。我可以建议实时和同步优先级别,这可以使您的进程比通常的先发制人机制更可靠吗?

相关问题