天天看点

服务器cpu 100问题追查过程

作者:沧龙

前段时间,出现了一次服务器cpu 占用100的问题。以下为追查原因的过程。仅当抛砖引玉,欢迎拍砖。

查看占用cpu高的进程

想找出占用cpu高的进程,用top命令就可以搞定。

此时,轻轻按下c键。就会看到如下信息。

找出进程占用cpu高的原因。

进程占用cpu高,一般是由于进程长时间占用cpu,又没有主动释放占用。如果想主动释放cpu,可以调用sleep。在写程序的时候,尤其要注意while 等循环的地方。

找出php进程在执行那段代码

如果对上面的命令有疑问,可以查看 当cpu飙升时,找出php中可能有问题的代码行

根据上面的信息,我们可以知道,cpu高时,正在执行/home/admin/gearman_manager/pecl-manager.php文件。并且正在执行53和71行附近的代码。

分析相关代码

php的相关代码如下:

看来作者已经考虑到某些情况可能导致cpu 100,因此在代码中使用了sleep方法。现在php进程占用cpu 100,看来是没执行sleep(5)。如果$thisworker->work() 和 $thisworker->returncode() 方法中没有io等操作,能释放cpu的占用,又没有调用sleep的情况下,很容易导致进程占用cpu 100。

根据代码我们可以得出如下几个结论:

肯定没执行slepp(5)

$thisworker->work() 和 $thisworker->returncode() 方法中没有io等操作,能释放cpu的占用。

进一步跟踪代码中可疑部分

分析 $thisworker->returncode() 的返回值。如果很容易复现cpu 100的话,你可以在程序中echo $thisworker->returncode() 来获得返回值。但是现在cpu 100的问题,复现比较麻烦。所以,还是使用gdb 来搞吧。

从最后的lval = 25 和 type =1 我们可以看出 returncode()方法的最后返回值是 25 。

根据文档,返回值25 对应的是 gearman_not_connected。

解决问题

既然出问题时, returncode()方法的最后返回值是 25,而现在程序中对这种情况又没进行出来,导致了cpu 100。那我们只要在出现这种情况时,sleep几秒就ok了。