简而言之,我无法通过利用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运行API,集群模式下为PM2)。我使用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%。因此,我的重点是数据库和API与数据库的绑定。
我试图增加(并减少)node-postgres“max”连接设置,但API响应/超时行为没有变化。我也尝试过在RDS上配置IOPS,但没有改进。另外,有趣的是,我将RDS扩展到m4.10xlarge(160 GB内存,40个vCPU),虽然RDS CPU利用率大幅下降,但API的整体性能却大幅下降(甚至无法支持每分钟5000个请求)我能够使用较小的RDS。)
我在许多方面处于不熟悉的领域,并且不确定如何在每分钟超过5000个请求时最好地确定哪些移动部件是瓶颈API性能。如上所述,我已根据对Postgresql配置文档和node-postgres文档的审核尝试了各种调整,但无济于事。
如果有人就如何诊断或优化提出建议,我会非常感激。
在扩展到m4.10xlarge之后,我执行了一系列的负载测试,改变了每个池中请求/分钟数和最大连接数。以下是监控指标的一些屏幕截图:
答案 0 :(得分:5)
为了支持超过5k的请求,同时保持相同的响应速度,您需要更好的硬件......
简单的数学表明:
5000 requests*190ms avg = 950k ms divided into 16 cores ~ 60k ms per core
这基本上意味着你的系统负载很高
(我猜你有一些备用的CPU因为网络上有时间丢失了)
现在,您问题中真正有趣的部分来自扩展尝试:m4.10xlarge(160 GB内存,40个vCPU)。
CPU利用率下降表明扩展会释放数据库时间资源 - 因此您需要推送更多请求!
2意见建议:
max: 70
并查看网络流量(取决于您可能占用网络的数据量)答案 1 :(得分:1)
根据我的经验,API服务最好的办法是根据呼叫的优先级为每个API调用使用单独的Pool
:
var highPriority = new Pool({...max: 20}); // for high-priority API calls
var lowPriority = new Pool({...max: 5}); // for low-priority API calls
然后,您只需为每个API调用使用正确的池,以获得最佳的服务可用性。
答案 2 :(得分:0)