我正在Google Cloud Run上托管的ExpressJS应用上进行负载测试,当流量激增时,有一段时间我在Stackdriver中看到许多500错误,并显示消息“请求失败,因为实例无法成功启动。” -有效导致服务器停机。
看到此错误随着应用程序的扩展而更频繁地发生,我认为这是由Cloud Run负载均衡器在这些实例准备好接受请求之前过早地将流量分配给新实例造成的。
当我继续运行负载测试时,实例会不断重复被杀死并重新启动,因此在负载打开时没有恢复机制。
我没有看到来自NodeJS应用程序的任何错误日志,表明没有任何失败的请求实际上到达了我的应用程序。
如何避免这些错误?
Cloud Run如何确定端口已准备好接受请求?
是在ExpressJS应用程序中配置错误,还是可以在将请求发送到新实例之前以某种方式延迟Cloud Run?
事实证明,这是由Cloud Run自动扩展最大实例限制和Cloud SQL的连接限制共同引起的。
我正在运行一个小型Cloud SQL Postgres实例(3.75 GB / 1 vCPU),默认连接限制为100。(https://cloud.google.com/sql/docs/quotas)
默认情况下,Cloud Run为自动扩展分配最大实例数1000。在负载测试期间,请求计数的突然增加促使自动扩展创建了数百个实例,这很快耗尽了Cloud SQL连接限制100。
针对Cloud SQL记录了这种确切的情况:https : //cloud.google.com/sql/docs/postgres/connect-run#connection_limits_3(如果在Cloud Run上也记录了这一点,那就很好了,它不会立即发生发生此问题时,我需要寻找有关Cloud SQL的文档)
解决方案是将Cloud Run的最大实例数限制为可容忍的数量,并调整Cloud SQL的资源分配/最大连接数限制。确切的配置显然将取决于预期的负载水平。
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |