linux-kernel - 容器内的内存映射文件
问题描述
今天我们有一个水平扩展的(批处理)应用程序,我们在多个服务器上运行多个进程。所有进程在同一个物理层上运行。机器与客户和合同相关数据共享大量(~100 GB)只读内存,我们预先加载这些数据,并且仅将这些数据加载到内存中。每个 phys 服务器将相同的数据加载到 mem 中。由于性能原因,我们正在将数据加载到内存中。我们尝试了 Redis 之类的,但是性能下降了。
由于所有数据都是只读的,我们正在考虑对它们进行内存映射。每个进程理论上都会加载相同的文件,但是因为我们会对它们进行内存映射并且它们是只读的,所以操作系统应该(惰性)按需加载它们,仅加载它们,并且基于可用的物理内存。另一个优势是每个进程现在都与任何其他进程完全解耦,这在 K8S/容器环境中具有巨大的优势。
下一步是,我们要将进程(然后使用 mmap)放入容器中。但是我们还没有找到一种方法来证明映射文件只加载了那些,尽管这些进程现在位于不同的容器中(如果在同一台服务器上)。就我们目前的知识而言,容器不会改变映射文件的行为,但我们想确定一下。
由于不同的 Linux 发行版和版本似乎有不同的含义... => 我们使用的是相当新的 RedHat 版本,但 Ubuntu 也可以。我们发现了几种不同的(linux)工具和方法来列出有关映射文件等的信息,例如哪个进程正在映射哪个文件。可能我们只是偏执狂,但到目前为止我们发现的信息都没有明确说明:这个文件(或文件块),加载到这个物理位置,分配给进程 X、Y 和 Z,并且可以通过虚拟访问在这些过程中地址 A、B、..。
任何关于容器是否改变 mmap 行为以及如何证明 mmaped 文件仅加载的见解都将非常受欢迎。
解决方案
推荐阅读
- swift - 如何在 Swift 中导出 16 位 HEIF 图像?
- google-sheets - 向下复制自定义颜色格式
- amp-html - AMP 页面上的内部链接
- javascript - 在 JavaScript 计算器中添加两位数时出现问题
- javascript - 如何在 JS 变量中为 URL 设置“img src=”?
- apache - 使用 apache htaccess,允许访问父目录中限制的子目录中的文件
- javascript - 如何使用 shell 脚本将 html 中的外部 CSS 文件链接替换为 CSS 文件的内容?
- javascript - 我的列 highcharts 没有呈现任何数据
- apache - .htaccess mod_rewrites 将文档根附加到 URL
- flutter - 当应用程序在“调试和运行”和“直接运行”之间启动时,颤振“windows.locales”返回不同的值