Linux每个进程资源限制 - 一个深刻的红帽之谜

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).

所以,我的问题是,是否有一些操作系统解释,也许是一些每进程资源限制,它自动缩减线程调度,以防止一个进程占用机器.

线索是:

  1. 我的程序无法访问磁盘或网络.它的CPU有限.它的速度在Ubuntu Linux中的单个CPU盒上线性扩展,带有一个用于1-6线程的hexacore i7.6个线程实际上是6倍加速.
  2. 我的程序在这个16核心Sunfire Xeon盒子上的运行速度永远不会超过2倍,对于2-16的任意数量的线程.
  3. 运行16个程序单线程的副本运行完美,全部16个全速运行.
  4. top显示1600%的CPU分配./ proc/cpuinfo显示所有16个内核以2.9GHz的速度运行(不是1.6GHz的低频空闲速度)
  5. 有48GB的RAM免费,它没有交换.

发生了什么?是否有一些进程CPU限制策略?如果是这样我怎么测量呢?还有什么可以解释这种行为?

感谢您的解决方案,2010年的伟大至强减速之谜!

Mat*_*ons 2

我最初的猜测是共享内存瓶颈。根据您的说法,使用 2 个 CPU 后您的性能几乎持平。你最初责怪 Redhat,但我很好奇如果你在相同的硬件上安装 Ubuntu 会发生什么。当然,我假设您在这两个测试中都运行 64 位 SMP 内核。

主板可能不可能达到使用 2 个 CPU 的峰值。您有另一台具有多核的机器,可以提供更好的性能。你的新机器开启了超线程吗?(这个答案与旧机器相比如何?)。您不是偶然在虚拟化环境中运行吗?

总的来说,你的证据表明某个地方存在一个极其缓慢的瓶颈。正如您所说,您不受 I/O 限制,因此只剩下 CPU 和内存。要么是硬件出了问题,要么是硬件出了问题。通过改变另一个来测试一个,你会很快缩小你的可能性。