容器内的内存映射文件

问题描述

今天我们有一个水平扩展的(批处理)应用程序,我们在多台服务器上运行多个进程。所有进程都运行在同一个 phys 上。机器共享大量(~100 GB)只读内存与客户和合同相关数据,我们预先将这些数据加载到内存中。每个 phys 服务器将相同的数据加载到 mem 中。由于性能原因,我们正在将数据加载到内存中。我们尝试了Redis之类的,但是性能下降了。

由于所有数据都是只读的,我们正在考虑对它们进行内存映射。每个进程理论上都会加载相同的文件,但是因为我们会对它们进行内存映射并且它们是只读的,所以操作系统应该只(懒惰)按需加载它们,仅加载它们,并且基于可用的物理内存。另一个优势是每个进程现在都与任何其他进程完全解耦,这在 K8S/容器环境中具有巨大的优势。

下一步是,我们要将进程(然后使用 mmap)放入容器中。但是我们还没有找到一种方法来证明 mmapped 文件只加载了那些,尽管进程现在在不同的容器中(如果在同一台服务器上)。据我们目前所知,容器不会改变 mmaping 文件的行为,但我们想确定。

由于不同的 Linux 发行版和版本似乎有不同的方法... => 我们使用的是相当新的 RedHat 版本,但 Ubuntu 也可以。我们发现了几种不同的(linux)工具和方法来列出有关 mmapped 文件等的信息,例如哪个进程正在映射哪个文件。可能我们只是偏执,但到目前为止我们找到的信息都没有明确说明:这个文件(或文件块),加载到这个物理位置,分配给进程 X、Y 和 Z,并且可以通过虚拟访问地址 A、B、.. 在这些进程中。

任何关于容器是否改变 mmap 行为的见解,以及如何证明 mmapped 文件只加载那些,将非常受欢迎。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)