我们正在建立一个基于 Linux 的基准测试集群。每个节点都将是一个无头、无盘机器,通过 tftp 启动,操作系统复制到本地 RAM 驱动器,并且相同的 RAM 驱动器被基准测试应用程序用作本地驱动器。我的问题如下:
这些机器有 2 个 CPU,每个 CPU 都有自己的内存条,并且有 4 个通往这些内存条的内存通道(因此这些内存条填充了 4 个内存芯片的倍数,以获得最大内存吞吐量)。如果我无法控制 ramdisk 使用哪些内存区域,那么它可能会在单个通道上的一个区域中创建,并使用该芯片上的所有内存。这意味着当我的应用程序运行时,在从其内存组中获取 ramdisk 的 CPU 上运行的线程的“本地”内存的内存带宽将比另一个 cpu 上的线程少 25%。那将是坏的。因此需要控制 ramdisk 使用哪些内存区域。
或者这不是问题,我可以相信内存控制器会在 4 个通道的芯片之间以跨步方式布置连续的内存地址?这是有道理的,因为当将大块内存拉入缓存时,这可以最大化内存带宽。
我只是不知道这些东西是如何工作的,希望得到一些启示......
答案1
您使用的tmpfs
是 ramdisk 支持吗?
如果是这样,您可以使用该参数mpol
分配给特定的 NUMA 节点(请注意,您的内核需要启用 CONFIG_NUMA)。
mount -t tmpfs -o size=32g,mpol=prefer:0 tmpfs /mnt/ramdisk
将创建安装在 /mnt/ramdisk 的 NUMA 节点 0 上首选的 32GB ramdisk
tmpfs 的文档相当不错:https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt