今天这事儿,我得好好跟你们掰扯掰扯。话说我最近发现我那台老服务器,就是跑着一堆网站和数据库的那台,最近有点不太对劲。具体啥情况?就是你通过终端登录上去,得等个好几秒,这在以前可是没有的事儿。然后运行个命令,有时候快有时候慢,就跟抽风似的,让人心里没底。
我还以为是网络的问题,毕竟这年头,网络抽风也不是啥新鲜事。可仔细一琢磨,不对,我这网络一直挺稳定的,没道理突然就抽起风来。那问题出在哪儿?我这心里就开始犯嘀咕。
于是我就开始一系列的排查工作。我用个命令叫 top,这玩意儿能显示当前系统里各个进程的资源占用情况。敲下回车,屏幕上刷刷刷地出来一堆信息,我主要关注的是那个叫 load average 的东西。你们猜怎么着?这数值高得吓人,都到 40 多!我记得以前这数值都是在个位数晃悠的,这下可把我给整懵。
我又试另一个命令,叫 uptime,也能看到这个 load average。结果还是一样,数值居高不下。这下我更确定,肯定是服务器出啥问题。
然后我就开始琢磨,这 load average 到底是个啥玩意儿?我上网查查,大概意思是这玩意儿反映 CPU 的忙碌程度。数值越高,说明 CPU 越忙,排队等着干活的任务越多。你想,我这服务器上也没跑啥特别耗资源的大程序,咋就能把 CPU 给累成这样?
我又用个叫 vmstat 的命令,想看看是不是内存或者硬盘出问题。结果显示,内存使用率倒是不高,硬盘读写速度也还算正常。这下我就更纳闷,CPU、内存、硬盘都没啥大问题,那到底是哪儿出幺蛾子?
后来我发现,虽然 CPU 整体的 idle 时间很高,有95%都是空闲的,但是,这个 load average 就是降不下来。这种情况,根据我的经验,很可能是僵尸进程在作祟。这些僵尸进程就像幽灵一样,虽然已经死,但还占着茅坑不拉屎,白白消耗着系统资源。或者也可能是cpu上下文切换的太频繁
于是我决定先把那些占用 CPU 资源比较多的进程给找出来。我还是用的 top 命令,然后按 CPU 使用率排序,把排在前面的几个进程都给记下来。通过top -c 我们可以看到每个进程的详细信息包括占用的内存,cpu,执行的命令是什么。
在经过排查后我发现是mysql这个进程导致的cpu飙高,load average 也高,因为我的服务器是4核心的,但是却发现有几十个mysql的进程存在,我开始一个一个的尝试kill掉,发现load average值直接降下来,而且通过终端登录服务器也快很多,执行命令也流畅。
经过这一番折腾,总算是把问题给解决。这回的经历告诉我,遇到问题不能慌,得一步一步地排查,找到问题的根源才能彻底解决。这回也暴露我对服务器管理方面的一些知识盲区,以后还得继续学习!
- load average 高不一定就是 CPU 不够用,也可能是僵尸进程太多或者io太慢导致的。
- top 和 uptime 命令可以帮助我们快速查看系统的负载情况。
- vmstat 命令可以查看内存和硬盘的使用情况。
- 遇到问题要善于利用各种工具进行排查,不要轻易放弃。
好,今天就先分享到这里,希望我的这回经历能对大家有所帮助。记住,实践出真知,多动手,多思考,才能不断进步!