Если вы идете в swap, увеличение shared_buffers усугубит проблему; вы будете забирать ОЗУ из той части, которая заканчивается и заменяется, вместо этого выделяя память для кэширования базы данных. Стоит исправить SHMMAX и т. Д. Только по общему принципу и для дальнейшей настройки, но это не поможет в решении этой проблемы.
Гадание по определению источника, сжигающего вашу память, является бесцеремонным. Гораздо лучше взглянуть на данные из "top -c" и ps, чтобы найти, какие процессы используют их в большом количестве. Для действительно плохого запроса возможно использовать больше памяти, чем следовало бы. Если вы видите увеличение использования памяти для процесса PostgreSQL, выполняющего что-либо, проверьте идентификатор процесса по информации в pg_stat_tables, чтобы увидеть, что он делает.
Есть несколько вещей, которые могут вызвать такого рода проблемы, которые часто удивляют людей. Если вы выполняете большое количество обновлений строк в одной транзакции, и существуют проверки внешнего ключа или триггеры, которые могут исчерпать память. Очередь проверок в каждом из этих случаев хранится в оперативной памяти и может быть на удивление большой.
Есть две проблемы с вашими настройками PostgreSQL, которые могут быть связаны. Базы данных на самом деле работают не очень хорошо, если у вас намного больше активных соединений, чем ядер на сервере; наилучшая производительность обычно составляет 2-3 активных клиента на ядро. И все виды вещей идут не так, как только у вас есть более чем несколько сотен соединений. Существует некоторое поведение соединений ^ 2, которое ухудшает производительность, и есть некоторые проблемы с памятью. Если вам действительно нужно 1250 соединений, вы должны использовать пул соединений, такой как pgBouncer или pgpool-II.
Иffective_io_concurrency = 1000 слишком высоко для любого оборудования на планете. Полезные значения для этого кратны тому, сколько дисков у вас на сервере. Я понятия не имею, что происходит с использованием памяти, когда вы устанавливаете ее так высоко, но она не очень хорошо тестировалась в этом диапазоне. Нормальные настройки больше похожи на 1 к 25. Параметры, обозначенные на Настройка вашего PostgreSQL сервера , гораздо важнее, чем это есть; значение параллелизма влияет только на один конкретный тип сканирования таблицы.