Мой сервер имеет следующие ресурсы:настройка PostgreSQL производительность при большой нагрузке
[[email protected] ~]$ free -m
total used free shared buffers cached
Mem: 15929 15118 810 142 12 219
-/+ buffers/cache: 14885 1043
Swap: 8031 2007 6024
[[email protected] ~]$ cat /proc/cpuinfo | grep processor | wc -l
8
[[email protected] postgres]# sysctl kernel.shmall
kernel.shmall = 4194304
[[email protected] postgres]# sysctl kernel.shmmax
kernel.shmmax = 17179869184
и мой PostgreSQL конф:
default_statistics_target = 100
maintenance_work_mem = 1GB
checkpoint_completion_target = 0.9
effective_cache_size = 12GB
work_mem = 32MB
wal_buffers = 16MB
shared_buffers = 3840MB
max_connections = 500
fsync = off
temp_buffers=32MB
Но его получение ошибка "слишком много подключения". Страница nginx_status
веб-сервера показывает около 500 активных соединений, когда это происходит. На сервере размещается api severver, поэтому каждый «HTTP-запрос» неизменно инициирует «чтение» базы данных. Его не «пишут» тяжелую вещь, а очень «читают» тяжело.
Возможно, что я превысил наш ранг, но все же я ожидал немного больше от ящика с сердечником 16G/8 с учетом «только для чтения» характера приложения. Могу ли я нажать PostgreSQL в любом другом возможном направлении?
16GB/8 Core на самом деле не является «большой коробкой» и определенно не является «высокопроизводительным» сервером БД. Это больше подходит для хорошо оборудованного ПК или ноутбука. Но вы должны действительно изучить пул соединений, как предположил Мэтт. Либо внутри приложения, либо используя что-то вроде pgBouncer или pgPool –