我有一个流量很低的非盈利网站(几百个用户),但它有一个相当繁忙的PostGIS数据库支持。大多数数据库活动来自收获的降雨量和来自政府API的流量数据,然后总结了这些数据(过去3,6,12,小时等每个降雨量下降了多少)。由于我不为网站收费,因此我尽量保持托管费用尽可能低。我正在将其迁移到具有1GB RAM的新Ubuntu VPS。因此,我按照一般的经验法则设定了Postgres' shared_memory为250MB(占总RAM的25%)。当然,这台服务器并不完全专注于Postgres,但我的网站流量非常低。
这是此服务器上相当典型的RAM情况(目前活动较少)
total used free shared buff/cache available
Mem: 1024 228 0 379 795 656
Swap: 1024 676 347
Total: 2048 905 347
所有频繁使用的索引都具有非常高的命中率(> 0.945),但是一些表数据要低得多:少数低于0.5,但他们并没有大量使用,我怀疑最新和最查询的数据。所以没有显示停止者。当我查询pg_buffercache时,它在缓冲区中显示247MB。这是服务器上唯一的数据库。所以我认为它可以从更多的shared_buffers中受益。
所以我将share_buffer提升到350MB并重新启动服务器。不只是Postgres,而是整个Ubuntu服务器。重启后,我无法通过PgAdmin 4(在我的桌面Ubuntu上运行,而不是在服务器上)连接到Postgres。然后,我的一些地图图层(PostGIS表格)不会显示在我的OpenLayers地图上。当我通过php脚本将OL正在进行的一些调用粘贴到PG时,它会返回505内部服务器错误。所以我将缓冲区更改回250MB并重新启动服务器。一切都在运作。我尝试了300MB,但得到了相同的症状。
所以我查看了PG日志:
2017-10-10 19:22:50.855 EDT [3485] FATAL: could not map anonymous shared memory: Cannot allocate memory
2017-10-10 19:22:50.855 EDT [3485] HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 562085888 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
我对Linux很新,在Linux管理员方面肯定是新手(我以前的主机管理数据库和服务器)。从我所读到的内容来看,Linux会缓存很多内部文件以提高性能,但是当应用程序需要时,它应该放弃部分缓存。那是" buff / cache",对吗?应该有656MB的可用和#34;对吧?那么为什么PG不能获得50或100MB呢?
答案 0 :(得分:1)
您的内核共享内存设置需要使用sysctl进行更新。以下将允许最多16GB的共享内存,这可能就足够了。
sysctl -w kernel.shmmax=17179869184
sysctl -w kernel.shmall=4194304
有关这些参数的更多信息,请参阅以下内容: https://www.postgresql.org/docs/9.0/static/kernel-resources.html https://serverfault.com/questions/341680/postgresql-performance-adjusting-shmmax-and-shmall