mirror of
https://github.com/nextcloud/all-in-one.git
synced 2026-05-28 06:20:14 +00:00
perf(postgresql): tune PostgreSQL settings for improved Nextcloud performance (#7944)
This commit is contained in:
@@ -151,23 +151,65 @@ 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.
|
||||
# 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"
|
||||
|
||||
# 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() {
|
||||
|
||||
Reference in New Issue
Block a user