阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL负载高导致网站访问慢解决实例

102次阅读
没有评论

共计 2783 个字符,预计需要花费 7 分钟才能阅读完成。

今日发现网站访问慢,一次进行了排查,开始思路混乱,下面来梳理下

一、故障分析

首先,判断访问慢现象,是个人还是集体???

个人现象排查:检查个人网络,pc,浏览器、中毒等,无需多说自己百度;

集体现象排查:检查核心路由交换,ISP 运行商网络,ARP 攻击,DNS 服务,各服务器状态;

服务状态排查:zabbix 监控;创建测试页面测试: 静态页面 =》动态页面 =》动态交互页面

通过上述排查,当测试 php 与 MySQL 动态交互页面很慢,所以确定为 mysql 服务器异常,立刻登录 mysql,通过 top 命令 查看服务器负载, 发现 mysql 竟然百分之两百的 cpu, 引起 Mysql 负载这么高的原因, 估计是有 SQL 慢查询语句或磁盘 I / O 问题;

二、MySQL 负载高排查思路
1. 确定高负载的类型,top 命令看负载高是 CPU 还是磁盘 I /O。
2. mysql 下查看当前的连接数与执行的 sql 语句。
3. 检查慢查询日志,可能是慢查询引起负载高。
4. 检查硬件问题,是否磁盘故障问题造成的。
5. 检查监控平台,对比此机器不同时间的负载。

1)确定负载类型(top)

    top – 10:14:18 up 23 days, 11:01,  1 user, load average: 124.17, 55.88, 24.70 
    Tasks: 138 total,  1 running, 137 sleeping,  0 stopped,  0 zombie 
    Cpu(s):  2.4%us,  1.0%sy,  0.0%ni, 95.2%id,  2.0%wa,  0.1%hi,  0.2%si,  0.0%st 
    Mem:  3090528k total,  2965772k used,  124756k free,    93332k buffers 
    Swap:  4192956k total,  2425132k used,  1767824k free,  756524k cached 
               
    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
    30833 mysql    15  0 6250m 2.5g 4076 S 257.1 49.9 529:34.45 mysqld

2)查看当前 MySQL 的连接数与执行的 sql 语句

# 无需登陆,非交互查询,可以 grep 过滤,更直观看结果
  mysql -uroot -pqiuyuetao -S  /data/3306/mysql.sock -e “show full processlist;” |egrep -vi “sleep”
 #登陆 myslq 查看
 show full processlist;
    Id  User    Host    db  Command Time    State  Info 
    192 slave  8.8.8.142:39820 NULL    Binlog Dump 58982  Has sent all binlog to slave; waiting for binlog to be updated  NULL 
    194 slave  8.8.8.120:41075 NULL    Binlog Dump 58982  Has sent all binlog to slave; waiting for binlog to be updated  NULL 
    424891 biotherm    8.8.8.46:57861  biotherm    Query  493 Sending data    SELECT * FROM xxx_list WHERE tid = ‘1112’  AND del = 0  ORDER BY  id
    DESC  LIMIT 0, 4 
    424917 biotherm    8.8.8.49:50984  biotherm    Query  488 Sending data    SELECT * FROM xxx_list WHERE tid = ‘1112’  AND del = 0  ORDER BY  id
    DESC  LIMIT 0, 4 
    ………………………………………. 
    430330 biotherm    8.8.8.42:35982  biotherm    Query  487 Sending data    SELECT * FROM xxx_list WHERE tid = ‘1112’  AND del = 0

3)记录 SQL 慢查询
编辑 Mysql 配置文件 (my.cnf), 在[mysqld] 字段添加以下几行:

    log_slow_queries = /data/3306/slow_queries.log              #慢查询日志路径 
    long_query_time = 2                                      #记录 SQL 查询超过 2s 的语句 
    log-queries-not-using-indexes = 1                          #记录没有使用索引的 sql

查看慢查询日志

    tail /data/3306/slow_queries.log 
    # Time: 130305  9:48:13 
    # User@Host: biotherm[biotherm] @  [8.8.8.45] 
    # Query_time: 1294.881407  Lock_time: 0.000179 Rows_sent: 4  Rows_examined: 1318033 
    SET timestamp=1363916893; 
    SELECT * FROM xxx_list WHERE tid = ’11xx’  AND del = 0  ORDER BY  id DESC  LIMIT 0, 4;

日志参数说明:

Query_time: 0 Lock_time: 0 Rows_sent: 1 Rows_examined: 54
# 查询时间        锁定时间      查询结果行数      扫描行数
## 主要看扫描行数多的语句, 然后去数据库加上对应的索引, 再优化下变态的 sql 语句。

其它方法:
PHP 程序中,不使用持久连接,即使用 mysql_connetct 而不是 pconnect(Java 调整连接池)
PHP 程序执行完,应该显示调用 mysql_colse  ## 很多开发只有 open 没有 colse
SQL 慢查询语句优化地址:http://www.linuxidc.com/Linux/2017-05/143727.htm 

4)极端情况 kill sql 进程

    找出占用 cpu 时间过长的 sql,在 mysql 下执行如下命令:
    show full processlist; 
    确定后一条 sql 处于 Query 状态,且 Time 时间过长,锁定它的 ID,执行如下命令:
    kill QUERY  269815764;

注意:杀死 sql 进程,可能导致数据丢失,所以执行前要衡量数据的重要性。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-05/143726.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2783字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中