pg_max_concurrent_queries is per worker process, not per node

Uses: Kong Gateway
TL;DR

Why does my PostgreSQL connection count exceed the limit I set with pg_max_concurrent_queries?

pg_max_concurrent_queries is applied per nginx worker process, so the actual maximum number of concurrent database connections is:

pg_max_concurrent_queries × nginx_worker_processes × number of Kong nodes

To bring the total under your database connection limit, explicitly set nginx_worker_processes to a fixed integer value rather than relying on the default auto setting, which bases the count on the host’s vCPUs and can produce more workers than expected in Kubernetes.

Problem

The PostgreSQL database used by Kong Gateway has a maximum number of permitted connections. After setting pg_max_concurrent_queries to a value below that maximum, the connection limit is still exceeded. Kong Gateway is running on multiple nodes deployed in Kubernetes.

Cause

The pg_max_concurrent_queries setting is scoped per nginx worker process, not per Kong node. The actual maximum number of concurrent database connections is therefore:

pg_max_concurrent_queries × nginx_worker_processes × number of Kong nodes

The nginx_worker_processes parameter defaults to auto, which sets the number of worker processes equal to the number of available vCPUs. In a Kubernetes environment, the calculation is based on the host vCPUs (not the container’s CPU limit), which can result in significantly more workers — and therefore more database connections — than expected.

Solution

  1. Determine the current number of nginx worker processes on a running Kong node:

    ps aux | grep "[n]ginx: worker process" | wc -l
    
  2. Calculate the maximum connection count you need to stay within your database limit. For example, if your database allows 200 connections, you have 4 Kong nodes, and you want pg_max_concurrent_queries set to 10:

    200 connections ÷ (4 nodes × 10 queries) = 5 worker processes per node
    
  3. Explicitly set nginx_worker_processes to a fixed integer in kong.conf:

    nginx_worker_processes = 5
    

    Or via an environment variable:

    KONG_NGINX_WORKER_PROCESSES=5
    
  4. Reload or restart Kong Gateway for the change to take effect:

    kong reload
    
  5. Verify the worker count reflects the new value:

    ps aux | grep "[n]ginx: worker process" | wc -l
    

Validation

After restarting, confirm the total connection count stays within bounds by monitoring your database connection metrics. For PostgreSQL, you can check active connections with:

SELECT count(*) FROM pg_stat_activity WHERE datname = '<your_kong_database>';

The count should remain at or below:

pg_max_concurrent_queries × nginx_worker_processes × number of Kong nodes

Help us make these docs great!

Kong Developer docs are open source. If you find these useful and want to make them better, contribute today!