操作系统是RHEL 6(2.6.32).我已经隔离了一个核心,并在其上运行计算密集型线程. / proc / {thread-id} / status每秒显示一个非自愿的上下文切换.
有问题的线程是一个SCHED_NORMAL线程,我不想改变它.
如何减少这种非自愿上下文切换的数量?这取决于/ proc / sys / kernel中的任何调度参数吗?
编辑:一些回复提出了替代方法.在走这条路之前,我首先要了解为什么即使经过几个小时的运行,我每秒也会获得一次非自愿的上下文切换.例如,这是由CFS引起的吗?如果是这样,哪些参数又如何?
EDIT2:进一步澄清 – 我想回答的第一个问题如下:为什么我每秒钟进行一次非自愿的上下文切换,而不是每半秒或两秒钟进行一次切换?
解决方法
这是一个猜测,但是一个受过教育的人 – 因为你使用一个独立的cpu,调度程序不会安排除你自己之外的任何任务,只有一个例外 – 内核中的vmstat代码有一个计时器,用于在每个上调度一个工作队列项cpu每秒计算一次内存使用情况统计信息,这就是您所看到的每秒计划一次.
工作队列代码足够智能,如果核心100%空闲,则不调度工作队列内核线程,但如果它运行单个任务则不调度.
您可以使用ftrace验证这一点.如果sched_switch跟踪器显示您每隔一秒左右切换一次的实体(该值四舍五入到最近的jiffie事件,并且当cpu空闲时计时器不计数,这可能会使时间偏差)是events / cpu_NUMBER任务(或旧内核的keventd),那么几乎100%的原因确实是vmstat_update函数将其计时器设置为每秒对事件内核线程运行的工作队列项进行排队.
请注意,vmstat设置其计时器的周期是可配置的 – 您可以通过vm.stat_interval sysctl旋钮将其设置为其他值.增加此值可以降低此类中断率,但代价是内存使用情况统计数据不太准确.
我维护了一个wiki,其中包含了隔离cpu工作负载here的所有中断源.如果一个vmstat工作队列运行到下一个工作队列之间没有变化,我还有一个补丁,用于让vmstat不安排工作队列项 – 例如,如果cpu上的单个任务不使用任何动态内存分配,则会发生这种情况.但不确定它会对您有益 – 这取决于您的工作量.