Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 为什么每秒有一个非自愿的上下文切换?_Linux Kernel_Operating System_Scheduling_Kernel - Fatal编程技术网

Linux kernel 为什么每秒有一个非自愿的上下文切换?

Linux kernel 为什么每秒有一个非自愿的上下文切换?,linux-kernel,operating-system,scheduling,kernel,Linux Kernel,Operating System,Scheduling,Kernel,操作系统是RHEL6(2.6.32)。我已经隔离了一个内核,并在上面运行一个计算密集型线程/proc/{thread id}/status每秒显示一个非自愿上下文切换 所讨论的线程是SCHED_普通线程,我不想更改它 如何减少非自愿上下文切换的数量?这是否取决于/proc/sys/kernel中的任何调度参数 编辑:一些回复建议了替代方法。在走这条路线之前,我首先想了解为什么即使在几小时的跑步中,我每秒也会得到一次非自愿的上下文切换。例如,这是由CFS引起的吗?如果是,哪些参数以及如何设置 ED

操作系统是RHEL6(2.6.32)。我已经隔离了一个内核,并在上面运行一个计算密集型线程/proc/{thread id}/status每秒显示一个非自愿上下文切换

所讨论的线程是SCHED_普通线程,我不想更改它

如何减少非自愿上下文切换的数量?这是否取决于/proc/sys/kernel中的任何调度参数

编辑:一些回复建议了替代方法。在走这条路线之前,我首先想了解为什么即使在几小时的跑步中,我每秒也会得到一次非自愿的上下文切换。例如,这是由CFS引起的吗?如果是,哪些参数以及如何设置


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

我强烈建议您尝试优化代码本身,以便在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;
}
#包括
结构sched_param sp=sched_get_priority_max(sched_FIFO);
int ret;
ret=调度设置调度程序(0,调度FIFO和sp);
如果(ret==-1){
perror(“调度程序”);
返回1;
}
请记住,进程所做的任何阻塞语句都很可能导致调度程序将其从CPU上删除



编辑:
抱歉,刚刚注意到
pthread
标记;这个概念仍然适用,请查看此手册页:

如果在专用CPU上每秒中断一次仍然太多,那么您真的不需要通过正常的调度程序。我可以推荐实时和等时优先级级别吗?它可以让您的进程比通常的先发制人机制更可靠地安排时间?

这是一个猜测,但是一个受过教育的人——由于您使用的是一个独立的CPU,所以调度器除了您自己的任务之外,不会调度任何任务,只有一个例外——内核中的vmstat代码有一个计时器,它每秒在每个CPU上调度一次单个工作队列项,以计算内存使用统计信息,这就是您所看到的每秒调度的内容

如果内核是100%空闲的,那么工作队列代码足够智能,不会调度工作队列内核线程,但如果它正在运行单个任务,则不会调度工作队列内核线程

您可以使用来验证这一点。如果sched_switch tracer显示每秒左右切换一次的实体(该值被四舍五入到最近的jiffie事件,并且当cpu空闲时计时器不计数,因此这可能会扭曲计时)是events/cpu_NUMBER任务(或keventd用于旧内核),那么,几乎100%的原因确实是函数设置了它的计时器,以便在内核线程运行的事件中每秒对一个工作队列项进行排队

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


我维护一个wiki,其中包含所有中断源,以隔离CPU工作负载。我还有一个补丁,可以让vmstat在一个vmstat工作队列运行到下一个vmstat工作队列运行之间没有变化的情况下不安排工作队列项—例如,如果CPU上的单个任务不使用任何动态内存分配,就会发生这种情况。不过,我不确定这是否会对你有利——这取决于你的工作量。

你为什么会在意?在现代系统中,即使每秒100次上下文切换也是一种噪音。它的金融应用程序延迟很高,每一次上下文切换都可能失去(或更多)机会。我想了解哪些系统调优参数决定了独立内核上计算密集型线程的非自愿上下文切换速率。这很可能是锁阻塞、正常磁盘I/O阻塞或页面错误阻塞。这些都不是。该速率正好是在运行数小时内每秒一次非自愿的上下文切换。我几乎可以肯定CFS正在这样做——但是基于什么样的调度参数?就像@DavidSchwartz所说的,如果这是一个问题,你需要一个专用的盒子和一个实时操作系统,而不是一个通用的桌面。由于获得了良好的I/O性能,上下文切换几乎总是一个获得的机会。”每秒钟一次非自愿的上下文切换-什么?就像大卫说的,谁在乎呢?优化一些重要的东西…你能告诉我为什么我在没有阻塞语句的代码中每秒只看到一个非自愿的上下文切换吗?我不确定,但可能是调度程序正在使用RR算法,并且进程的时间片结束了,所以你被调度,然后再次回到CPU上。