我有一些大型内存进程在 CentOS 7 系统上共享内存。我正在为他们调整内存系统。对于 kernel.shmmax 和 kernel.shmall,RedHat 文档指出:
kernel.shmmax 定义了 Linux 进程可以在其虚拟地址空间中分配的单个共享内存段的最大大小(以字节为单位)。
kernel.shmall 设置可以在系统范围内使用的共享内存页面的总量。
为什么共享内存有这样的限制?我可以通过限制或 cgroups 限制用户或进程使用的总内存。为什么要限制系统上可用的共享内存总量?当需要管理大量共享内存时,系统是否会受到性能影响?
这是系统卫生的一部分,也是一些遗留问题。cgroup 控件对于 Linux(2.6.24 及更高版本)来说相对较新,其中 shmmax/shmall 早在 1.2.x 系列的内核中就存在:
ipc/shm.c
在过去的 21 年中,Linux 的限制哲学不断发展。那时,全局限制的设计模式占主导地位。您不想将所有 RAM 用于 IPC,因此您需要为其设置一个高水位线,以确保有足够的空间用于其他所有内容。这也适用于现代 cgroup;为您的流程设置单独的限制,全局限制以确保避免交换并且整个系统仍然运行良好。