Memory
為什麼要限制可用共享記憶體的總量?
我有一些大型記憶體程序在 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
{ 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;為您的流程設置單獨的限制,全域限制以確保避免交換並且整個系統仍然執行良好。