最近用5台服务器部署一个在很多地方用过的项目,项目正式上线,一开始因为数据库某张表数据因为数据量少并没有发现服务器A的CPU持续飙高的问题,这时候五台服务器的CPU仍然很低,但最近两天的时间,数据量就达到了50万左右,在时候发现其中一个服务器A的CPU持续飙高在98%,其它服务器的CPU仍然处于5%左右,这时候就开始了排查问题。这里使用张三代表我。
步骤一
当发现服务器内存或CPU(这里二者简称它)飙高的时候,首先使用top命令,查看哪些进程出现大量占用它,就比如张三发现它占用很高,使用top命令,发现emqx和mysqlId进程占用它很高,又因为emqx是需要长连接而且服务器为多核,排除emqx问题。其次发现mysqlId进程占用CPU已经超过100%,又因为该项目使用的是rancher部署。【ps:这里我首先第一步怀疑的是自己写的代码有问题,但是看了一圈发现已经用redis减少二次对数据库的访问,所以排除代码问题】
步骤二
张三这时候进入到rancher界面,进入mysql容器执行命令【show full processlist;】,这条命令可以查看哪些mysql语句出现问题,这时候张三发现有一条语句重复出现,简单举例为【select 某些字段 from t_terminal where 某个字段='xxx'】,这时候张三是有疑惑的,因为在同样项目里在其他地方都是有对这个字段做索引的。
步骤三
尽管张三很疑惑,但还是不想猜测是不是没有索引的问题,直接找到对应表,打开设计表查看索引,果然没有对这个字段添加索引,后面加上执行添加索引,等了快1分钟完成添加索引,这时候重新看服务器A,等待约5分钟后,果然这次服务器A的CPU占用缓慢的从98%降到18%。