Memory

為什麼要限制可用共享記憶體的總量?

  • August 5, 2016

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

引用自:https://serverfault.com/questions/794886