早上刚泡完茶,就有个朋友找过来,说他的网站突然卡得不行,登上去一看,服务器CPU占用快100%了,急得满头汗。其实这种事儿我碰到过不下一百次,真不是什么天大的问题,找对方法几分钟就能定位,找不到方法可能折腾大半天还摸不着头脑。今天就把我常用的快速排查步骤给唠一唠,都是实操出来的经验,没什么虚的,都是拿来就能用的招。

先看服务器CPU占用的是哪个进程
你登陆服务器之后,第一件事就是敲top命令,这不就把所有进程都列出来了嘛?默认top其实就是按CPU占用从高到低排序的,要是不对的话,按一下大写的P,系统就自动重新排序了。一眼就能看到哪个进程占了最多的CPU,是不是一下子就有方向了?我之前碰到过一个新手朋友,登上去半天找不到top在哪,其实就是命令敲错了,真要说难吧,一点不难,就是第一步别走错。很多时候你一看就明白,比如明明是跑网站的服务器,怎么会有个奇怪名字的进程占了七八十的CPU?那基本就八九不离十是有问题了。
常见的高CPU占用进程场景
我整理了几个最常见的情况,你碰到了对着套就行,省得瞎猜。第一种就是你的网站程序本身的进程,比如php-fpm、Java进程占了很高,这种一般要么是你网站突然爆了流量,比如上了个热搜突然好多人来,要么就是程序写得有问题,死循环或者数据库查询没优化,每个请求都要耗好多CPU。第二种就是中了挖矿木马,这种现在特别多,尤其是那种便宜的服务器,密码设得简单,被人暴力破解进去之后就跑挖矿进程,悄咪咪占你CPU挖币,这种进程一般名字都很奇怪,要么藏在tmp这种临时目录里,你一看进程的路径不对,就得小心。第三种就是刚好碰到系统在跑备份或者更新任务,这种占点CPU是正常的,等它跑完自动就降下来了,你别慌,先等个十分八分钟看看,要是一直高再接着查。我之前就碰到一个客户,买了那种超便宜的小服务器,跑了三个月才发现里面藏了挖矿进程,一直占着一半的CPU,他还以为就是自己流量涨了,硬生生多花了好几个月的冤枉钱,说起来都是泪。
查进程的网络连接确认异常
要是你看完进程还是拿不准这个进程到底是不是正常的,那下一步就查查它的网络连接,就知道它在干嘛了。用ss命令或者netstat,敲个ss -antp | grep 你的进程ID,就能看到这个进程所有的对外连接了。正常的网站进程,一般只连自己的数据库或者几个必要的外部接口,要是你发现它连了好多陌生的境外IP,或者端口都是奇怪的高位端口,那基本就是中招了,要么是挖矿要么是被人当肉鸡了,直接干掉进程再清理对应的文件就好。还有一种情况,就是某个爬虫疯狂爬你的网站,导致php-fpm进程全都起来占满了CPU,这种你看连接就能看到一堆同一个IP过来的请求,封了那个IP立马就降下来了,简单得很。
翻系统日志找隐藏的根源
有时候你看进程也看不出问题,一会高一会低,或者突然就满了,那这时候就得翻翻系统日志了。Linux系统一般都存在/var/log目录下面,进去看看messages或者syslog,还有你的web服务日志,看看最近有没有什么报错。比如有没有内核报错说IO出错,会不会是硬盘有坏道导致程序不断重试,把CPU跑满?我之前就碰到过这么一次,客户的服务器CPU经常莫名其妙跑满,查来查去最后在日志里看到一堆IO错误,扫了一下硬盘果然有坏道,换了盘之后就好了。还有一种情况就是内存不够用了,系统触发OOM机制杀了进程,但是进程又自动重启,杀了启启了杀,反复折腾就把CPU占满了,日志里面也会记下来,一翻就看到。
排查完找到问题之后,该解决就解决,要是是正常流量增长导致配置不够用了,那该升级配置就升级,别舍不得那点钱,用户访问卡半天,损失的流量和订单可比那点配置费贵多了。要是是程序本身的问题,那就抓紧优化代码,给数据库加索引,该重构就重构,从根源上解决问题。要是真的碰到被入侵了,除了杀掉进程清理木马,记得还要改密码,补漏洞,别让人家下次再进来。
其实大部分服务器CPU占用过高的问题,按这个步骤走下来,十来分钟肯定能找到问题出在哪。别一看到占用满了就慌,慌也没用,一步步来,大部分都是小问题,实在摸不着头脑再找专业人士帮忙,也比你瞎折腾大半天强多了,你说是不是?
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!