node-postgres: ECONNREFUSED, когда соединений слишком много - PullRequest
0 голосов
/ 13 ноября 2018

Я разработал простой ресурс для моего приложения nodejs express .Я использую клиент brianc node-postgres для обработки соединений с моей базой данных postgres .Следуя async / await стилю из документации , мои контроллеры users.js должны выглядеть следующим образом:

код:

const { Pool } = require('pg');
const pool = new Pool();

module.exports = {
    index: async (req, res, next) => {
        try {
            const dbResult = await pool.query(`select * from users`, []);
            //do stuff with the data here and return response
        } catch (err) {
            next(err);
        }
    }
}

Я считаю, что ресурс довольно прост и работает честно.Однако я хотел загрузить тестовый сервер, используя эту конечную точку, используя loadtest .Я протестировал его, используя параллелизм 100 при 200 запросах в секунду , используя:

loadtest:

loadtest -H authorization:(sometoken) -c 100 --rps 200 http://localhost:3000/users

Я бы запустил приложение моего узла ипосмотрите на консоль, пока идет загрузка.Первые пару сотен запросов будут корректно проходить через состояние 200, а вскоре я получу ошибки ECONNREFUSED в большинстве запросов.Частота появления ошибок обычно составляет 62% от общего числа запросов (с меньшей вероятностью это будет вполне нормально).

enter image description here

первоначальные выводы:

Я много гуглил, методом проб и ошибок.Я обнаружил, что ECONNREFUSED является результатом максимального ограничения соединения.Но я думал, что пул соединений должен справиться с этим, так как он перерабатывает / повторно использует клиент / соединения.

Я также экспериментировал с работой с postgresql.conf с настройкой max_connections = n и shared_buffers = nGB, пробовал разные конфиги и ни одна из них не работала, частота ошибок была бы одинаковой.

Пробовал разные стили, на основе обещаний, обратный вызов, и я все равно получаю одинаковую частоту ошибок для теста нагрузки.Пробовал возиться с параметром connectionTimeoutMillis , и никакие значения не дают каких-либо изменений.

Я считаю, что разрыв со скоростью 200 об / с при параллелизме 100 плох для простого ресурса, такого как простой запрос выбора.Если это ограничение машины, я использую довольно неплохой компьютер - Core i7 6700, 16 ГБ DDR4.Я что-то пропустил или я что-то делаю не так? Спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

Проверьте конфигурацию пула, как описано в node-pool . Вы должны установить max=100, чтобы справиться с вашим 100 параллелизмом, предполагая, что ваша база данных может принимать 101 соединение (параллелизм + браузер запросов для разработчика :)).
Для точной настройки, чтобы избежать ожидания ресурсов, вероятно, acquireTimeoutMillis и maxWaitingClients - это хорошие значения для просмотра.

...