首页 > 解决方案 > 容器内的内存映射文件

问题描述

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

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

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

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

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

标签: linux-kernelcontainersmemory-mapped-files

解决方案


推荐阅读