PS:写在前面,这篇文章最后并没有解决服务器CPU100%的问题,仅仅是记录在尝试过程中学到的知识点。
今天原本打算使用redis连接项目,正好网站备案通过了,正打算先测试一下域名是否可用,结果反而整个项目都不可用了。想着应该又是tomcat那边的问题,先上服务器看了一下,感觉服务器的卡顿越来越厉害了,时不时就会卡住然后断开连接。想想腾讯云也不至于这么烂,于是查了一下原因。虽说最后没有解决,但当中的过程还是学习到了很多。目前先把出错的服务器保存了一个snapshot,然后对服务器进行重载。先把这个问题放下,以后再回去解决。(主要是我数据库没有进行备份,数据还在上面,而数据库也出问题了,完全无法connect,自然也无法备份了。但保存了snapshot,那么数据库文件还在里面,等到需要那部分数据的时候,就对snapshot进行载入,然后再修复错误去获取数据吧,现在先放下这个问题)
首先就是先运行了一下top命令,意外地发现%id为0,即CPU idle space为0,也就是CPU使用率竟然是100?那肯定是出现问题了,而且这样的话断开连接也不足为奇了,那么CPU 100%到底是从什么时候开始的,先查看了一下腾讯云的监控记录: (吃惊)竟然一直是100的?我服务器上也没运行几个程序,也就一个tomcat(而且因为网站备案的原因,甚至直接stop了),还有mysql跟redis,但又没有事务读写,怎么会出现问题呢?于是我调了一下时间,调到5月初直到现在,看看是否一直都是100,还是在什么时候变成了100:
把鼠标指到确切的转折点,可以看到,是8月30号这天开始飙升的,而且之后就一直高居不下,那么8月30那天我在服务器上做了什么呢。翻了一下日记,我在8.30这天学习了Redis,也就是在服务器上装了Redis。虽说没什么道理,但确实如此,没有任何其他理由。等一下我还要在我刚刚重装的服务器上安装mysql跟redis,看一下还会不会出现100的问题。如果会,再重装,只安装redis。虽说后面会换另一台服务器去单独做MySQL跟redis服务器,但这个问题肯定还是要解决的。
那么在解决的过程我使用了哪些命令,又遇到了哪些子问题,继续去处理的,现在列一个清单。
①首先去查询top的用法
top命令虽然是我实习的时候用得最熟练的命令,但时间过去太久了,我也记不清它的很多数值是什么意思。然后知道了%Cpu就是CPU的使用情况,其中:%us表示用户空间程序的CPU使用率,%sy表示系统(Kernel)的CPU使用率,%ni表示用户空间且通过nice调度过的程序的CPU使用率。
CPU time = user space time + system space time
至于nice调度,其实就是进程的优先级,大致先知晓即可。
%id:空间的CPU(我就是这里一直是0,也就是idle space为0,CPU使用率100)
②除了CPU,还有可能是内存的问题
对着top使用回车(刷新),发现CPU idle space很奇怪,会变化,而且要么是0,要么是100,显然是出现了一个错误的进程,然后突然导致100,而且还是一直生成,短暂过后又结束。最坑的是,使用top并找不到一个高CPU使用率的进程,所以完全不理解为何是100?可能是top显示的只是用户进程,不显示系统进程?
于是继续对磁盘进行查看,使用了df -h命令。图片没有存,但大概是,磁盘空间大小是50G,已经使用了41G。虽然安装软件的时候没有想太多,但毕竟只安装了几个软件,不至于这么大的空间,因而对这块还是存有疑惑。然后再查看了腾讯云的磁盘监控(对了,腾讯云的监控出错了,然后还得执行一段命令才能查看,但就是很简单地copy执行一次即可,就在腾讯云官方上的代码)。最后的磁盘监控结果是这样的:
当时的磁盘读写一直很大,我就猜测是MySQL出现了错误,然后一直在编写错误日志?
③处理MySQL中的问题
首先,我当时安装MySQL并没有直接安装服务service,这确实不是一个好的选择,tomcat也是如此。平时偶尔想对服务进行处理,使用systemctl,结果显示没有此service。然后还得去安装路径里自己调用shell脚本,然后还得找到这个安装路径,又是locate又是find,又是whereis的。
然后想先看一下错误日志在哪,以往每次打开文件都是vim,实际上用head跟tail是一个很好的选择。不然突然一下子出现一大串文字的体验也是很差劲的。
不过尝试了很多次,都无法彻底关闭mysql。这也就是安装法的最差劲的地方吧。找到了mysqld进程,都直接kill -9了,依然没有用处。如果是安装服务,直接systemctl stop即可。
④其他命令
因为top没有看到高CPU利用率的进程,于是还尝试了一些其他命令。
vmstat:查看系统负载
pidstat:查看进程使用磁盘的情况
pidstat -d 1:
netstat -na | grep 80 查找80 的端口(看是否开放,正在使用)
⑤finally
其实没有解决问题,所以只能用最笨的方法,重装系统。虽然重装系统很快,一分钟就结束了,但还是很不好。首先必须得对服务器进行snapshot备份,毕竟数据库的数据也取不出来(感觉出错的原因主要就是MySQL跟redis的错)。然后数据至少存在了snapshot当中,等到需要那部分数据或者有空的时候,再new一个服务器去尝试解决。