Linux 共享内存“段”与“页面”有什么区别?

Linux 共享内存“段”与“页面”有什么区别?

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 即可。

8MiB / 4096 字节 = 2048

将 shmall 设置为 2048。

现在假设您知道对于 postgres 来说,您只需要一个大小为 512K(KiB,而不是 KB)的段。您拥有计算应将 shmall 设置为的最小数字所需的所有数据。

ceil(512KiB / 4096 字节)= 128

您应该将 shmall 设置为最小值 128 页。没有什么可以阻止您将其设置为更高值。Shmall 只是一个限制,指定您不会将超过该数量的内存用于共享内存,无论是一个段还是十个段。

相关内容