【发布时间】:2017-03-13 20:13:35
【问题描述】:
简而言之,我无法支持来自利用 Postgresql、Node.js 和 node-postgres 的数据 API 每分钟超过 5000 个读取请求。瓶颈似乎在 API 和 DB 之间。以下是实现细节。
我正在为 Node.js 驱动的数据 API 使用 AWS Postgresql RDS 数据库实例(m4.4xlarge - 64 GB 内存、16 个 vCPU、350 GB SSD、无预置 IOPS)。默认情况下,RDS 的 max_connections=5000。节点 API 在两个集群之间进行负载平衡,每个集群有 4 个进程(2 个 Ec2 和 4 个 vCPU,在集群模式下使用 PM2 运行 API)。我使用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 开始频繁超时。监控表明,对于运行 Node.js API 的 EC2,CPU 利用率仍低于 10%。因此,我的重点是 DB 和 API 与 DB 的绑定。
我已尝试增加(并减少)node-postgres“最大”连接设置,但 API 响应/超时行为没有变化。我也尝试过在 RDS 上配置 IOPS,但没有任何改进。另外,有趣的是,我将 RDS 扩展到 m4.10xlarge(160 GB 内存,40 个 vCPU),虽然 RDS CPU 使用率大幅下降,但 API 的整体性能大幅下降(甚至无法支持每分钟 5000 个请求我能够使用较小的 RDS)。
我在很多方面都处于不熟悉的领域,并且不确定如何最好地确定当每分钟超过 5000 个请求时,这些移动部件中的哪一个会成为 API 性能的瓶颈。如前所述,我根据对 Postgresql 配置文档和 node-postgres 文档的审查尝试了各种调整,但无济于事。
如果有人对如何诊断或优化有任何建议,我将不胜感激。
更新
在扩展到 m4.10xlarge 之后,我执行了一系列负载测试,改变了每个池中的请求/分钟数和最大连接数。以下是一些监控指标的屏幕截图:
【问题讨论】:
-
最大连接默认为100。你试过增加它吗?
标签: node.js postgresql api aws-rds node-postgres