关于Linux CentOS 7.6部署服务后需要10分钟左右才能正常请求数据问题排查
1.检查所有服务
systemctl status mysqld nginx redis newService
服务全正常启动,于是判断服务启动都没问题
2.在所有服务都没问题但是请求不通的情况下检查nginx
一开始以为是nginx的问题,检查配置后没发现具体原因,重启服务器后页面正常加载,但是接口请求不通,nginx的错误日志无问题,于是在重启服务器后清空浏览器缓存,页面依然正常加载,同时可以正常登录,但是其它接口无法正常加载,排除nginx的问题
3.推测原因
后台服务正常启动,直接判断mysql和redis是正常启动的,服务是依赖这两个服务启动的,所以排除了redis和mysql以及服务是否未正常启动,但是由于部署的mysql版本和开发时使用的版本差异较大,所以怀疑是否有部分sql请求出错导致加载失败,但是后台服务的日志打印中并没有报错,由于客户反馈是服务器重启之后才发生的,所以一直在重启服务器查询这个问题,后面无法定位问题,于是选择重装mysql,但是依旧没解决,后面尝试重启服务看能否正常加载,发现问题出现在服务上,服务重启后就无法查询到数据,于是开始定位服务是否有问题,最后通过打印线程栈
ps -ef | grep java
jstack 服务的PID > thread.log
cat thread.log
发现了报错
sun.security.provider.SecureRandom.engineNextBytes waiting on the Class initialization monitor for SecureRandom$SeederHolder
找到问题根源:SecureRandom 阻塞 Linux 熵池不足
解决方法:启动 jar 时增加 JVM 参数 -Djava.security.egd=file:/dev/./urandom
nohup java -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -Xms1024m -Xmx2048m -jar /home/dr.jar --server.port=8200 --logging.file.path=/home/jinfu/log &
这个问题是 JVM 随机数读取阻塞;虚拟机 / 云服务器极简环境极易出现,开机熵池为空导致所有 HTTP 请求卡死;以后开机自启脚本带上 -Djava.security.egd=file:/dev/./urandom 参数,可以永久规避该问题
该问题耗时接近一天,一度想放弃,后来还是想办法找到了问题的根源,所以记录一下
浙公网安备 33010602011771号