图片管家 7.19 impress-website 超时

背景:impress APIs 和 impress-website ,impress-fe 都运行在 docker 平台。impress-website 官网首页直接渲染,不需要向 impress APIs 请求数据,渲染用户展示页面时需要向 impress APIs 请求数据,才能渲染,使用外网地址(x.yupoo.com)进行访问。

现象:impress APIs 没有问题,impress-fe 同样也没有问题。唯独 impress-website 无论哪个页面打开都超时,官网首页也打不开(开始成功过一次)。而且 impress-website 内存一直往上升,触发内存限制 1000M 后重启。Staging 环境访问官网首页不存在卡顿,但是访问用户展示页会有卡顿。另外,又拍云的某些服务也出现问题。

初始分析:impress-website 内存在涨,说明请求进了但是没有响应出来,而 impress APIs 服务并没有问题,可能是某种物理机器上面的问题导致不能响应,没问题的服务是不和他们共享这个物理机的原因。

解决:运维等其他组的成员最终发现访问内部域名时 DNS 解析缓慢(长达 10s),他们猜测是自己的 DNS 服务上的 dnsmasq 性能问题,于是重启了运行该服务的机器,最终得到解决。

再分析:能和 impress-website 建立连接,那么 impress-website 响应时肯定能成功,但是超时没有响应,说明里面的代码阻止了服务进行响应,应用之前没有问题,说明逻辑代码没有问题,只可能是 impress-website 内的网络请求没有得到响应,impress APIs 服务没有问题,说明连接 impress APIs 就不正常,HTTP 连接分为 DNS 查询和 TCP 连接建立,TCP 连接的建立受应用,系统内核以及物理设备影响,Staging 能访问,说明物理设备正常,之前已经排除过应用的问题 ,这样,就是域名查询的问题了。Staging 环境能访问,只是有点卡,说明是域名查询卡。线上容器中连接不能及时响应,连接数持续上升,导致内存升高;由于发起请求的限制,导致发起的请求需要等待,所以访问官网首页一般也会导致反向代理服务器 60s 超时。

这个原因也解释了用户展示页面为什么有时候会卡顿。

此类错误调试方式?

// 假设容器的连接限制 60000,upone 启用 2 个实例,10s 能完成一个请求,每个页面平均 3 个请求,要造成连接超限,图片管家至少需要每秒 4000 个页面的访问?
// 容器内存限制是 1024M,一个容器实例中用 pm2 启用了 2 个进程,pm2 内存限制是 1000M,为什么可以看到 pm2 重启?
// 容器中网络连接的限制?宿主机的网络连接限制?超过限制尝试继续建立连接时是直接报错还是排队等待?
// Docker 平台使用的网桥网络模式,分析中忽略了它
// Docker 容器中访问 x.yupoo.com 时首先会向本地 DNS 服务器发起查询,但是 x.yupoo.com 不是 CDN 地址,不应该由 upyun DNS 服务器接管查询。


7.20 后续:又出现这种情况,但是由于 docker 容器从以前的 2 个实例改成了 6 个实例,所以官网首页并没有出现超时。

分析:每个容器并发的 TCP 连接固定,容器增加以后,容器内达不到连接的限制,所以不需要访问 APIs 的官网首页能建立连接并立刻渲染响应。