起因,网站查询时报错接口错误
通过接口找到服务,发现服务没有挂,于是查日志,发现报错,无法连接数据库
docker部署的MySQL,docker ps查询容器还在运行,容器日志也没有异常
用navicat登录数据库查看是否有堵塞,发现无法登录,想到可能是白名单没有改
进入容器登录数据库,发现密码输入后无任何响应
于是直接重启MySQL容器,重启后数据库可以正常登录了,网站查询也正常了
过了5分钟,发现又和刚才一样的情况,MySQL无法连接
再次重启,打开日志,再次查询,发现数据库在查询过程中直接就中断查询了
但是根据前面的查询发现没有产生死锁
到目前为止,发现的问题有:
1,数据库是查询过程中直接中断的,且无法连接
2,nacicat报错2013 - Lost connection to MySQL server at 'waiting for initial communication packet', system error:0
于是百度一下,网上说这个报错是因为设置了DNS域名反向解析功能,需要在配置文件里加上skip-name-resolve来跳过。
进入容器查看配置文件,发现已经设置
这时候突然想到是不是内存不够,free -h查看还有4个G的内存
内存充足,那就是cpu的问题
重启MySQL,开启top -p,查询mysqld,发现cpu最高只到30%
cpu资源也没有问题,这个时候突然看到mysqld进程的状态变成了T,暂停了
系统资源充足,数据库为什么会暂停
于是kil了-18 PID 唤醒MySQL,这个时候发现数据库又可以继续使用了
但是查询后仍然会变T,且只用了1个cpu资源
于是怀疑是docker容器获取不到cpu资源
docker stats mysql查看容器cpu使用率
再次唤醒查询,发现容器cpu使用率接近100%就直接变为0
同时mysqld进程变成T状态
安装docker的时候没有设置过限制cpu资源
应该是可以无限制使用cpu资源的,但是现在没有资源,那只好给分配一下
给已启动的容器增加设置:
docker update --cpus=4 mysql
docker update --cpuset-cpus=0-3
4核服务器,所以全给了
重新开始查询,仍然是原样,到100%就进入T状态
docker已经分配了资源,但是容器仍然无法使用
以目前的情况来看,mysql本身是没有问题的,docker本身也是没有问题的
那么就只有服务器内核的问题
cd /sys/fs/cgroup/目录查看,发现都是默认的
都没有问题,但是容器就是用不了足够的cpu资源
于是重新用安装包部署了一个数据库,查询,发现仍然是老样子
mysql无法获取足够的cpu资源导致暂停
那这就是服务器的问题了,于是祭出重启大法
重启后,启动docker,启动容器,查询,一切正常
问题很复杂,解决很简单。
唯一想不通的就是为什么会出现这个问题。。。。