- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们刚刚购买了32核Opteron机器,但获得的加速却令人失望:超过24个线程之后,我们根本看不到加速(实际上总体上变慢了),经过6个线程后,它显着地变成了次线性。
我们的应用程序非常线程友好:我们的工作分解为大约170,000个小任务,每个小任务可以分别执行,每个过程需要5到10秒。它们都从大小约为4Gb的同一内存映射文件中读取。他们偶尔会对其进行写入,但每次写入可能会读取10,000次-我们在170,000个任务的每个末端都只写入了一点数据。写入受锁保护。分析表明,锁不是问题。线程在非共享对象中各自使用大量的JVM内存,并且它们对共享的JVM对象的访问非常少,其中只有很少一部分访问涉及写入。
我们在启用NUMA的Linux上用Java编程。我们有128Gb RAM。我们有2个Opteron CPU(型号6274),每个都有16个内核。每个CPU有2个NUMA节点。在Intel四核(即8核)上运行的同一作业几乎线性扩展至8个线程。
我们已尝试将只读数据复制为每个线程一个,以希望大多数查找都可以在NUMA节点本地进行,但是我们发现此操作不会加快速度。
在32个线程中,“top”显示CPU的74%“us”(用户)和大约23%的“id”(idle)。但是没有 sleep ,几乎没有磁盘I/O。使用24个线程,我们可以获得83%的CPU使用率。我不确定如何解释“空闲”状态-这是否意味着“正在等待内存 Controller ”?
我们尝试打开和关闭NUMA(我指的是需要重新引导的Linux级别设置),但没有发现任何区别。启用NUMA时,“numastat”仅显示“分配和访问未命中”的大约5%(95%的缓存未命中是NUMA节点本地的)。 [编辑:]但是,将“-XX:+ useNUMA”添加为java命令行标志可以使我们提高10%。
我们有一种理论是,我们要最大化内存 Controller ,因为我们的应用程序使用大量RAM,并且我们认为有很多高速缓存未命中。
我们怎么办?(a)加速程序以实现线性可伸缩性,或(b)诊断正在发生的事情?
另外:(c)如何解释“最高”结果-“空闲”是否意味着“在存储 Controller 上被阻塞”? (d)Opteron与Xeon的特性有何不同?
最佳答案
我也有一台32核Opteron机器,带有8个NUMA节点(4x6128处理器,Mangy Cours,而不是Bulldozer),并且遇到了类似的问题。
我认为您的问题的答案在顶部显示了2.3%的“sys”时间。以我的经验,这个sys时间是系统在内核中等待锁定所花费的时间。当线程无法获得锁时,它将处于空闲状态,直到进行下一次尝试。 sys和空闲时间都是锁争用的直接结果。您说您的探查器未显示锁定是问题所在。我的猜测是,由于某种原因,导致问题锁的代码未包含在配置文件结果中。
就我而言,锁争用的一个重要原因不是我实际执行的处理,而是将工作分配给每个线程的工作调度程序。该代码使用锁来跟踪哪个线程正在执行哪个工作。我对这个问题的解决方案是重写我的工作计划程序,以避免互斥体,我已经读过它不能扩展到超过8-12个核,而使用gcc内置原子(我在Linux上用C编程)。原子操作实际上是一种非常细粒度的锁,可以在高内核数的情况下更好地扩展。在您的情况下,如果您的工作包裹确实确实需要5到10秒钟,这似乎对您来说就不那么重要了。
我还遇到了malloc的问题,在高内核数情况下,malloc遇到了可怕的锁定问题,但是我无法记住,这是否还会导致sys和idle数字出现,或者它是否刚刚出现使用Mike Dunlavey的调试器性能分析方法(How can I profile C++ code running in Linux?)。我怀疑它确实会导致系统和空闲问题,但是我在研究所有旧注释时发现了一条线:)我确实知道我现在尽可能避免运行时malloc。
我最好的猜测是,您正在使用的某些库代码在您不知情的情况下实现了锁,没有包含在性能分析结果中,并且无法很好地扩展到高内核数的情况。当心内存分配器!
关于parallel-processing - 多核CPU的: Programming techniques to avoid disappointing scalability,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465425/
人们在运行TwistedWeb服务器时使用哪些技术来利用多个处理器/内核?有推荐的方法吗? 我基于twisted.web的Web服务在Amazon EC2实例上运行,该实例通常具有多个CPU核心(8、
multicore 库中是否有类似 sapply 的东西?还是我必须 unlist(mclapply(..)) 才能实现这一点? 如果它不存在:推理是什么? 提前致谢,如果这是一个愚蠢的问题,我们深表
ZeroMQ 用于接收输入参数.. def server(): rep = context.socket(zmq.REP) rep.bind('tcp://*:{}'.format(P
我有一大组标量值分布在 3D 网格上(每个顶点一个值。) 我的目标是展示: 网格中值大于阈值的所有点。 并将连接的点分组(以简化显示。) 所以我的基本解决方案是: 找到通过阈值测试的点 对于每个没有被
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功、JAVA底层、面试、职业成长相关资料等更多精彩文章在公众号「 小牛呼噜噜 」 。 大家好,我是呼噜噜,
有没有办法让 J 使用多个核心?我认为 APL/J 的部分好处是语言结构很适合并行解决方案。 查看我的 CPU 使用率(我在 OSX 上),显然只有一个处理器在使用。 我有一个很重的函数 f 作用在一
多核处理器如何处理中断。 我知道单核处理器如何处理中断。 我也知道不同类型的中断。 我想知道多核处理器如何处理硬件、程序、cpu时序和输入/输出中断 最佳答案 这应该被视为 other answer
很长一段时间以来,我一直将 LLVM 视为我目前正在实现的语言的新后端。它似乎具有良好的性能,相当高级的生成 API,足够的低级支持来优化奇特的优化。此外,虽然我自己没有检查过,但苹果似乎已经成功地演
我最近开始研究低级OS编程。我(非常缓慢)目前正在研究两本较旧的书,即XINU和Build Your Own 32 Bit OS,以及上一个问题How to get started in operat
我正在阅读对新英特尔凌动 330 的评论,他们指出任务管理器显示 4 个内核 - 两个物理内核,另外还有两个由超线程模拟。 假设您有一个包含两个线程的程序。还假设这些是在 PC 上执行任何工作的唯一线
我不知道如何在 C++ 中进行线程化,我不仅不想知道,而且有没有一种方法可以将线程强制到不同的核心上?另外,我如何才能知道用户拥有多少个内核? 最佳答案 将线程绑定(bind)到任意 CPU 称为设置
如果需要在多核处理器机器的多个内核上并行执行,Linux 内核是否会同时执行多个上下文切换?有引用吗? 最佳答案 是的,你是对的。在 SMP 系统上,多个上下文切换同时发生。每个核心都可以独立进行上下
与进程相比,线程更不可能从多核处理器中获益,这是真的吗?换句话说,内核会决定在单核而不是多核上执行线程吗? 我说的是属于同一进程的线程。 最佳答案 我不知道(各种)Linux 调度程序如何处理这个问题
我需要一些帮助来决定在单个 Solr 实例中创建单个索引还是在单个 Solr 实例中创建多个核心,每个核心为一个索引提供服务。 我的理解是,solr 中的单个索引通常用于索引一种类型的文档。当您有不同
NGINX 或 Apache 是否受益于具有以下任一项的服务器: 多核,或者 多个处理器? 如果是,为什么? 最佳答案 使用多个 CPU/CPU 内核使服务器应用程序有机会并行处理多个客户端连接(和请
我正在为我的爱好操作系统开发 CPU 检测和一般环境检测代码。是否存在需要多次调用 CPUID 的情况?也就是说如果系统有多个核心,操作系统是否需要在每个核心上调用CPUID? NUMA 也是如此。
我有一些关于多核 CPU 或多处理器系统中使用的高速缓存存储器的问题。 (虽然与编程没有直接关系,但当一个人为多核处理器/多处理器系统编写软件时,它会产生很多影响,因此在此询问!) 在多处理器系统或多
所以,我一直在使用 opencv 开发实时跟踪系统。几天前,我不得不开始使用 directshow(这对我来说是全新的),因为我需要网络摄像头的更高分辨率。分辨率越高,CPU 使用率就越高。仅使用没有
我经常听说其他语言被提升为更适合多核/并发编程,例如Clojure、Scala、Erlang 等,但我有点困惑为什么我需要担心多核问题,Java/.NET VM 不应该自动处理吗?如果没有,背后的原因
假设 x86 多核 PC 架构... 假设有 2 个内核(能够执行 2 个单独的指令流),并且 CPU 和 RAM 之间的接口(interface)是内存总线。 调度在 2 个不同内核上的 2 条指令
我是一名优秀的程序员,十分优秀!