在我们使用主机或者VPS的时候,可能会由于某些原因导致MYSQL占用资源过高而导致我们的主机被暂停的情况发生。一般都是由于哪些原因导致MYSQL占用率负载过高呢?突然增加大量的并发任务、由于我们使用的网站程序脚本占用、人为的DDOS攻击导致等原因。
作为VPS用户来讲,我们需要先检查到底是不是因为我们自己的问题导致的上述占用MYSQL负载过大。登陆SSH输入"top"命令回车(注意是小写top,linux命令对大小写很敏感!)。
我们先看这一行,因为大鸟用来写教程的VPS主机中没有用来做网站,所以看到的数据使用较小。目前这款VPS中只安装了一个WP博客。
Cpu(s): 2.8%us, 0.5%sy, 0.0%ni, 96.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
US:代表我们空间中占用的CPU百分比;SY:代表内核空间中占用的CPU百分比;ID:代表空闲的CPU百分比;WA:代表等待输入输入的CPU占用百分比。
下面的两行MEM以及SWAP代表物理内存和交换内存的使用率情况。第一个字段代表总量,后面分别为使用和剩余的。
下面我们会看到是各种进程占用的CPU量。因为目前我的VPS中没有内容,所以看到的都是ROOT占用。如果有站点数据在运行,应该会有其他的进程出现,比如mysql、apache等。这几个信息是我们最重要的,当然有人要问,那第一行,那什么top的是什么意思,这里我也做一下简单的说明。
top视图
是刚进入top的基本视图,我们来结合这个视图讲解各个数据的含义。
10:01:36 — 当前系统时间
12 days, 14:04 — 系统已经运行了12天14小时4分钟(在这期间没有重启过)
1 users — 当前有1个用户登录系统
load average: 0.00, 0.00, 0.00 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。看我的vps负载为0说明没什么人访问,毕竟是新站!
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
在简单说下针对MySQL负载过高出现的问题,我们然后针对占用过高的进行处理。
MySQL处在高负载环境下,磁盘IO读写过多,肯定会占用很多资源,必然CP会U占用过高。
占用CPU过高,可以做如下考虑:
1.打开慢查询日志,查询是否是某个SQL语句占用过多资源,如果是的话,可以对SQL语句进行优化,比如优化 insert 语句、优化 group by 语句、优化 order by 语句、优化 join 语句等等;
2.考虑索引问题;
3.定期分析表,使用optimize table;
4.优化数据库对象;
5.考虑是否是锁问题;
6.调整一些MySQL Server参数,比如key_buffer_size、table_cache、innodb_buffer_pool_size、innodb_log_file_size等等;
7.如果数据量过大,可以考虑使用MySQL集群或者搭建高可用环境。