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

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

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

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

为什么共享内存有这样的限制? 我可以限制用户或进程使用限制或cgroup的总内存。 为什么我要限制系统上可用的总共享内存? 当系统有很多共享内存需要pipe理时,系统是否会受到影响?

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

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; } 

Linux的限制哲学在过去的21年中有所发展。 当时,全球范围的devise模式占主导地位。 你不想把所有的内存用于IPC,所以你需要为它设置一个高水位标记,以确保有足够的空间来存放所有其他的东西。 这可以与现代cgroups一起工作; 为您的stream程提供单独的限制,避免交换的全局限制,整个系统仍然运行良好。