【发布时间】:2018-11-13 17:22:24
【问题描述】:
我为我的 nodejs express 应用开发了一个简单的资源。我正在使用 brianc 的 node-postgres 客户端来处理与我的 postgres 数据库的连接。遵循 documentation 中的 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 使用此端点对我的服务器进行负载测试。我使用 200 个请求/秒的 100 个并发 对其进行了测试:
负载测试:
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 参数,但没有值给出任何更改。
我认为在 100 并发下以 200 rps 中断对于简单的资源(例如简单的选择查询)来说是不利的。如果是机器限制,我使用的是相当不错的机器 - Core i7 6700, 16GB DDR4。我错过了什么还是我做错了什么?谢谢!
【问题讨论】:
标签: node.js postgresql express concurrency connection-pooling