我想确保 Postgresql 可以利用所有可用内存在专用数据库服务器上进行缓存。如何确保内核的共享内存设置正确?有谁知道如何计算以确保 shmax 等不会限制 Postgresql?
答案1
这里有一个小片段,允许服务器使用最多一半的物理 RAM 作为共享内存:
#!/bin/bash
page_size=`getconf PAGE_SIZE`
phys_pages=`getconf _PHYS_PAGES`
shmall=`expr $phys_pages / 2`
shmmax=`expr $shmall \* $page_size`
echo \# Maximum shared segment size in bytes
echo kernel.shmmax = $shmmax
echo \# Maximum number of shared memory segments in pages
echo kernel.shmall = $shmall
将其输出放入 /etc/sysctl.conf 并运行:
sysctl -p
那么你就准备好了。
PostgreSQL 使用操作系统来补充其所有读写操作,因此您真的不想专用一半的 RAM——对于专用数据库服务器来说,这已经足够了。对服务器专用 RAM 数量进行不同测试通常会发现最大吞吐量介于总 RAM 的 15% 到 40% 之间;如果超过这个数字,您最终会得到太多的双缓冲页面。而且,由于服务器代码中尚未解决的缓存争用问题,大型系统上有用的上限约为 8GB。有关服务器调优的更多信息,请访问PostgreSQL 维基。