问题标签 [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.

0 投票
1 回答
83 浏览

cpu-architecture - 本地 CPU 可能会降低远程 CPU 的数据包接收性能

我有一台带有 2 个 Intel Xeon CPU E5-2620(Sandy Bridge)和一个 10Gbps 82599 NIC(2 个端口)的服务器,用于高性能计算。从 PCI 亲和性来看,我看到 10G 网卡连接到 CPU1。我启动了几个数据包接收线程进行实验,线程接收数据包,进行IP / UDP解析,并复制到缓冲区。我10G网卡用的驱动是IOEngine PacketShader/Packet-IO-Engine · GitHub

第一季度!空闲 CPU1 降低 CPU0 数据包接收性能

1.1) 如果 1 或 2 或 4 个线程绑定到 CPU0,所有线程的整体性能约为 2.6-3.2Gbps 1.2) 如果 2 个线程绑定到 CPU1,整体性能为 16.XGbps 1.3) 如果 4 个线程绑定到CPU1,综合性能19.XGbps(2*10G端口最大)

由于CPU0没有直接和网卡相连,看来CPU0上的最大接收速度是2.6-3.2Gbps。但是我发现如果在 CPU1 上运行一些计算密集型进程,CPU0 上的数据包接收线程在 2 个线程时提升到 15.XGbps,在 4 个线程时提升到 19.XGbps。

这是因为电源管理吗?如果CPU1空闲,它会在省电模式下运行吗?即使是这样,CPU1 又如何影响 CPU0 的性能呢?QPI有什么我不知道的吗?

第二季度!CPU1 过载会降低所有数据包接收性能

2.1)如果CPU0上运行1个收包线程,CPU1上运行1个收包线程,则综合性能为10Gbps。每个线程的性能几乎相同——5.X Gbps。2.2)如果CPU0上运行2个数据包接收线程,CPU1上运行2个数据包接收线程,综合性能为13Gbps。而且每个线程的性能几乎一样——3.X Gbps,低于2.1、1.2、1.3

简而言之,当接收到同时在 CPU0 和 CPU1 上运行的线程时,所有线程都无法发挥其最大性能,它们的性能几乎相同。

我认为关于 NUMA 和 QPI 有很多我不知道的地方,有人可以帮我解释一下吗?谢谢

0 投票
2 回答
1335 浏览

c - 在 NUMA 架构中按线程移动内存页

我有两个问题:

(i) 假设线程 X 在 CPU Y 上运行。是否可以使用系统调用 migrate_pages - 甚至更好的 move_pages(或它们的 libnuma 包装器) - 将与 X 关联的页面移动到连接 Y 的节点?

之所以出现这个问题,是因为两个系统调用的第一个参数都是 PID(我需要一个每线程方法来进行一些研究)

(ii) 在 (i) 的肯定回答的情况下,我怎样才能获得某个线程使用的所有页面?我的目标是,例如移动包含数组 M[] 的页面...如何将数据结构与其内存页面“链接”,以便使用上面的系统调用?

额外信息:我正在使用 C 和 pthreads。提前致谢 !

0 投票
1 回答
491 浏览

multithreading - Cilk中给线程分配任务,给NUMA节点分配线程

例如,有三个线程。

  • 线程 1 被分配了任务 1、2 和 3。
  • 线程 2 被分配了任务 4、5 和 6。
  • 线程 3 被分配了任务 7、8 和 9。

任务规模不统一。分配给一个线程的任务具有非常相似的工作集,因此当这三个任务都由同一个线程执行时,缓存将得到有效利用。我还应该注意,这些任务将在具有四个节点的 NUMA 系统上运行。四个线程中的每一个都必须分配给系统的一个节点。

我的问题是关于负载平衡。例如,如果线程 1 在其他任务之前完成其任务并且任务 9 未启动,我希望 Cilk 调度程序将任务 9 分配给线程 1。

欢迎所有解决方案,包括 Cilk Plus、OpenMP 或网络上免费提供的其他调度程序。

更新:线程必须分配给 NUMA 系统的节点,并且这些线程使用的内存位置必须分配在特定节点上。我已经成功地使用libnuma了 OpenMP。但是,我无法找到如何使用 Cilk、TBB 等将线程映射到节点。如果可以在 Cilk Plus 中获取生成的工作线程 id,我会使用numa_run_on_node(nodeid).

有关 NUMA 架构上 Cilk 可扩展性问题的更多信息:http ://www.sciencedirect.com/science/article/pii/S0167739X03001845#

0 投票
1 回答
892 浏览

linux - 给定 linux 内核模块中的页面指针,如何获取分配给它的 NUMA 节点 ID?

我正在研究检查点/重新启动 Linux 内核模块。其中,进程向该模块发送请求以检查点本身。在此进程中,有关进程的信息存储在一个文件中,稍后将使用该文件重新启动该进程。

现在,当此模块将与(进程的)页面相关的信息存储在文件中时,我们还想知道该页面分配在哪个 NUMA 节点上,您能建议什么是获取此数据的最佳方式(NUMA 页面节点映射)。由于我在内核空间中,我想使用 linux 内核函数本身来获取这些信息。

我尝试使用 page_to_nid(page),但我不确定它是否能给我正确的价值。(例如,我正在使用 linux 2.6.32,具有 16 个内核的 64 位机器,上面有 4 个 NUMA 节点(每个节点 4 个内核),但是这个函数在调用时返回 32)

谢谢,阿杰

0 投票
1 回答
83 浏览

multithreading - 对于大型多核机器上的数据密集型任务,多线程性能影响是什么?

我正在阅读一篇关于大型多核机器上的多线程性能问题的帖子: http ://www.reddit.com/r/Python/comments/1mn12l/what_you_do_not_like_in_python/ccbc5h8 该帖子的作者声称在大型多核系统中多线程应用程序对性能的影响比多处理应用程序大得多。

AFIAK 多线程现在比多处理便宜(在系统管理和上下文切换方面)。为简单起见,假设我们不需要使用锁。

如果我们不使用锁来保护共享内存,那么管理多线程应用程序及其对资源的访问是否存在任何系统限制?

当多线程具有巨大的性能影响(帖子作者有)时,是否有任何非用户空间实现相关的原因?
换句话说:与类似的多进程解决方案相比,导致数据密集型多线程应用程序性能不佳的系统级属性是什么?

我知道线程和进程之间的语义差异。

0 投票
1 回答
478 浏览

java - 多线程降低了 NUMA 上的套接字吞吐量

我在一台装有 Red Had Linux 的 16 核 NUMA 机器上对 Java 程序进行了基准测试。我根据每秒能够接收和发送的数据包数量(64 字节大小)来测量 Java DatagramSocket(用于 UDP)的吞吐量。该程序由一个套接字和 n 个正在侦听套接字的线程组成。当一个数据包到达时,他们会将有效负载复制到一个 byte[] 数组中,使用该数组创建一个新的 DatagramPacket 并将其直接发送回它的来源。将其视为 UDP 层上的 ping。

  1. 我发现当使用多个线程(即两个或四个)时,Java DatagramSocket 套接字的吞吐量要小得多。如果我只使用一个线程来监听套接字,我可以实现每秒 122,000 个数据包的吞吐量,而多个线程只能实现每秒 65,000 个数据包的吞吐量。现在,我知道线程可能会在 NUMA 机器的任何核心上执行,并且如果内存必须从一个节点传输到另一个节点,那么内存访问会变得很昂贵。但是,如果我有两个线程,那么只有一个应该在“错误”的核心上执行,而另一个应该仍然可以实现非常高的吞吐量。另一种可能的解释是 Datagramsocket 中的同步问题,但这些只是猜测。有人对真正的解释有很好的了解吗?

  2. 我发现在多个端口上多次(并行)执行这个程序可以获得更高的整体吞吐量。我用一个线程启动程序四次,每个程序都使用一个单独端口(5683、5684、5685 和 5686)上的套接字。四个程序的总吞吐量为每秒 370,000 个数据包。总之,在同一个端口上使用多个线程会降低吞吐量,而在一个线程上使用多个端口会增加吞吐量。这怎么解释?

系统规格:

硬件: 2 个 AMD Opteron(TM) 处理器 6212 处理器上的 16 个内核,组织在 4 个节点中,每个节点具有 32 GB RAM。频率:1.4 Ghz,2048 KB 缓存。

该操作系统是 Red Hat Enterprise Linux Workstation 版本 6.4 (Santiago),内核版本为2.6.32-358.14.1.el6.x86_64. Java 版本"1.7.0_09"、Java(TM) SE 运行时环境 ( build 1.7.0_09-b05)、Java HotSpot(TM) 64 位服务器 VM ( build 23.5-b02, mixed mode),我使用了该-XX:+UseNUMA标志。服务器和客户端通过 10GB 以太网连接。

0 投票
1 回答
1523 浏览

linux - 在 linux(CentOS)/多处理器设置中,如何将 CPU 内核分配给 NUMA 节点?

我正在开发一个安装了 CentOS 的 Quad Operton 6272 系统。我怀疑 NUMA 配置有问题。

当我跑步时,numactl --hardware我得到:

有 4 个 CPU 芯片,所以有 5 个 NUMA 节点对我来说毫无意义。

谁能告诉我分配给 NUMA 节点的 CPU 内核在哪里?

0 投票
1 回答
321 浏览

c++ - 如何在 NUMA 机器上的不同节点上分配数组的一部分?

我有 2 个节点的 NUMA 机器。我想分别在两个节点上分配数组的两半。我怎样才能做到这一点?

请注意,“一半”是指连续的虚拟内存块。我找到了 numa_alloc_interleaved 函数,但它不能满足我的要求。

0 投票
1 回答
1798 浏览

linux - 修改Linux Kernel中Sysfs的/sys/devices/system/memory/目录

我正在做我的课程作业,以修改 Linux 内核中 Sysfs 的内存目录。在获得教授的许可后,我正在向这里的人寻求帮助。这正是我想要做的。

背景:如果我有 4 GB RAM,我的主板上可以有 4 X 1 GB DIMMS 或 2X 2GB DIMMS。Linux 支持 NUMA,方法是将此 4GB 物理内存分成许多块,每个块具有特定的起始和结束物理地址。Sysfs 中的“设备”目录包含全局设备层次结构。这包含已被内核注册的总线类型发现的每个物理设备。因此,有关内存块的详细信息存储在 Linux 内核的路径“/sys/devices/system/memory/”中。在这个目录中,我们有一个名为“block_size_bytes”的文件,它决定了我的 RAM 可以分成多少部分。例如在我的系统中它是 8000000,因此 RAM 被分成 32 个内存文件夹,从 memory0 到 memory43。每个“memoryX”目录都会有一个名为“ state' 表示内存块的在线/离线状态。如果我想“关闭”特定的内存块,我可以在在线/离线之间切换。

所以这就是我真正想做的事情:

我想将整个目录结构修改为 4 个目录。为什么是4?因为,我的主板上有 4 X 1GB DIMM,所以我想将这 32 个内存块减少到 4 个大块,这样我就可以通过切换它的“状态”在线/离线来控制我想要的任何 DIMM。所以基本上我想改变 DIMM 级别的内存状态。

这几乎就是我的问题描述。

我的方法:我已经阅读了 sysfs 文件系统并尝试查找负责组织 sysfs 的“内存”目录的内核模块。我想找到该模块并根据我的要求对其进行编辑并编译该模块。越来越难找到关于这个主题的具体文档,这导致我提出这个问题。我所能找到的只是这个 C 编程文件“/lib/modules/3.8.0-19-generic/source/drivers/base/memory.c”,它有设置内存块“状态”的方法,显示每个内存部分的起始和结束物理地址以及许多其他方法。但我无法弄清楚这些方法究竟在哪里被调用,或者哪个模块正在利用这个 C 文件来设置所有属性。

你能告诉我我需要寻找哪个确切的模块吗?如果您发现我的方法不对,请您指出正确的方向吗?

提前致谢 :)

0 投票
0 回答
144 浏览

c++ - NUMA 多处理器机器上的不明白计时

我是 NUMA 主题的新手。我还需要说我是一名程序员,对硬件没有深入的了解。

我正在使用 Quad Operton 6272 服务器。主板是SuperMicro H8QGi+-F,总共有 132GB 内存(8 个16GB 棒)。

记忆棒安装在主板插槽 1A 和 2A 中 - 每个 Operton“包装”两个。本文档解释了一个 Operton “CPU” 是一个分层的东西:package->die->module->core。使用此设置,'numactl --hardware' 报告 4 个 NUMA 节点、16 个 CPU 和 32GB 内存。我不确定将记忆棒放入插槽 1A 和 2A 是否是最好的做法,但这是我正在尝试使用 ATM 的方法。

我写了一个测试 C++ 程序来帮助我理解 NUMA 内存访问的属性

该程序分配缓冲区,用随机整数填充它们,并对它们进行一些无意义的计算。通过循环迭代,我们改变分配缓冲区的线程/核心编号和完成工作的核心/线程编号。内存分配在线程 0,8,16,...,56 上完成。一次只有 16 个线程在进行计算,它们是线程16i16(i+1)

我正在计算完成一个工作单元和完成 20 个工作单元所需的时间。这样做是为了查看一些线程完成执行时速度的变化。

从我之前的实验中,我注意到线程8i8i+7的内存访问时间是相同的。所以我只是输出8个样本的平均时间。

让我描述一下我的程序产生的输出结构。在最外层有块,每个对应一个线程进行内存分配/初始化。每个这样的块包含 4 行,每行对应于一个进行计算的 Operton“包”(如果分配的核心属于当前的 Operton“包”,那么我们预计工作会很快完成)。每行由两部分组成:第一部分对应于封装的核心 0-7,第二部分对应于核心 8-15。

这是输出:

例如,对应于 core #16 分配的块中的第四行是“3.1222|45.1603 / 1.91962|37.9283”。这意味着平均而言,核心 48-55 3.1222s 完成第一个工作单元,45.1603s 完成所有 20 个工作单元(不是 20 倍,因为当核心 56-63 完成时显然有加速)。该行的后半部分告诉我们,平均而言,完成第一次迭代需要 56-63 个内核 1.91962 秒,完成所有 20 次迭代需要 37.9283 秒。

我无法理解的事情:

  1. 例如,当分配完成时,在线程 8 上,线程 0-7 仍然在线程 8-15 之前完成工作。我希望执行分配和初始化的线程至少不晚于所有其他线程完成。
  2. 四个 Operton 软件包之间存在一些不对称性。例如,平均访问 package1 的内存(由内核 0 或 8 分配时)比访问 package4 的内存(由内核 48 或 56 分配)更快。

任何人都可以对为什么会发生这种情况提供任何见解吗?