Короче говоря, у меня возникают проблемы с поддержкой более 5000 запросов на чтение в минуту из API данных, использующих Postgresql, Node.js и node-postgres. Похоже, что узкое место находится между API и БД. Вот подробности внедрения.
Я использую экземпляр базы данных AWS Postgresql RDS (m4.4xlarge - 64 ГБ памяти, 16 виртуальных ЦП, 350 ГБ SSD, без выделенных операций ввода-вывода в секунду) для API данных на базе Node.js. По умолчанию max_connections RDS = 5000. Нагрузка API узла сбалансирована по двум кластерам по 4 процесса в каждом (2 Ec2 с 4 виртуальными ЦП, на которых выполняется API с PM2 в кластерном режиме). Я использую node-postgres для привязки API к Postgresql RDS, и я пытаюсь использовать его соединение функция объединения. Ниже приведен образец кода моего пула соединений:
var pool = new Pool({
user: settings.database.username,
password: settings.database.password,
host: settings.database.readServer,
database: settings.database.database,
max: 25,
idleTimeoutMillis: 1000
});
/* Example of pool usage */
pool.query('SELECT my_column FROM my_table', function(err, result){
/* Callback code here */
});
Используя эту реализацию и тестирование с помощью тестера нагрузки, я могу поддерживать около 5000 запросов в течение одной минуты со средним временем отклика около 190 мс (что я и ожидал). Как только я отправляю более 5000 запросов в минуту, мое время ответа увеличивается до 1200 мс в лучшем случае, а в худшем случае API начинает часто отключаться по таймауту. Мониторинг показывает, что для EC2, на которых запущен API Node.js, загрузка ЦП остается ниже 10%. Таким образом, я сосредоточен на БД и привязке API к БД.
Я попытался увеличить (и уменьшить, если на то пошло) настройку максимального количества подключений node-postgres, но не было никаких изменений в поведении ответа / тайм-аута API. Я также пробовал подготовить IOPS на RDS, но без улучшений. Кроме того, что интересно, я масштабировал RDS до m4.10xlarge (160 ГБ памяти, 40 виртуальных ЦП), и хотя загрузка ЦП RDS сильно упала, общая производительность API значительно ухудшилась (не мог даже поддерживать 5000 запросов в минуту. что я смог сделать с меньшим RDS).
Я нахожусь на другой территории во многих отношениях, и я не уверен, как лучше всего определить, какая из этих движущихся частей является узким местом производительности API при более 5000 запросов в минуту. Как уже отмечалось, я попытался внести различные изменения на основе обзора документации по конфигурации Postgresql и документации node-postgres, но безрезультатно.
Если у кого-то есть совет по диагностике или оптимизации, я был бы очень признателен.
ОБНОВИТЬ
После масштабирования до m4.10xlarge я провел серию нагрузочных тестов, варьируя количество запросов в минуту и максимальное количество подключений в каждом пуле. Вот несколько снимков экрана с показателями мониторинга: