diff --git a/changelog.d/postgres-max-locks.md b/changelog.d/postgres-max-locks.md new file mode 100644 index 0000000..77e0ff5 --- /dev/null +++ b/changelog.d/postgres-max-locks.md @@ -0,0 +1,16 @@ +### Gewijzigd — 2026-10-15 (Postgres: max_locks_per_transaction naar 1024) + +`values/db/postgres.yaml` zet `max_locks_per_transaction = 1024` via +`postgresql.primary.extendedConfiguration`; de default was 64. OpenRegister zoekt +met één UNION over al zijn schematabellen, en bij ~1.329 tabellen gaf dat +`out of shared memory, increase max_locks_per_transaction` (gezien bij de +generale repetitie van demogemeente Zuiddrecht). + +Gemeten op `postgres16-ext-sha-8abef67`: 1.329 tabellen met 8 indexen (11.963 +locks in één transactie) faalt op 64 en slaagt op 1024. `shared_memory_size` +gaat van 143MB naar 189MB, binnen de geheugenlimiet van 512Mi. + +Blast radius: alle tenants met `dbType: postgres` krijgen een nieuwe ConfigMap +`nextcloud-postgresql-extended-configuration` en een nieuwe checksum-annotatie op +de StatefulSet, dus elke in-cluster Postgres herstart één keer. Tenants op +`dbType: external` en `mariadb` veranderen niet. diff --git a/docs/DATABASE.md b/docs/DATABASE.md index 25d022a..9b37e8e 100644 --- a/docs/DATABASE.md +++ b/docs/DATABASE.md @@ -160,6 +160,22 @@ The custom image (`conduction2022/nextcloud-images:postgres16-ext-*`) includes: - Additional extensions for performance - Optimized settings for Nextcloud +### Lock-tabel (`max_locks_per_transaction`) + +`values/db/postgres.yaml` zet via `postgresql.primary.extendedConfiguration` +`max_locks_per_transaction = 1024` (default 64). OpenRegister zoekt met één +UNION over al zijn schematabellen, en elke tabel plus elke index kost een lock +in één transactie. Met ~1.329 tabellen gaf 64 `out of shared memory`. + +Kosten: ongeveer 46MB extra shared memory per Postgres-pod (143MB naar 189MB +`shared_memory_size`, gemeten op het image). Een wijziging van deze waarde +herstart Postgres, voor elke postgres-tenant tegelijk als hij in dit bestand +staat. Een tenant kan hem ook alleen voor zichzelf zetten met hetzelfde blok in +zijn tenantbestand. + +Geldt niet voor `dbType: external`: die tenants draaien op het gedeelde +cluster uit `platform/postgres/cluster.yaml`, dat zijn eigen parameters heeft. + ### Secret Creation ```bash diff --git a/nextcloud-platform/values/db/postgres.yaml b/nextcloud-platform/values/db/postgres.yaml index cd52c2b..f3171b8 100644 --- a/nextcloud-platform/values/db/postgres.yaml +++ b/nextcloud-platform/values/db/postgres.yaml @@ -61,6 +61,24 @@ postgresql: failureThreshold: 3 successThreshold: 1 + # ------------------------------------------------------------------------- + # Lock-tabel: max_locks_per_transaction 64 -> 1024 + # ------------------------------------------------------------------------- + # OpenRegister zet elk schema in een eigen tabel (magic tables) en zoekt + # over schema's heen met één UNION. Elke tabel en elke index daarvan kost + # een lock in één transactie. Bij ~1.329 tabellen gaf de default 64: + # ERROR: out of shared memory + # HINT: You might need to increase max_locks_per_transaction. + # Gemeten 2026-10-15 op dit image: 1.329 tabellen met 8 indexen (11.963 + # locks) faalt op 64 en slaagt op 1024. + # + # Kosten: de lock-tabel staat in shared memory. shared_memory_size gaat van + # 143MB naar 189MB (+46MB, gemeten), binnen de limiet van 512Mi uit + # common.yaml. Vraagt een herstart van Postgres; de chart zet daarvoor een + # checksum-annotatie op de StatefulSet. + extendedConfiguration: | + max_locks_per_transaction = 1024 + initdb: scripts: 01-enable-extensions.sql: |