我在一台非常小的机器上运行 postgres 10.4,Debian 上有严格的内存限制(例如 200MB)。在我的情况下,必须禁用系统交换空间,但 SSD 磁盘空间有足够的可用空间(例如 > 500GB)。我使用瀑布方法将所有可用内存分配给 postgres 中的不同用途,遵循以下逻辑:
The available memory is 200MB
---
max_connections = 10
max_worker_processes = 2
shared_buffers = 50MB
work_mem = (200MB - shared_buffers) * 0.8 / max_connections
maintenance_work_mem = (200MB - shared_buffers) * 0.1 / max_worker_processes
temp_buffers = (200MB - shared_buffers) * 0.05
wal_buffers = (200MB - shared_buffers) * 0.05
temp_file_limit = -1 (i.e. unlimited)
effective_cache_size = 200MB / 2
对我来说至关重要的是,会话甚至 postmaster 永远不会因为内存限制而被取消,以确保 postgres 的稳定运行。在内存不足的情况下,postgres 应该使用临时文件而不是内存。
在某些情况下我仍然会出现内存不足的错误。 (例如,当我在表格中插入大量内容时。)
我需要如何设置所有参数以保证 postgres 不会尝试获取超出可用内存的内存。
深入研究postgresql服务器的内存配置可以参考这个官方文档 - https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server
它具有每个内存参数的所有限制和正确建议值,可以使用服务器配置属性(如 CPU 数量、RAM 容量等)设置这些参数。
否则,使用此在线工具尝试不同的配置,并确保服务器不需要比可用内存更多的内存 - https://pgtune.leopard.in.ua/#/
根据您的信息,我认为 PostgreSQL 在这种情况下可能不是合适的选择。我可以知道您在受限情况下坚持使用它的任何特定原因和您的服务器信息(CPU、RAM)吗?
考虑到 200 MB 的 RAM 和预期的低连接数,我相信这是您的家庭实验室,一个不错的选择只有 SQLite,它更有利于您的 SSD 使用。大插入的问题可能是由于 RAM 使用率低,即使在空闲状态下,PostgreSQL 也已经消耗了很多(如果我没记错的话,为 64 MiB)。
但是假设您仍然想坚持使用 PostgreSQL,然后检查 200 MiB RAM 是否专用于 PostgreSQL 还是与操作系统共享,即使使用已经消耗 64 MiB 的 alpine 映像,那么可用 RAM 的量仅为 100 MiB