Я разработал простой ресурс для моего приложения 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% от общего числа запросов (с меньшей вероятностью это будет вполне нормально).
первоначальные выводы:
Я много гуглил, методом проб и ошибок.Я обнаружил, что ECONNREFUSED является результатом максимального ограничения соединения.Но я думал, что пул соединений должен справиться с этим, так как он перерабатывает / повторно использует клиент / соединения.
Я также экспериментировал с работой с postgresql.conf с настройкой max_connections = n и shared_buffers = nGB, пробовал разные конфиги и ни одна из них не работала, частота ошибок была бы одинаковой.
Пробовал разные стили, на основе обещаний, обратный вызов, и я все равно получаю одинаковую частоту ошибок для теста нагрузки.Пробовал возиться с параметром connectionTimeoutMillis , и никакие значения не дают каких-либо изменений.
Я считаю, что разрыв со скоростью 200 об / с при параллелизме 100 плох для простого ресурса, такого как простой запрос выбора.Если это ограничение машины, я использую довольно неплохой компьютер - Core i7 6700, 16 ГБ DDR4.Я что-то пропустил или я что-то делаю не так? Спасибо!