我对 shmmax 中的最大值应该设置多少感到困惑。
查看了我的系统统计数据后,它显示以下内容:
#cat /proc/sys/kernel/shmmax
18446744073692774399
#ipcs -l
------ Messages Limits --------
max queues system wide = 3675
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509465599
max total shared memory (kbytes) = 18014398442373116
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
理想情况下,共享内存的值不应超过实际 RAM 大小(即 21474836480 字节)。那么这可能吗?或者这是一个垃圾值。
答案1
您显示的值:18446744073692774399
对应于:0xFFFFFFFFFEFFFFFF
或 1111 1111 1111 1111 1111 1111 1111 1111 63 47 1111 1110 1111 1111 1111 1111 1111 1111 31 15
所以它不完全是 64 位无符号整数的最大值,但差不多。
答案2
默认值设置为 64 位系统上的最大可能无符号长整型 (2^64) = 18446744073709551616(我猜测减去一些必要的内存空间)。
如果最大共享 RAM 值 > 实际 RAM,则意味着所有可用 RAM 都可以共享。您可以随时降低它,但默认情况下它是(接近)全部。
他们将 1 个无符号长整型数位移位 24(1UL << 24)= 16777216,然后从理论最大值中减去该值,得到结果。
18446744073709551616-16777217=18446744073692774399
答案3
我在谷歌上搜索你的问题,只找到了关于如何配置shmmax
和shmall
参数的文档。最好的一个是在这个答案。所以对于您的问题,如果您shmmax
将其设置为更高的值,超过您拥有的 RAM,那么它就是垃圾值,系统不允许将超过您拥有的 RAM 用于共享内存(不知道交换)。