为什么要限制可用的共享内存总量?

为什么要限制可用的共享内存总量?

我有一些在 CentOS 7 系统上共享内存的大内存进程。我正在为它们调整内存系统。对于 kernel.shmmax 和 kernel.shmall,RedHat 文档指出:

kernel.shmmax 定义 Linux 进程在其虚拟地址空间中可分配的单个共享内存段的最大大小(以字节为单位)。

kernel.shmall 设置系统范围内可使用的共享内存页的总量。

为什么对共享内存有这样的限制?我可以使用 limits 或 cgroups 来限制用户或进程使用的总内存。为什么我要限制系统上可用的总共享内存?当系统需要管理大量共享内存时,性能是否会受到影响?

答案1

这是系统卫生的一部分,也是遗留问题。cgroup 控制对于 Linux(2.6.24 及更高版本)来说相对较新,而 shmmax/shmall 早在 1.2.x 系列中就已存在于内核中:

ipc/shm.c

    {
            struct shminfo shminfo;
            if (!buf)
                    return -EFAULT;
            shminfo.shmmni = SHMMNI;
            shminfo.shmmax = SHMMAX;
            shminfo.shmmin = SHMMIN;
            shminfo.shmall = SHMALL;
            shminfo.shmseg = SHMSEG;
            err = verify_area (VERIFY_WRITE, buf, sizeof (struct shminfo));
            if (err)
                    return err;
            memcpy_tofs (buf, &shminfo, sizeof(struct shminfo));
            return max_shmid;
    }

在过去的 21 年里,Linux 的限制理念不断发展。当时,全局限制的设计模式占主导地位。您不想将所有 RAM 用于 IPC,因此您需要为其设置一个高水位线,以确保有足够的空间用于其他所有操作。这也可以与现代 cgroup 配合使用;为您的进程设置单独的限制,并使用全局限制来确保避免交换,并且整个系统仍然运行良好。

相关内容