博主在阿里云服务器上安装了主机软件Blesta后,阿里云后台频繁提示cpu超载,打开突发性能模式后,发现cpu负载到了100%。如下图所示:
直接在putty里面reboot整个系统后,负载瞬间降为2%。此时如果一直不访问网页的话,负载将维持在3%附近。如果仅是客户买东西,负载也不会高。
但是一旦管理员在后台添加产品,更新支付网关等操作后,负载就立马上来了。所以见使用blesta过程中,强烈建议管理员在后台操作添加产品、更新支付网关后,立马重启服务器,避免阿里云服务器重载运行,造成额外的费用或网站访问变慢。 但是过一过段时间后,cpu负载又上来了(阿里云服务器改为cpu限制负载在20%),如下图所示: 登录VPS,输入top ps -ef|grep 6767后,显示正在执行blesta的cron定时任务index.PHP ps -ef|grep 5974后,显示也是在执行blesta的cron定时任务index.PHP ps -ef|grep 4915后,同样显示正在执行blesta的cron定时任务index.PHP 也就是说我们找到原因了,就是cron定时执行blesta的index.PHP时,导致cpu负载过高。 先kill掉所有的3个cron,把负载降下来。再找原因。 kill -9 5974 kill -9 6767 kill -9 4915 原因解释: 原因:定时任务脚本的同步未在规定时间内完成,crontab接下来的还会执行此脚本,很多个PHP进程,就会导致负载过高,甚至有些服务器会挂掉。(博主突然想到,之前wordpress资源越限也是这个wp-cron.php导致的) 根据blesta官方的安装指南: 定时执行PHP必须要每5分钟执行一次。这个好像太频繁了。官网的Cron Issues也没有过多的涉及这一部分知识。只是提到should run。 继续分析这个定时执行的作用,参考同为主机管理软件的whmcs,其关于定时任务的说明为:自动任务对于我们的WHMCS账单系统是非常重要的,用户的续期账单都要靠他提前送达给客户邮箱,虽然默认设定基本可用,但是对他的了解是必须滴。普通设置选定每天一次,然后在命令输入框,输入我们在WHMCS管理后台自动任务设定项目头部提供的命令,然后点击添加新计时程序作业,就可以了。 也就是说,我们没必要一直运行cron,但是也需要保证他一直运行。这里我们需要用到一个脚本,即:如果某进程占用cpu超过50%,则自动杀死这个进程。 编写checkcpu.sh脚本,实现如果PHP线程如果占用cpu超过70%且持续60s时,杀死这个进程,具体如下:#!/bin/sh # Happytang to monitor used cpu record=0 while true; do cpu=$(top -b -n1 | grep "PHP" | head -1 | awk '{print $9}') pid=$(top -b -n1 | grep "PHP" | head -1 | awk '{print $1}') #cpu check result=${cpu/.*} if [[ $record == $pid ]];then kill -9 $pid;echo "$pid was killed";fi if [[ $result > 70 || $result == 100 ]];then let record=${pid};else let record=0;fi #echo echo `date +%F" "%H:%M:%s`+" cpu:$result% record pid:$record pid:$pid" sleep 60 done
最后,运行下述命令,保证退出putty后脚本继续执行
nohup sh ./checkcpu.sh &
如果需要停止运行这个脚本,则:
ps -ax #查看所有的进程pid kill -9 pid //杀死一个某个pid
本文参考了这篇文章和这篇文章,首发于Happytang’s Blog。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。