奇怪的情况:HP z800 工作站上的 Redhat Enterprise 5.5(库存安装,无更新,x64)。(双 Xeon 2,2 Ghz。8 个核心,如果算上超线程,则为 16 个。RH 看到 16 个核心。)
我们有一个应用程序,可以利用 1、2 或 4 个线程进行繁重的计算。不知何故,所有这些线程都以 100% 的负载在同一核心上运行(其他 15 个核心几乎处于空闲状态),因此额外的线程绝对没有任何好处。事实上,由于线程在单个核心上互相干扰,速度略有减慢。
我如何让它们在不同的内核上运行(如果可能的话)?应用程序是 64 位的。除了更改线程设置外,无法更改软件的任何内容。是否有一些晦涩难懂的 Linux 设置我可以尝试更改?(我是 True64 和 Aix 用户。我使用 Linux,但对 Linux 上的进程调度没有深入了解。)
/proc/cpuinfo 列出 16. top 和 gnome cpu-monitor 都显示只使用了 1 个核心。我也尝试了类似 perl 的东西。如果我们愿意,我们可以将所有 CPU 加载到接近 100%。应用程序供应商声称:是的,它是多线程的,但尚未优化。那将是下一个版本(8 月)。
因此我认为应用程序正在其自己的进程空间内执行子线程,而不是真正独立的进程线程。那么我真的无能为力了……
答案1
下载RPMforge 的压力实用程序或者 yum 并运行它:
stress --cpu 16
生成 16 个工作器。如上所述,top
使用1
开关运行以显示列表中的所有 CPU。
验证 CPU 列表和活动后,按 Ctrl-C 退出压力并运行应用程序。top
从相同的开关开始,然后使用该H
开关显示所有进程线程。
答案2
您是否 100% 确定它只在一个核心上运行?您是如何检查的?top 然后按“1”?按“1”后,您是否在“top”上看到所有 16 个核心?或者在“cat /proc/cpuinfo”中?
其他应用程序会发生什么情况?如果你启动类似
perl -e 'foreach (1..9e9) { sqrt(1234) }' &
16 次,您是否看到所有 16 个核心都达到了 100%?
我认为这更多的是你的应用程序的配置,而不是特定于 Linux 系统的配置。