有问题的线程是一个SCHED_NORMAL线程,我不想改变它.
如何减少这种非自愿上下文切换的数量?这取决于/ proc / sys / kernel中的任何调度参数吗?
编辑:一些回复提出了替代方法.在走这条路之前,我首先要了解为什么即使经过几个小时的运行,我每秒也会获得一次非自愿的上下文切换.例如,这是由CFS引起的吗?如果是这样,哪些参数又如何?
EDIT2:进一步澄清 – 我想回答的第一个问题如下:为什么我每秒钟进行一次非自愿的上下文切换,而不是每半秒或两秒钟进行一次切换?
解决方法
工作队列代码足够智能,如果核心100%空闲,则不调度工作队列内核线程,但如果它运行单个任务则不调度.
您可以使用ftrace验证这一点.如果sched_switch跟踪器显示您每隔一秒左右切换一次的实体(该值四舍五入到最近的jiffie事件,并且当cpu空闲时计时器不计数,这可能会使时间偏差)是events / CPU_NUMBER任务(或旧内核的keventd),那么几乎100%的原因确实是vmstat_update函数将其计时器设置为每秒对事件内核线程运行的工作队列项进行排队.
请注意,vmstat设置其计时器的周期是可配置的 – 您可以通过vm.stat_interval sysctl旋钮将其设置为其他值.增加此值可以降低此类中断率,但代价是内存使用情况统计数据不太准确.
我维护了一个wiki,其中包含了隔离CPU工作负载here的所有中断源.如果一个vmstat工作队列运行到下一个工作队列之间没有变化,我还有一个补丁,用于让vmstat不安排工作队列项 – 例如,如果CPU上的单个任务不使用任何动态内存分配,则会发生这种情况.但不确定它会对您有益 – 这取决于您的工作量.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。