From 80ea0c11518024c19faa841720e2bf49f925f315 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Apr 2026 15:33:46 +0000 Subject: [PATCH 1/2] perf(postgresql): tune postgres settings for improved Nextcloud performance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - shared_buffers: 128MB → 256MB (better hot-data caching) - effective_cache_size: set to 1GB (planner hint, no memory allocated) - work_mem: 4MB → 16MB (reduces disk spills in file listing / share queries) - maintenance_work_mem: 64MB → 256MB (faster VACUUM and index builds) - wal_buffers: auto → 16MB (reduces WAL write latency) - checkpoint_timeout: 5min → 15min (spreads checkpoint I/O, reduces spikes) - random_page_cost: 4.0 → 1.1 (SSD-appropriate; favours index scans) - effective_io_concurrency: 1 → 200 (SSD-appropriate I/O prefetching) - autovacuum_vacuum_scale_factor: 0.2 → 0.05 (vacuum sooner on large tables) - autovacuum_analyze_scale_factor: 0.1 → 0.02 (keep planner stats fresh) All changes are applied via sed in the existing postgresql.conf modification block and are idempotent across container restarts (handles both commented defaults on fresh installs and already-set values on restart). Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/0456b491-e148-4d26-9dc9-e1df9bfbf5d0 Co-authored-by: szaimen <42591237+szaimen@users.noreply.github.com> --- Containers/postgresql/start.sh | 50 ++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/Containers/postgresql/start.sh b/Containers/postgresql/start.sh index 551bb10e..a23dfaad 100644 --- a/Containers/postgresql/start.sh +++ b/Containers/postgresql/start.sh @@ -151,23 +151,63 @@ fi # Modify postgresql.conf if [ -f "/var/lib/postgresql/data/postgresql.conf" ]; then echo "Setting postgres values..." + PGCONF="/var/lib/postgresql/data/postgresql.conf" # Sync this with max pm.max_children and MaxRequestWorkers # 5000 connections is apparently the highest possible value with postgres so set it to that so that we don't run into a limit here. # We don't actually expect so many connections but don't want to limit it artificially because people will report issues otherwise # Also connections should usually be closed again after the process is done # If we should actually exceed this limit, it is definitely a bug in Nextcloud server or some of its apps that does not close connections correctly and not a bug in AIO - sed -i "s|^max_connections =.*|max_connections = 5000|" "/var/lib/postgresql/data/postgresql.conf" + sed -i "s|^max_connections =.*|max_connections = 5000|" "$PGCONF" # Do not log checkpoints - if grep -q "#log_checkpoints" /var/lib/postgresql/data/postgresql.conf; then - sed -i 's|#log_checkpoints.*|log_checkpoints = off|' /var/lib/postgresql/data/postgresql.conf + if grep -q "#log_checkpoints" "$PGCONF"; then + sed -i 's|#log_checkpoints.*|log_checkpoints = off|' "$PGCONF" fi # Closing idling connections automatically seems to break any logic so was reverted again to default where it is disabled - if grep -q "^idle_session_timeout" /var/lib/postgresql/data/postgresql.conf; then - sed -i 's|^idle_session_timeout.*|#idle_session_timeout|' /var/lib/postgresql/data/postgresql.conf + if grep -q "^idle_session_timeout" "$PGCONF"; then + sed -i 's|^idle_session_timeout.*|#idle_session_timeout|' "$PGCONF" fi + + # Increase shared_buffers from the 128MB default for better data caching + sed -i "s|^#shared_buffers = .*|shared_buffers = 256MB|" "$PGCONF" + sed -i "s|^shared_buffers = .*|shared_buffers = 256MB|" "$PGCONF" + + # Hint to the query planner about available OS page cache (does not allocate memory) + sed -i "s|^#effective_cache_size = .*|effective_cache_size = 1GB|" "$PGCONF" + sed -i "s|^effective_cache_size = .*|effective_cache_size = 1GB|" "$PGCONF" + + # Increase per-operation sort/hash memory to reduce disk spills for file listing and share queries + sed -i "s|^#work_mem = .*|work_mem = 16MB|" "$PGCONF" + sed -i "s|^work_mem = .*|work_mem = 16MB|" "$PGCONF" + + # Increase memory for VACUUM, CREATE INDEX, and other maintenance operations + sed -i "s|^#maintenance_work_mem = .*|maintenance_work_mem = 256MB|" "$PGCONF" + sed -i "s|^maintenance_work_mem = .*|maintenance_work_mem = 256MB|" "$PGCONF" + + # Increase WAL buffers to reduce WAL write latency under concurrent write load + sed -i "s|^#wal_buffers = .*|wal_buffers = 16MB|" "$PGCONF" + sed -i "s|^wal_buffers = .*|wal_buffers = 16MB|" "$PGCONF" + + # Spread checkpoint I/O over a longer window to reduce spikes + sed -i "s|^#checkpoint_timeout = .*|checkpoint_timeout = 15min|" "$PGCONF" + sed -i "s|^checkpoint_timeout = .*|checkpoint_timeout = 15min|" "$PGCONF" + + # Tune for SSD storage: random reads are nearly as fast as sequential reads + sed -i "s|^#random_page_cost = .*|random_page_cost = 1.1|" "$PGCONF" + sed -i "s|^random_page_cost = .*|random_page_cost = 1.1|" "$PGCONF" + + # Allow the kernel to issue more concurrent I/O prefetch requests (suitable for SSDs) + sed -i "s|^#effective_io_concurrency = .*|effective_io_concurrency = 200|" "$PGCONF" + sed -i "s|^effective_io_concurrency = .*|effective_io_concurrency = 200|" "$PGCONF" + + # Trigger autovacuum earlier on large Nextcloud tables (e.g. oc_filecache, oc_activity) + # to prevent table bloat accumulating before the default 20% threshold is reached + sed -i "s|^#autovacuum_vacuum_scale_factor = .*|autovacuum_vacuum_scale_factor = 0.05|" "$PGCONF" + sed -i "s|^autovacuum_vacuum_scale_factor = .*|autovacuum_vacuum_scale_factor = 0.05|" "$PGCONF" + sed -i "s|^#autovacuum_analyze_scale_factor = .*|autovacuum_analyze_scale_factor = 0.02|" "$PGCONF" + sed -i "s|^autovacuum_analyze_scale_factor = .*|autovacuum_analyze_scale_factor = 0.02|" "$PGCONF" fi do_database_dump() { From fcc4d9502da4205208a2dabadd75dd5cc102d1a9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Apr 2026 15:34:43 +0000 Subject: [PATCH 2/2] docs(postgresql): clarify work_mem memory allocation semantics in comment Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/0456b491-e148-4d26-9dc9-e1df9bfbf5d0 Co-authored-by: szaimen <42591237+szaimen@users.noreply.github.com> --- Containers/postgresql/start.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Containers/postgresql/start.sh b/Containers/postgresql/start.sh index a23dfaad..483d3436 100644 --- a/Containers/postgresql/start.sh +++ b/Containers/postgresql/start.sh @@ -178,7 +178,9 @@ if [ -f "/var/lib/postgresql/data/postgresql.conf" ]; then sed -i "s|^#effective_cache_size = .*|effective_cache_size = 1GB|" "$PGCONF" sed -i "s|^effective_cache_size = .*|effective_cache_size = 1GB|" "$PGCONF" - # Increase per-operation sort/hash memory to reduce disk spills for file listing and share queries + # Increase per-operation sort/hash memory to reduce disk spills for file listing and share queries. + # Note: this is allocated per sort/hash operation, not per connection, so the theoretical worst-case + # (max_connections × work_mem) is rarely approached in practice. sed -i "s|^#work_mem = .*|work_mem = 16MB|" "$PGCONF" sed -i "s|^work_mem = .*|work_mem = 16MB|" "$PGCONF"