大量使用 RAM 时服务器计算速度变慢

Iva*_*man 5 performance centos numa

我在非常特定的情况下遇到服务器速度下降的问题。事实是:

  • 1) 我使用计算应用程序 WRF (Weather Research and Forecast)
  • 2) 我使用 Dual Xeon E5-2620 v3 和 128GB RAM(NUMA 架构 - 可能与问题有关!)
  • 3)我使用 mpirun -n 22 wrf.exe 运行 WRF(我有 24 个可用的逻辑内核)
  • 4) 我使用 Centos 7 和 3.10.0-514.26.2.el7.x86_64 内核
  • 5) Everthing 在计算性能方面工作正常,直到发生以下一件事:
  • 5a) linux 文件缓存获取一些数据,或
  • 5b) 我使用 tmpfs 并用一些数据填充它

在 5a 或 5b 场景中,我的 WRF 开始突然变慢,有时甚至比正常情况慢约 5 倍。

  • 6) RAM 没有被交换,它甚至不会发生,在最坏的情况下,我有大约 80% 的 RAM 可用!
  • 7) /etc/sysctl.conf 中的 vm.zone_reclaim_mode = 1 似乎有助于延迟 5a 场景中的问题
  • 8) echo 1 > /proc/sys/vm/drop_caches 完全解决了 5a 场景中的问题,将 WRF 性能恢复到最大速度,但只是临时的,直到文件缓存再次获取数据,所以我在 cron 中使用了这个命令(别担心,没关系,我只将计算机用于 WRF,它不需要文件缓存即可全速工作)
  • 9) 但是,上面的命令在 5b 场景中仍然没有任何作用(当我使用 tmpfs 作为临时文件时)
  • 10) 只有当我手动清空 tmpfs 时,才能在 5b 场景中恢复性能
  • 11) 这不是 WRF 或 mpi 的问题
  • 12)这仅发生在这一种计算机类型上,我为相同/相似的目的(WRF)管理了很多。只有这个具有完整的 NUMA 架构,所以我怀疑这与它有关
  • 13) 我也怀疑 RHEL 内核与此有关但不确定,还没有尝试重新安装到不同的发行版
  • 14) numad 和 numactl 选项可以像“numactl -l”一样调用 mpirun,没有任何区别

如果您有任何想法尝试避免这些减速,请告诉我。

在关注这个问题的一些“相关”链接后,我想到了一个想法。透明大页面可以成为这个问题的根源吗?一些文章强烈建议 THP 在 NUMA 系统上表现不佳。

Jar*_*era 0

我建议启用 numad 服务:

\n\n
yum install numad\nsystemctl enable numad\nsystemctl start numad\n
Run Code Online (Sandbox Code Playgroud)\n\n

numad 应该能够自动处理内存位置。进程在第一个 NUMA 节点的 CPU 上运行,但其数据位于第二个 NUMA 节点本地的 RAM 中的情况不应再发生(除非所需的内存量大于单个 NUMA 本地 RAM 的容量)节点)。

\n\n

我还建议使用配置文件配置调整服务,它最适合您的使用场景。您必须衡量差异并选择最好的(或者您可以创建一些定制的)。

\n\n
\n\n

也许我已经找到了你的节点上出现奇怪行为的原因。我搜索了 mpirun 并找到了手册页:

\n\n

https://www.open-mpi.org/doc/current/man1/mpirun.1.php

\n\n

有写到:

\n\n
\n

快速总结

\n\n

如果您只是想了解如何运行 MPI 应用程序,您可能需要使用以下形式的命令行:\n % mpirun [ -np X ] [ --hostfile ] \n 这将在您的应用程序中运行 X 个副本当前运行时环境(如果在受支持的资源管理器下运行,Open MPI\xe2\x80\x99s mpirun 通常会自动使用相应的资源管理器进程启动程序,而不是例如 rsh 或 ssh,后者需要使用主机文件,或者默认在本地主机上运行所有 X 副本),按 CPU 插槽以循环方式调度(默认情况下)。有关更多详细信息,请参阅本页的其余部分。

\n\n

请注意,从 v1.8 系列开始,mpirun 自动绑定进程。在没有任何进一步指令的情况下使用三种绑定模式:

\n\n

绑定到核心:\n 当进程数 <= 2 时

\n\n

绑定到套接字:\n 当进程数 > 2 时

\n\n

不绑定:\n 超额订阅时

\n\n

如果您的应用程序使用线程,那么您可能希望确保根本不绑定(通过指定 --bind-to none),或者使用适当的绑定级别或每个应用程序进程的特定数量的处理元素绑定到多个核心。

\n
\n\n

在 n=22 的情况下,没有应用绑定,并且可以重新定位线程。您可以尝试外部 CPU 绑定(如任务集)。你必须进行实验。

\n