Linux线程调度在多核系统上的区别?

| 我们有几个对延迟敏感的“管道”式程序,当它们在一个Linux内核上运行而在另一个Linux内核上运行时,它们具有可衡量的性能下降。特别是,我们发现使用2.6.9 CentOS 4.x(RHEL4)内核具有更好的性能,而看到来自CentOS 5.x(RHEL5)的2.6.18内核具有更差的性能。 “管道”程序是指具有多个线程的程序。多线程处理共享数据。每个线程之间都有一个队列。因此,线程A获取数据,推入Qab,线程B从Qab移出,进行一些处理,然后推入Qbc,线程C从Qbc移出,依此类推。初始数据来自网络(由第3方生成)。 我们基本上测量从接收数据到最后一个线程执行任务的时间。在我们的应用程序中,当从CentOS 4迁移到CentOS 5时,我们看到的时间增加了20到50微秒。 我使用了几种方法来分析我们的应用程序,并确定CentOS 5上增加的延迟来自队列操作(尤其是弹出操作)。 但是,我可以使用任务集将程序绑定到可用核心的子集,从而提高CentOS 5(与CentOS 4相同)的性能。 因此对我来说,在CentOS 4和5之间,发生了一些变化(大概是内核),导致线程的调度方式有所不同(这种差异对于我们的应用程序而言不是最理想的)。 尽管我可以使用Taskset(或通过sched_setaffinity()在代码中)“解决”此问题,但我的首选是不必这样做。我希望有某种内核可调参数(或可调参数集合),其默认值在两个版本之间已更改。 有人对此有经验吗?也许还有更多需要调查的领域? 更新:在这种情况下,此问题已通过服务器供应商(Dell)的BIOS更新得到解决。我在这根头发上拔了好一会儿。直到我回到基础知识,并检查了供应商的BIOS更新。令人怀疑的是,其中一项更新说的是“在最大性能模式下提高性能”。一旦我升级了BIOS,CentOS 5就变得更快了-一般而言,但是特别是在队列测试和实际生产运行中。     
已邀请:
嗯..如果从生产者-消费者队列进行pop()操作所花费的时间对您的应用程序的整体性能产生重大影响,那么我建议您的线程/ workFlow的结构在某处不是最佳的。除非队列中存在大量争用,否则即使现代队列中的队列使用内核锁,如果任何现代操作系统上的任何PC队列推送/弹出操作花费的时间都超过µS左右,我会感到惊讶。 117-如何以三种信号量的方式使PC排队。 您能否仅将工作最少的线程的功能吸收到工作最多的线程的功能中,从而减少流过系统的每个总体工作项的推送/弹出次数?     
多年来,Linux调度程序一直是变化和争论的重点领域。您可能想尝试一个最新的内核,然后尝试一下。是的,您可能必须自己编译它-对您有好处。您可能还(当您拥有较新的内核时)想要考虑将不同的进程放在不同的容器中,而其他所有东西都放在另一个容器中,看看是否有帮助。 至于其他随机尝试,您可以提高各种进程的优先级,添加实时语义(注意,具有实时priv的错误程序可能会使系统的其余部分饿死)。     

要回复问题请先登录注册