我在新的 Postgres 13 DB 上启用了大页,在 EL8 Linux 上运行(huge_pages=try),并注意到 Shmem 仍在增长,并且尚未使用大页(但我看到大页已设置)。THP 已禁用。
我尝试在一个大表上执行 SELECT * ,shmem 增长了几 GB,但使用的大页数仍然为零。
上次我在 Postgres DB 上设置大页面时,我认为发生了同样的事情,但最终它开始使用大页面,并且 shmem 使用率下降到接近零(大概只有锁和 shmem 中使用的东西)。
开始使用大页面而不是 shmem 有何意义?内部发生了什么来驱动行为/决定?
大概我需要一个在 Postgres 中使用匿名页面的操作,也许 SELECT * 是所有文件页面?但我认为不会。是否有更好的(无害的、不引人注目的,除了 RAM 密集型的)查询来强制 Postgres 使用一堆匿名页面(大页面)?
目前(第 16 页及更高版本)postgresql 仅在分配共享内存段时才使用大页,因此仅在启动 DBMS 时才使用大页。这在以后的数据库操作中不会改变。
当使用
huge_pages=try
DBMS时,在启动时会首先尝试使用大页向操作系统请求一个内存段;如果失败,它将请求常规内存段。由于您的数据库无法在启动时分配大页,这意味着没有足够的可用大页。我想提请您注意这样一个事实:我们在这里讨论的是整个共享内存段。它不等于 的大小
shared_buffers
,而是大 2-3%,因为共享内存段包含许多其他数据结构,这些数据结构也必须在数据库进程之间共享。