【问题标题】:node-postgres : ECONNREFUSED when connections are too manynode-postgres:连接太多时 ECONNREFUSED
【发布时间】: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


    【解决方案1】:

    按照node-pool 中的说明检查您的池配置。假设您的数据库能够接受 101 个连接(并发 + 开发人员的查询浏览器 :)),您应该设置 max=100 以应对您的 100 个并发。
    对于避免等待资源的微调,acquireTimeoutMillismaxWaitingClients 可能是值得考虑的好值。

    【讨论】:

      猜你喜欢
      • 2015-06-25
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多