增加shared_buffer> 25%的RAM崩溃Postgres,Ubuntu报告了很多"可用"记忆

时间:2017-10-12 02:06:22

标签: postgresql ubuntu postgis

我有一个流量很低的非盈利网站(几百个用户),但它有一个相当繁忙的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呢?

1 个答案:

答案 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