文章目錄

之前有段时间,Node服务的可用性从99.99%跌到了99.3%,502错误明显增加,于是得排查下原因。

在本地打包镜像,启动容器后,把并发打上去,发现PM2守护的进程会时不时重启, 日志如下

1
2
3
PM2      | App [server:1] exited with code [0] via signal [SIGKILL]
PM2 | App [server:1] starting in -cluster mode-
PM2 | App [server:1] online

仔细观察后发现是内存到达上限后会把进程杀死,重启。估计是内存泄漏的原因,一时半会找不到原因,于是只好祭出开始佬写的内存回收插件,加上插件之后内存急剧下降,服务稳如泰山。带来的副作用是内存GC存在时间开销,整体响应时间比原先的服务慢20%,这就得做个取舍。

把插件发布到测试环境后,再次测试,一样稳如狗,于是发布到线上环境,结果还是存在很多502错误,想不到错在哪里。联系网关服务的开发一起排查。网关服务的开发推测是keepalive时间设置的原因。因为请求先到网关,再到服务中,而网关设置的keepalive大于服务设置的keepalive时间时,就会出现网络连接不可用的情况,于是就会认为服务502。

在Express中keepalive时间默认是5秒,改一下keepalive时间即可,配置如下。

1
2
const server = app.listen(port);
server.keepAliveTimeout = 70000;

最终服务可用性达到99.99%,达到目标。

打赏作者

文章目錄