问题标签 [numa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
numa - 测量远程内存访问的百分比
我在 NUMA 机器上工作,有 2 个节点。我正在尝试分析代码以测量对远程内存的内存访问百分比。
我的机器是 AMD Interlagos (Family 15h)。Perf 支持是在 Linux 3.9 中引入的,但我在升级到 3.8 之后的内核版本时遇到了问题,所以目前我正在寻找替代方案。
我看过 PAPI,但不知道如何使用 Native Event。
java - Java 进程报告“不正确”的可用处理器数量
我在 8 节点 NUMA 机器上运行 Java 1.6 进程,使用:
每个节点有 8 个 CPU,报告如下numactl --hardware
:
函数调用Runtime.getRuntime().availableProcessors()
返回64
。
尽管有限制,为什么Runtime
进程的对象报告 64 个可用处理器?cpunodebind
有没有办法获得 Java 进程可用的实际处理器数量?
c++ - Linux 上的 memcpy 性能不佳
我们最近购买了一些新服务器,但 memcpy 性能不佳。与我们的笔记本电脑相比,服务器上的 memcpy 性能要慢 3 倍。
服务器规格
- 机箱和主板:SUPER MICRO 1027GR-TRF
- CPU:2x Intel Xeon E5-2680 @ 2.70 Ghz
- 内存:8x 16GB DDR3 1600MHz
编辑:我还在另一台规格稍高的服务器上进行测试,并看到与上述服务器相同的结果
服务器 2 规格
- 机箱和主板:SUPER MICRO 10227GR-TRFT
- CPU:2x Intel Xeon E5-2650 v2 @ 2.6 Ghz
- 内存:8x 16GB DDR3 1866MHz
笔记本电脑规格
- 机箱:联想W530
- CPU:1x Intel Core i7 i7-3720QM @ 2.6Ghz
- 内存:4x 4GB DDR3 1600MHz
操作系统
编译器(在所有系统上)
还根据@stefan 的建议使用 gcc 4.8.2 进行了测试。编译器之间没有性能差异。
测试 代码 下面的测试代码是一个固定测试,用于复制我在生产代码中看到的问题。我知道这个基准很简单,但它能够利用和识别我们的问题。该代码在它们之间创建了两个 1GB 缓冲区和 memcpy,对 memcpy 调用进行计时。您可以使用以下命令在命令行上指定备用缓冲区大小:./big_memcpy_test [SIZE_BYTES]
要构建的 CMake 文件
测试结果
如您所见,我们服务器上的 memcpys 和 memsets 比我们笔记本电脑上的 memcpys 和 memsets 慢得多。
不同的缓冲区大小
我尝试了从 100MB 到 5GB 的缓冲区,结果都相似(服务器比笔记本电脑慢)
NUMA 亲和力
我读到有人在使用 NUMA 时遇到性能问题,所以我尝试使用 numactl 设置 CPU 和内存关联,但结果保持不变。
服务器 NUMA 硬件
笔记本电脑 NUMA 硬件
设置 NUMA 亲和性
非常感谢任何解决此问题的帮助。
编辑:GCC 选项
根据评论,我尝试使用不同的 GCC 选项进行编译:
编译时将 -march 和 -mtune 设置为 native
结果:完全相同的性能(没有改进)
使用 -O2 而不是 -O3 编译
结果:完全相同的性能(没有改进)
编辑:将 memset 更改为写入 0xF 而不是 0 以避免 NULL 页面 (@SteveCox)
使用 0 以外的值进行 memsetting 时没有改进(在这种情况下使用 0xF)。
编辑:Cachebench 结果
为了排除我的测试程序过于简单,我下载了一个真正的基准测试程序 LLCacheBench ( http://icl.cs.utk.edu/projects/llcbench/cachebench.html )
我分别在每台机器上构建了基准测试以避免架构问题。下面是我的结果。
请注意,非常大的差异是较大缓冲区大小的性能。最后测试的大小 (16777216) 在笔记本电脑上以 18849.29 MB/秒的速度运行,在服务器上以 6710.40 的速度运行。这大约是性能差异的 3 倍。您还可以注意到,服务器的性能下降比笔记本电脑要严重得多。
编辑:memmove() 比服务器上的 memcpy() 快 2 倍
基于一些实验,我尝试在我的测试用例中使用 memmove() 而不是 memcpy() 并发现服务器上的改进是 2 倍。笔记本电脑上的 Memmove() 运行速度比 memcpy() 慢,但奇怪的是运行速度与服务器上的 memmove() 相同。这就引出了一个问题,为什么 memcpy 这么慢?
更新了测试 memmove 和 memcpy 的代码。我必须将 memmove() 包装在一个函数中,因为如果我将其保留为内联 GCC 会对其进行优化并执行与 memcpy() 完全相同的操作(我假设 gcc 将其优化为 memcpy,因为它知道位置不重叠)。
更新结果
编辑:天真的 Memcpy
根据@Salgar 的建议,我实现了自己的幼稚 memcpy 函数并对其进行了测试。
朴素的 Memcpy 源
与 memcpy() 相比的朴素 Memcpy 结果
编辑:装配输出
简单的 memcpy 源码
组装输出:这在服务器和笔记本电脑上完全相同。我正在节省空间,而不是两者都粘贴。
进步!!!!asmlib
根据@tbenson 的建议,我尝试使用asmlib版本的 memcpy 运行。我的结果最初很差,但在将 SetMemcpyCacheLimit() 更改为 1GB(我的缓冲区大小)后,我的运行速度与我幼稚的 for 循环相当!
坏消息是 memmove 的 asmlib 版本比 glibc 版本慢,它现在运行在 300 毫秒标记处(与 glibc 版本的 memcpy 相当)。奇怪的是,在笔记本电脑上,当我将 SetMemcpyCacheLimit() 设置为大量时,它会损害性能......
在下面的结果中,标有 SetCache 的行将 SetMemcpyCacheLimit 设置为 1073741824。没有 SetCache 的结果不调用 SetMemcpyCacheLimit()
使用 asmlib 中的函数的结果:
开始倾向于缓存问题,但这会导致什么?
java - 为 hadoop 启用 UseNUMA 标志?
我希望为使用 java 的 hadoop 框架启用 UseNUMA 标志。
问题是我不知道hadoop框架调用了java命令的哪些地方。
所以,我写了 java 命令的别名/etc/bash.bashrc
为
这是正确的方法吗?
我怎么知道标志是否打开?我的意思是可以使用以下命令进行检查
但是如何检查hadoop是否正在使用它?
caching - 缓存一致性问题是否也适用于 UMA 架构?
我了解到共享内存计算机体系结构可以分为统一内存访问(UMA)和非统一内存访问(NUMA),这取决于对给定内存位置的访问时间是否对于所有处理器都相同。我还了解到,NUMA 架构可以进一步分为缓存一致和非缓存一致,这取决于它们是否具有将修改数据从一个处理器(或核心)缓存传播(或无效)到另一个处理器的机制,导致到术语“ccNUMA”。(如果我有任何错误,请纠正我......)
基于这个问题,我的理解也是,NUMA这个词专门指的是对主内存的访问时间,而不是缓存,所以即使大多数多处理器系统都必须有分布式缓存,如果这些系统有统一的访问权限,它们仍然被称为UMA主内存。
我不明白的是:为什么很少提到“ccUMA”架构的概念?例如,维基百科只有一个ccNUMA页面(重定向到 NUMA),而不是 ccUMA,并且Cache Coherence页面没有明确引用任何一个(除了它链接到Distributed Shared Memory,这似乎大致等效到 NUMA...)此外,谷歌搜索 ccUMA返回的结果远少于 ccNUMA...
缓存一致性问题是否不适用于 UMA 架构?在我看来确实如此,但为什么从未提及呢?
c++ - 如何在特定的 NUMA 内存节点上实例化 C++ 对象?
简单的 C 代码可以使用libnuma
库在 NUMA 系统中的特定内存节点中分配内存。例如,可以使用以下函数来完成:
如何在某个内存节点中实例化一个类?我能想到的一种方法是:
这行得通吗?
performance - 软件缓存是否应该提高 NUMA 机器上的性能
由于 NUMA 机器没有本地缓存,软件缓存实现会提高需要访问远程内存的任务的性能吗?
linux - 什么是真正的 pte(相对于 NUMA 中的迁移 pte)
当我阅读 Linux 中的 NUMA 文档并通过源代码时,我可以看到它们用普通 PTE 替换了迁移条目,它是类型为SWP_MIGRATION_WRITE
orSWP_MIGRATION_READ
的 PTE。那么,什么是普通PTE?应该包含什么样的信息?
linux - 用于编写页面的 NUMA 代码与 Linux 交换的其余部分之间的链接在哪里
因此,对于 Linux 中的普通页面,try_to_unmap
为特定页面创建一个交换条目,然后pageout
通过调用它来处理将其写入交换空间mapping->a_ops->writepage
。现在,shrink_page_list
将各个部分连接在一起。
另一方面,对于 NUMA 页面,try_to_unmap
会为特定页面创建一个 NUMA 迁移条目,但我看不到它在代码中实际写出的位置以及代码中的哪些内容粘合在一起。
有谁知道链接?
谢谢。
java - 高效使用 NUMA 架构
我正在编写一个使用密集型 CPU 和内存的多线程 Java 程序。该程序的目标是在图上执行一些算法。该程序在运行 linux 的 NUMA 机器上执行,我希望获得最佳性能。
为此,我为每个 NUMA 节点制作了多个图形副本,以便每个线程都能够访问本地内存上的图形。
本地内存分配的部分已经通过在分配图的每个新副本之前设置亲和性来完成。这是用 jna 完成的,所以如果可能的话,我更愿意继续使用这个库而不是添加 jni 代码。
我的问题是如何检查工作线程正在运行哪个内核以便从本地内存中读取?
我了解线程到核心的绑定在执行期间可能会发生变化。但是,内核尝试在所有时间片上在同一个 NUMA 节点上运行线程。因此,仅在开始时检查线程在哪个内核上运行对于大多数情况都有效。