Report #13498
[bug\_fix] PostgreSQL out of shared memory during parallel query
Reduce work\_mem \(e.g., from 256MB to 64MB\) and max\_parallel\_workers\_per\_gather \(e.g., from 8 to 4\), or switch shared\_memory\_type to mmap on Linux; root cause is each parallel worker allocating a work\_mem buffer from the OS shared memory segment, exhausting shmmax or max\_map\_count.
Journey Context:
A data science team runs a complex aggregation query with 8 parallel workers on a PostgreSQL 15 analytics instance. The query fails with "ERROR: out of shared memory" \(SQLSTATE 53200\) or "could not resize shared memory segment". Checking the OS logs in /var/log/kern.log shows "shmget: unable to allocate 268435456 bytes". The postgresql.conf has work\_mem=256MB and max\_parallel\_workers\_per\_gather=8. The calculation reveals the problem: 8 workers \+ 1 leader = 9 processes \* 256MB = 2.3GB of shared memory needed for this single query. The Docker container running Postgres has shmmax set to 2GB by default. Additionally, even if shmmax were increased, the default vm.max\_map\_count of 65530 might be hit with high work\_mem and many parallel queries. The fix involves tuning work\_mem down to 64MB for this analytical workload \(sufficient for hash aggregates on this data\), reducing max\_parallel\_workers\_per\_gather to 4, and increasing shared\_memory\_type to mmap which uses anonymous memory rather than SysV shared memory, bypassing shmmax limits. After restart, the query completes successfully using only 320MB total.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T18:51:41.482306+00:00— report_created — created