一、问题现象
项目上使用华为私有云,前段时间华为升级云平台后,云上用户反馈业务系统出现卡顿,之前几秒可以刷新出来的页面现在需要几十秒。提供了一个比较明显的url和curl调用方法。
10.213.x.xxx:8082/files/login
curl -H "Content-Type: application/json" -H "Tenantcode: XHASZJZXT-370211" -H "token: xxx" http://localhost:9705/records/dzda/getArchivementMenu?attachCode=JSGC&keyGuid=xxx
二、应用架构分析
1、登录10.213.x.xxx,根据应用提供的端口号定位到8082端口是个nginx服务(netstat -anp|grep 8082),并且获取到进程id:30923:
使用lsof -p 30923,定位到nginx的安装路径和日志位置:
进入安装路径,可以找到nginx的配置文件路径conf:nginx的配置文件一般是nginx.conf
查看nginx.conf,找到端口号为8082的配置,可以看到不同的后缀其实指向不同的服务。
根据出问题的url找到的后端服务地址和端口,继续通过netstat -anp查找对应的进程id:
执行ps -ef|grep 48420查看java进程的执行信息:可以看到java的配置文件位置、日志位置等信息。
从配置文件中可以看到数据库、redis、ftp等其他关联服务的信息。
三、问题排查
1.分别在跳板机、同段windows主机、同段linux主机上测试,都存在卡顿现象,可以暂时排除边界网络设备的问题;
2.在跳板机进行测试,开始wireshark抓包,根据IP和端口过滤数据包信息(ip.addr == 10.213.x.xxx and tcp.port == 8082):
可以看到打开页面后,跳板机给10.213.x.xxx:8082发送了一个GET请求,具体路径是/records/dzda/getArchivementMenu,但是隔了20多秒才收到回包。
3. 同时在跳板机使用wireshark抓包,10.213.3.159上使用tcpdump抓包,并使用tail -f刷新nginx的access.log:
跳板机发送GET包后,10.213.3.159马上就接收到了。但nginx access日志中出现GET请求的记录要比跳板机发包晚20多秒,并且日志中出现记录后,页面马上打开了。
此时怀疑在159上,在nginx之前还有其他进程阻断了GET请求,排查了redis等服务后,没有发现异常;又百度查了下nginx的机制,access.log中只有请求被正常响应后才会记录该请求,所以nginx刚接收到GET请求并没有记录access日志,要等到后端的服务有正常返回后才进行记录。所以延时应该是产生在java服务处理请求的过程中。
4. 根据GET请求里面的url后缀:/records/dzda在nginx配置文件中定位到后端的java服务端口是9705。
查到java进程信息和日志位置:/hst/api/records/api/log
5. tail java日志,同时测试异常网站,发现一访问网站就有日志产生,说明nginx第一时间转发给了java进程,但在一些步骤等待时间很长。
6. 从日志中发现不了具体卡在什么调用上,这时可以用strace追踪程序运行过程的各类系统调用:
跟踪文件调用:
strace -tt -T -v -f -e trace=file -s 1024 -p 48420
可以看到进程打开resolv.conf和/etc/hosts文件后卡住,判断是程序中存在域名,在解析时卡住。
跟踪网络调用:
strace -tt -T -v -f -e trace=network -s 1024 -p 48420
查到需要解析的域名(主机名)为本机的hostname:host-10-213-3-159
直接ping host-10-213-3-159进行测试,发现同样需要十几秒才能解析出本机IP。
在ping的同时抓dns 10.255.89.8的包,发现域名解析请求发送后会延时几秒后才收到dns服务端(10.255.89.8)返回的server failure的包。
同时在华为云互联网区主机上ping主机名或其他无法解析的域名,dns服务器会马上返回no such name的回包。
可以确定问题原因是因为华为云DNS(10.255.89.8)解析未知域名时出现异常,无法快速返回无法解析的信息,导致程序一直在等待解析。
四、问题解决
在/etc/hosts 中添加一行,指定host-10-213-3-159对应的IP:10.213.3.159,网站访问正常。
或者把/etc/resolv.conf中dns记录注释掉也可以,但可能影响华为云其他服务。
- 后续跟进
华为云金宏网的主机默认配置的dns都是云内dns 10.255.89.8/9,其他主机上的程序如果在代码中存在域名的调用也会出现类似的卡顿现象,需要华为尽快修复dns服务器解析卡顿问题。