Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux每进程资源限制-深红色帽子之谜_Linux_Redhat_Ulimit_Multithreading - Fatal编程技术网

Linux每进程资源限制-深红色帽子之谜

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个线程的程序。。 但它的运行速度与两个线程相同 经过多次调试,我发现我的程序确实在创建所有线程,它们确实是同时运行的,但是线程本身

我有自己的多线程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)

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

线索是:

  • 我的程序无法访问磁盘或网络。它的CPU有限。它的速度在一条直线上成正比 Ubuntu Linux中的单CPU机箱 用于1-6个线程的六核i7。6. 线程的有效加速比为6倍
  • 我的程序运行速度从未超过 16芯Sunfire的加速比为2倍 Xeon框,适用于任意数量的线程 从2点到16点
  • 运行16份 我的程序是单线程运行的 完美地,所有16个同时运行 全速
  • 顶部显示1600%的 分配的CPU/进程/cpuinfo显示 所有16芯都以2.9GHz全频段运行 转速(非低频怠速 (1.6GHz)
  • 有48GB的内存可用,它不是交换
  • 发生了什么事?是否有一些进程CPU限制策略?如果是这样的话,我怎么能测量呢? 还有什么可以解释这种行为


    感谢您的想法来解决这一问题,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服务器上,我可以访问但不拥有它。