问题简述
在线上环境中,发现服务器内存在缓慢下降,疑似内存泄漏,且CPU占用较高,表现有点异常。并且egg.js部署的web站点响应异常,请求nginx代理后的端口,请求不通,最终会被代理到下一个正常节点。而如果是通过直连的形式,反而可以正常访问。重启站点之后,内存和CPU恢复正常。
处理过程
日志排查
查看nginx的错误日志,发现有大量的 Connection timed out
,出现这种报错的时候,web站点就无法访问,需要重启站点才可以正常访问。
[error] 12#12: *5170 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.1.101
而这种情况,先判断是不是防火墙问题,可能因为设置规则有问题,导致数据包无法正常传输。
由于采用的是docker部署,不同容器相互访问就有可能存在这种情况。
nginx容器和web容器都在本机的话,需要开通容器之间的防火墙。否则就会出现这种报错,无法访问站点。
查看容器IP,docker inspect 容器名
,确认已经开放容器之间防火墙。
防火墙是通的,在重启web容器之后,就能正常访问,继续思考为什么。
查看web站点的日志,没有错误输出,也没有异常日志,而且通过直连是可以访问的,可以认为站点本身没问题。
既然站点是正常的,nginx也是正常,那有可能是docker的问题,查一下docker日志。
$ docker logs 容器名 --tail 500
tips: 如果不加
--tail
,会从头到尾输出全部,而往往日志会很多,不利于查找,使用–tail,输出最近的500行日志
查看nginx容器日志,没有什么特别的,再看看web容器日志,发现有这些错误信息,开始有点儿进展。
[xmldom error] element parse error: TypeError: source.indexOf is not a function @#[line:0,col:undefined]
但是这些日志,并没有明确告诉是哪里有问题,而且日志在不断地增长。
通过搜索引擎并没有得到有用的信息,尝试用其他地方进行入手。
通过了解docker日志,除了通过 logs
命令,容器还有映射在主机上的日志文件,这个文件路径通过 inspect
命令可以找到
docker inspect 容器名
在输出中找到 LogPath
,这个文件就是存放日志内容,路径一般为 /var/lib/docker/containers/xxx/xxx-json.log
,xxx为容器id,查看这个文件内容,从中也不能找到相关信息,错误信息和容器日志一样,只是增加了日期。
$ tail -n 100 /var/lib/docker/containers/xxx/xxx-json.log
{
"log":"[xmldom error]\u0009element parse error: TypeError: source.indexOf is not a function \n","stream":"stderr","time":"2020-07-01T00:00:00.000Z"}
{
"log":"@#[line:0,col:undefined]\n","stream":"stderr","time":"2020-07-01T00:00:00.000Z"}
进程排查
通过命令 docker stats
可以看到内存和CPU占用都很高,就想到要查一下是什么进程占用这么高,在容器内执行命令查看进程结果:
$ docker exec 容器名 ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 88181 1.5 0.8 847296 51996 ? Ssl 23:34 0:00 node /home/egg/node_modules/egg-scripts/lib/start-cluster {
"title":"egg-server-egg","baseDir":"/home/egg","framework"