我试过
ipcs-lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 67108864
max total shared memory (kbytes) = 34359738368
min seg size (bytes) = 1
和
cat /proc/sys/kernel/shmmni
4096
cat /proc/sys/kernel/shmmax
68719476736
cat /proc/sys/kernel/shmall
8589934592
从我读过的文档中,我了解到它们描述的是相同的值,但它们是不同的。你能解释一下它们之间有什么区别吗?
干杯
答案1
在 Linux 上,ipcs 会从 读取共享内存限制/proc
。只有当失败时,它才会重新使用shmctl()
。并且# define SHMMIN 1
显然 中没有/proc
。
/proc/sys/kernel/shmall
单位是页,ipcs转换max total shared memory
为KB。/proc/sys/kernel/shmmax
单位是字节,ipcs转换max seg size
为KB。
源代码是 util-linux 包,其中一个镜像位于 https://github.com/karelzak/util-linux/blob/stable/v2.33/sys-utils/ipcs.c
请注意,do_shm() 会执行页面大小单位转换:
uint64_t tmp, pgsz = getpagesize();
tmp = (uint64_t) lim.shmall * pgsz;
(因为最大总共享内存/shmall = 页面大小,可以告诉你你的机器有 4 KB 的页面。这是预料之中的,这是非常常见的。)