找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 27|回复: 2

大哥们,mysql 导致负载高怎么办啊。

[复制链接]

27

主题

236

回帖

561

积分

高级会员

积分
561
发表于 2013-4-17 13:05:00 | 显示全部楼层 |阅读模式
本帖最后由 ohmyga 于 2013-4-17 13:06 编辑

平时都正常昨天出现一次  今天出现一次,重启下mysql 就好,这是什么情况。。。

top - 13:10:00 up 110 days, 32 min,  1 user,  load average: 826.25, 507.02, 239.61
Tasks: 449 total,  23 running, 425 sleeping,   0 stopped,   1 zombie
Cpu(s): 18.5%us, 24.6%sy,  0.0%ni, 48.9%id,  7.8%wa,  0.1%hi,  0.2%si,  0.0%st
Mem:  12309624k total, 12229260k used,    80364k free,   952784k buffers
Swap:  4192956k total,      144k used,  4192812k free,  4347256k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               
29903 mysql     15   0 7445m 3.8g 5292 R 313.4 31.9   3145:17 mysqld                                                               
29965 www       15   0  286m  17m  10m R  2.0  0.1   0:00.36 php-cgi                                                               
30201 www       16   0  287m  17m  10m R  2.0  0.1   0:00.69 php-cgi                                                               
30211 www       15   0  287m  14m 7676 S  2.0  0.1   0:00.23 php-cgi                                                               
30214 www       16   0  286m  14m 8260 S  1.7  0.1   0:00.34 php-cgi                                                               
29982 www       16   0  287m  17m  10m R  1.3  0.1   0:00.35 php-cgi                                                               
30104 www       16   0  286m  16m 9.9m R  1.3  0.1   0:00.30 php-cgi                                                               
29980 www       16   0  289m  16m 9960 S  1.0  0.1   0:00.14 php-cgi                                                               
30033 www       15   0  287m  16m 9.8m R  1.0  0.1   0:00.27 php-cgi                                                               
30086 www       15   0  286m  17m  11m S  1.0  0.1   0:00.34 php-cgi                                                               
30120 www       16   0  287m  16m 9.8m R  1.0  0.1   0:00.23 php-cgi                                                               
26580 www       16   0 88360  47m 1040 S  0.7  0.4  60:43.22 nginx                                                                  
29025 root      25   0 66088 1200  984 D  0.7  0.0   0:00.22 sh                                                                     
29139 root      25   0 66088 1184  984 S  0.7  0.0   0:00.18 sh                                                                     
29956 www       16   0  287m  17m  10m R  0.7  0.1   0:00.37 php-cgi                                                               
29985 www       15   0  286m  17m  10m R  0.7  0.1   0:00.24 php-cgi                                                               
30026 www       15   0  286m  14m 8620 S  0.7  0.1   0:00.05 php-cgi                                                               
30110 www       15   0  287m  16m 9460 R  0.7  0.1   0:00.15 php-cgi                                                               
30124 www       16   0  286m  17m  10m S  0.7  0.1   0:00.48 php-cgi      
回复

使用道具 举报

110

主题

496

回帖

1332

积分

金牌会员

积分
1332
发表于 2013-4-17 13:09:28 | 显示全部楼层
在Linux VPS系统上有时候会发现MySQL占用CPU高,导致系统的负载比较高。这种情况很可能是某个SQL语句执行的时间太长导致的。优化一下这个SQL语句或者优化一下这个SQL引用的某个表的索引一般能解决问题。

但是怎么找到是哪个SQL语句的执行时间过长呢?可以通过MySQL Slow Log来找,详解如下。

首先找到MySQL的配置文件my.cnf,根据不同版本的mysql开启慢查询的配置也不一样

mysql 5.0

[mysqld]
long_query_time = 1
log-slow-queries = /var/log/mysql/slow.log

mysql 5.1

[mysqld]
long_query_time = 1
slow_query_log=1
slow_query_log_file = /var/log/mysql/slow.log

long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。
log-slow-queries和slow_query_log_file 设置把日志写在哪里

把上述参数打开,运行一段时间,就可以关掉了,省得影响生产环境

接下来就是分析了,我这里的文件名字叫 0 2/var/log/mysql/slow.log。
先mysqldumpslow –help下,主要用的是

-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string

-s,是order的顺序,说明写的不够详细,主要有
c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的

mysqldumpslow -s c -t 20 0 2 0 2/var/log/mysql/slow.log
mysqldumpslow -s r -t 20 0 2 0 2/var/log/mysql/slow.log

上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。

mysqldumpslow -t 10 -s t -g “left join” 0 2 0 2/var/log/mysql/slow.log
这个是按照时间返回前10条里面含有左连接的sql语句。

用了这个工具就可以查询出来那些sql语句是性能的瓶颈,进行优化,比如加索引,该应用的实现方式等。
回复

使用道具 举报

383

主题

5944

回帖

1万

积分

论坛元老

积分
13073
发表于 2013-4-17 13:29:42 | 显示全部楼层
挂TZ
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Discuz! X

GMT+8, 2025-1-13 10:31 , Processed in 0.017402 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表