由于单位的安全要求,原有的一个应用由互联网区域机房搬迁至内网机房,然后业务系统走内网进行访问。新服务器是网管给重新做的,CentOS 8.1 + Oracle 19c,我把数据库、应用都迁移到新服务器上之后,发现莫名其妙的卡顿,一开始我以为是内网的问题,没有在意,但后来发现,每次都是规律性的卡顿,表现为:第一次访问或者隔几分钟第一次访问的时候,会卡顿10秒,然后就恢复正常速度,页面秒开。如果停几分钟不访问,再次打开时,还是会卡顿10多秒。
1、排查服务器性能问题 顺手top一下,发现有一个ksmtuned的进程,CPU持续100%,查了一下,这个进程是负责动态分配内存的。奇怪,怎么会占满,于是我随手看了一下新机器的配置,直接晕了,只给分了4G内存……于是,找网管,调内存,心想,哎呀,这问题这么顺利的就解决了,真好。 网管很仗义,一看,哎呀,做系统的时候忘了给调内存了,给你多分点吧,随手给分了120G内存(你没看错),顺便给调了Oracle的内存配置。 但。。。问题并没有解决,问题依旧。
2、排查tomcat优化问题
我开始研究是不是tomcat没有针对内存优化,参照网上的资料,给配置了一些运行内存的参数。就是这种:
-server -Xms1800m -Xmx8216m -XX:MaxNewSize=512m"
JAVA_OPTS="-server -XX:PermSize=564M -XX:MaxPermSize=2128m
也并没有用,问题依旧。
3、排查问题出在java执行上还是tomcat本身 我特意写了一段代码,输出执行时间,从获取到Action就立即输出一个时间。却奇怪的发现,我访问这个地址的时候,系统并没有立即输出,而是停顿了10秒,才开始输出。也就是说,中间有10秒钟莫名其妙的卡顿时间,通过Chrome浏览器的F12中Network也可以看到这个现象。然后,直接访问一个zip文件,执行下载,发现也是卡10秒才响应,这就跟java代码无关了。
4、排查数据库问题 检查并优化了C3P0连接池、Mybaits的配置,确认没有问题。然后在plsql上跑了一些复杂语句,发现数据库也没有问题,间断再执行,也没出现延迟10秒的现象。
5、排查网络问题 我先是找了一台同网段下的服务器,crul一下这个机器,发现居然也是卡10秒才响应。于是我到这台机器本机上,curl http://192.168.x.x/xxx,发现也是卡10秒才响应;然后我又试了一下curl http://127.0.0.1/xxx 返现居然不卡。这太奇怪了!!! 然后我顺手看了一下,dns,发现网管居然给配了DNS,但这台服务器在内网是连不上DNS的。会不会是服务器在尝试DNS解析?于是我把DNS注释掉,顺便把ipv6也禁用了,然后重启网路服务,瞬间……秒开!
折腾了一天的问题,没想到出在这里。但这个问题真的很奇怪,我在tomcat里也仔细检查过反向解析选项,确认没有开启,但它确确实实再走DNS查询192.168.x.x,但ipconfig里直接配的就是这个地址。以后要注意这个问题。