Linux每进程资源限制-深红色帽子之谜
我有自己的多线程C程序,它的速度随着CPU内核的数量而平滑地扩展。。我可以用1、2、3等线程运行它,并获得线性加速。。Ubuntu Linux机箱上的6核CPU速度高达5.5倍 我有机会在一个非常高端的Sunfire x4450上运行该程序,它有4个四核Xeon处理器,运行Red Hat Enterprise Linux。我急切地期待着看到16核能以多快的速度运行16个线程的程序。。 但它的运行速度与两个线程相同 经过多次调试,我发现我的程序确实在创建所有线程,它们确实是同时运行的,但是线程本身的速度比它们应该的慢。2个线程的运行速度大约比1快1.7倍,但3、4、8、10、16个线程的运行速度都只有净1.9倍!我可以看到所有线程都在运行(不是暂停或休眠),它们只是速度慢。 为了检查硬件是否有故障,我同时独立运行了16份程序副本。他们都全速奔跑。实际上有16个内核,它们确实以全速运行,并且有足够的RAM(实际上这台机器有64GB,我每个进程只使用1GB) 所以,我的问题是,是否有一些操作系统的解释,可能是每个进程的资源限制,它会自动缩小线程调度,以防止一个进程占用机器 线索是:Linux每进程资源限制-深红色帽子之谜,linux,redhat,ulimit,multithreading,Linux,Redhat,Ulimit,Multithreading,我有自己的多线程C程序,它的速度随着CPU内核的数量而平滑地扩展。。我可以用1、2、3等线程运行它,并获得线性加速。。Ubuntu Linux机箱上的6核CPU速度高达5.5倍 我有机会在一个非常高端的Sunfire x4450上运行该程序,它有4个四核Xeon处理器,运行Red Hat Enterprise Linux。我急切地期待着看到16核能以多快的速度运行16个线程的程序。。 但它的运行速度与两个线程相同 经过多次调试,我发现我的程序确实在创建所有线程,它们确实是同时运行的,但是线程本身
感谢您的想法来解决这一问题,2010年的至强减速之谜 我最初的猜测是共享内存瓶颈。从您所说的,在2个CPU之后,您的性能基本上是平的。你一开始会责怪Redhat,但我很好奇如果你在同一个硬件上安装Ubuntu会发生什么。当然,我假设您正在两个测试中运行64位SMP内核 主板不可能在使用2个CPU时达到峰值。您有另一台具有多核的机器,它提供了更好的性能。这台新机器有没有开机?(这个答案与旧机器相比如何?)。你不是碰巧在虚拟化环境中运行吗
总的来说,你的证据表明某个地方有一个缓慢得可笑的瓶颈。正如您所说的,您不受I/O限制,因此只剩下CPU和内存。要么硬件出了问题,要么硬件出了问题。通过改变另一个来测试一个,你会很快缩小你的可能性 对rlimit进行一些研究-您运行的shell/用户帐户很可能存在一些RH默认值或管理员设置的资源限制。当您看到这种奇怪的缩放行为时,尤其是在多线程(而不是多进程)出现问题时,首先要考虑的是锁争用和其他同步原语的影响,这可能会导致运行在不同处理器上的线程必须彼此等待,从而可能迫使多个内核将其缓存刷新到主内存 这意味着内存体系结构开始发挥作用,当一块硅上有6个核时,这将比在4个独立处理器之间协调时快得多。具体来说,单CPU的情况可能根本不需要攻击主存来执行锁定操作——所有操作都可能在L3缓存级别进行处理,从而允许CPU在后台将数据刷新到主存时继续处理
虽然我认为OP在这段时间之后对这个问题已经失去了兴趣(或者甚至可能再也无法访问硬件),但检查这一点的一种方法是,如果将进程关联设置为将其锁定到单个物理CPU,则查看向上扩展到4个线程是否会有所改善。但更好的做法是对应用程序本身进行分析,以了解它在何处花费时间。随着体系结构的改变和内核数量的增加,猜测瓶颈在何处变得越来越困难,因此您确实需要开始直接测量,如本例所示:这些要点中的大多数都很好,是我首先看到的。但16个拷贝全速运行的事实意味着这不是CPU、内存、超线程或虚拟化问题。我现在确信这不是一个编程问题,而是与操作系统相关的问题,但我不知道该去哪里寻找。安装一个新的操作系统显然是一个很好的测试,除了这是在一个22000美元的SunFire服务器上,我可以访问但不拥有它。