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就变得更快了-一般而言,但是特别是在队列测试和实际生产运行中。
没有找到相关结果
已邀请:
2 个回复
疾桓
闪脖