起因,网站查询时报错接口错误

通过接口找到服务,发现服务没有挂,于是查日志,发现报错,无法连接数据库

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,启动容器,查询,一切正常

问题很复杂,解决很简单。

唯一想不通的就是为什么会出现这个问题。。。。