网站卡服务器 CPU 达 100% 的排查步骤和解决思路
前天早上9点左右打开网站发现非常卡,用的是 WordPress 架构,阿里云 VPS 服务器,环境为 CentOS + Nginx + MySQL + PHP。访问速度从来没有这么慢过,所以这方面也没什么经验,只能边学边做。参考了一些文章,学到了不少,在此做个笔记,也希望能帮助到遇到同样问题的朋友们。
一、检查硬件问题
首先 SSH 登录服务器,用 top 命令查看一个很重要的参数:load average(平均负载)。如下图:
这个图片是事后截的,资源使用率已经降下来了。load average 后面的三个数字分别代表了1分钟平均负载、5分钟平均负载和15分钟平均负载。15分钟可以代表长期,5分钟代表中期,1分钟代表短期,取后者15分钟的数字比较准确一些,因为代表的时间最长。
这三个数的含义,如果是1核cpu,那么不能超过1,4核那么就不能超过4。如果是1核的cpu,这个数字快接近1了(双核、四核也一样),那么需要考虑服务器配置升级。关于 load average 的最详细的的解读,请移步至:https://ihacksoft.com/967.html
二、检查 PHP-fpm 进程
首先使用 free -m 命令查看当前服务器执行状况:
可以看到我的内存总量是2G,已消耗了1470。那是不是占用太高了呢?Linux 的内存机制和 Windows 不同,内存占用 90% 以上,属正常现象。即便是一个负载很小的linux,跑几天后,即便没什么人访问,内存占用量也将达到90%以上,这个数字是完全正常的。但是,这个内存占用量不会达到100%的。
可使用 top 命令 m 参数,查看具体的内存使用情况。再使用:
ps auxw|head -1;ps auxw|sort -rn -k4|head -40
查看消耗内存最多的前40个进程,检查有没有导常的进程。
查看通过命令查看服务器上一共开了多少的 php-cgi 进程:
ps -fe |grep "php-fpm"|grep "pool"|wc -l
查看已经有多少个php-cgi进程用来处理tcp请求:
netstat -anp|grep "php-fpm"|grep "tcp"|grep "pool"|wc -l
设置PHP-FPM的进程数:vi /etc/php-fpm.d/www.conf(根据实际情况变化)找到 pm.max_children 字段,设置一个合理的值,比之前的小
pm.max_spare_servers : 该值表示保证空闲进程数最大值,如果空闲进程大于此值,此进行清理 pm.min_spare_servers : 保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程;
这两个值均不能不能大于 pm.max_children 值,通常设置 pm.max_spare_servers 值为 pm.max_children 值的60%-80%。
正常情况下,一个php-fpm占用内存20~30M,偶尔也会飙到40M。
三、进程跟踪
1.使用 top 命令找出 CPU 占用最高的进程 PID。
2.strace -p PID(进程数) 来跟踪进程。
3.ll /proc/PID/fd 来查看该进程在处理哪些文件。
最后修改对应代码。
最后,记得重启。这里只是提供一些排查或解决的思路,具体情况还是要具体分析。