这Linux 内核文档说:
简写:
此参数设置系统范围内可使用的共享内存页总量。因此,SHMALL 应始终至少为 ceil(shmmax/PAGE_SIZE)。
但我找不到页.shmmax
定义共享内存的最大大小部分。所以我不明白这一段和这ceil(shmmax/PAGE_SIZE)
部分。
(我正在研究这个问题以确定如何为 postgres 设置我的服务器。)
答案1
页:固定长度的连续虚拟内存块。
段:段是您进入共享内存的接口。段由一个或多个页面组成。如果您(或您的进程)尚未创建段,则您没有使用共享内存。
ceil:又称为“ceiling”。一个定义明确的数学函数,返回下一个最高整数(又称为向上舍入)。 参见维基百科:地板和天花板函数
PAGE_SIZE 是操作系统用于分割其内存块的字节数。您可以使用 getconf 找到大小:
# getconf PAGE_SIZE
PAGE_SIZE 4096
shmmax 是任何单个段的最大大小(以字节为单位)(不是页面)。
shmall 至少需要为 'ceil(shmmax/PAGE_SIZE)',因为如果小于这个值,您就无法创建大小为 shmmax 的段。您将用尽可用的页面。
假设您希望在系统上使用不超过 8MiB(MB 以 10 为基数,MiB - 兆字节以 2 为基数,即您的计算机在计算大小时实际使用的大小)的共享内存。
要找到 8MiB 的页数,只需除以 PAGE_SIZE 即可。
将 shmall 设置为 2048。
现在假设您知道对于 postgres 来说,您只需要一个大小为 512K(KiB,而不是 KB)的段。您拥有计算应将 shmall 设置为的最小数字所需的所有数据。
您应该将 shmall 设置为最小值 128 页。没有什么可以阻止您将其设置为更高值。Shmall 只是一个限制,指定您不会将超过该数量的内存用于共享内存,无论是一个段还是十个段。