SPW*_*ley 5 linux multithreading redhat ulimit
我有自己的多线程C程序,可以根据CPU内核的数量平滑地扩展速度.我可以用1,2,3等线程运行它并获得线性加速..在6核上最高可达5.5x速度Ubuntu Linux机器上的CPU.
我有机会在一个非常高端的Sunfire x4450上运行该程序,其中包含4个四核Xeon处理器,运行Red Hat Enterprise Linux.我急切期待看到16个内核以16个线程运行我的程序的速度有多快..但它的运行速度与两个线程相同!
稍后进行了大量的拔毛和调试,我发现我的程序确实在创建所有线程,它们实际上是同时运行的,但是线程本身比它们应该更慢.2个线程的运行速度比1快1.7倍,但是3个,4个,8个,10个,16个线程的运行速度仅为1.9倍!我可以看到所有线程都在运行(没有停滞或睡眠),它们只是很慢.
为了检查硬件是否有问题,我同时独立地运行了我的程序的第六个副本.他们全速奔跑.真的有16个内核,它们确实全速运行,并且确实有足够的RAM(实际上这台机器有64GB,而且每个进程只使用1GB).
所以,我的问题是,是否有一些操作系统解释,也许是一些每进程资源限制,它自动缩减线程调度,以防止一个进程占用机器.
线索是:
发生了什么?是否有一些进程CPU限制策略?如果是这样我怎么测量呢?还有什么可以解释这种行为?
感谢您的解决方案,2010年的伟大至强减速之谜!
我最初的猜测是共享内存瓶颈。根据您的说法,使用 2 个 CPU 后您的性能几乎持平。你最初责怪 Redhat,但我很好奇如果你在相同的硬件上安装 Ubuntu 会发生什么。当然,我假设您在这两个测试中都运行 64 位 SMP 内核。
主板可能不可能达到使用 2 个 CPU 的峰值。您有另一台具有多核的机器,可以提供更好的性能。你的新机器开启了超线程吗?(这个答案与旧机器相比如何?)。您不是偶然在虚拟化环境中运行吗?
总的来说,你的证据表明某个地方存在一个极其缓慢的瓶颈。正如您所说,您不受 I/O 限制,因此只剩下 CPU 和内存。要么是硬件出了问题,要么是硬件出了问题。通过改变另一个来测试一个,你会很快缩小你的可能性。