网站访问量大的时候mysql的压力就比较大,当mysql的CPU利用率超过300%的时候就不能提供服务了,近乎卡死状态,这时候最好的方法 就是重启mysql服务。由于这种事具有不可预见性,我们不知道什么时候mysql的占用率达到300%,还是写个程序定期判断比较靠谱。
学了shell编程,写了下面的脚本:
#!/bin/bash cpu=`ps aux | grep ‘mysqld$‘ | cut -d " " -f6 | cut -d. -f1` if [ $cpu -gt 300 ] then service mysql restart && date >> /tmp/mysql.log fi
稍微解释一下。首先执行"ps aux"命令获取所有系统进程的状态信息,包括CPU,内存等,如下图:
然后通过管道将信息传送给grep,$就是正则表达式结尾的意思,从所有的进程中找到以“mysqld”结尾的进程,其实就是mysql啦,这里返回的是mysql进程的信息,一行,如下图:
接下来的一个cut是截断字符串,我们要统计的是CPU的占用率,当然要截取mysql的CPU数值,cut命令默认是用tab分割的,但是ps aux显示的字符串中的空白是空格而不是tab,我们就要用空格来分割,有的字符串之间是多个空格,这里的 -f8 参数就是截取第8个字符串(有的系统可能是第6个),这个字符串就是mysql的CPU占用率啦!
也许你会有疑问,既然已经得到mysql的CPU占用率了,为什么后面还有一个cut?问的好!我当初也没想到这个问题。因为我们要比较CPU的占用率 嘛,这里我们取得的字符串是一个浮点数(带小数点的),但是shell编程里面是不支持浮点数比较大小的。怎么办?那就比较整数呗,以“.”分割这个浮点 数,第一个就是整数部分,这样我们就取得了mysql占用率的整数部分。
后面就是一个判断,如果大于300的话就就重启mysql服务。后面还有一个命令,这个命令是一个简单的“日志”,目的就是当重启一次服务就记录一下重启mysql的时间,便于以后分析网站的压力情况。
接下来就是定期执行这个程序了,根据情况可以5分钟或者10分钟执行一次,只要编辑 /etc/crontab文件,加入如下语句:
?
*/5 * * * * root /home/ma6174/mysql_restart.sh