来源:http://www.tuifei.com/2007/07/18/mysql-tuning-tools.htm
最近朋友的网站由于用户量上升及其他原因,使得mysql数据库性能出现严重问题,导致用户无法正常登录及使用。
为了找出性能问题的根结,Google了很多,最后从以下方面入手:
1. 配置mysql log_slow_queries 功能
输出哪些耗时的sql语句到日志中,使用mysqldumpslow去统计,从而确定是哪些应用的数据库查询影响了数据库性能。
log_slow_queries在my.cnf的配置,示例如下:
log_slow_queries
long_query_time = 2
log_long_format
mysqldumpslow 的使用,到日志所在目录,执行:
# mysqldumpslow ./www-slow.log
2. 利用mytop实时查看mysql的负载情况
mytop的最新版本为1.6,mytop-1.6.tar.gz的安装需要以下软件包支持:
DBI-1.58.tar.gz
TermReadKey-2.30.tar.gz
DBD-mysql-4.005
此软件安装比较简单,可以参照readme即可。
一下是安装中常会出现的问题:
如果运行mytop时出现以下错误:
1) mysql.so: undefined symbol: DBIc_TRACE_LEVEL
基本上确定是DBI及DBD-mysql的版本不匹配造成的,
详见:
http://www.cpanforum.com/posts/5528
2) Segmentation fault
基本上确定是由于TermReadKey版本和mytop要求不匹配造成的,
详见:
http://www.webhostingtalk.com/archive/index.php/t-429329.html
在找到有问题的sql语句後,对my.cnf也做了相应的处理,主要是参考my-huge.cnf,内容如下,欢迎对此配置进行讨论:
# cat my.cnf
- [client]
- port = 3306
- socket = /tmp/mysql.sock
- [mysqld]
- port = 3306
- socket = /tmp/mysql.sock
- skip-locking
- key_buffer = 384M
- max_allowed_packet = 1M
- table_cache = 512
- sort_buffer_size = 4M
- read_buffer_size = 4M
- net_buffer_length = 64K
- read_rnd_buffer_size = 8M
- myisam_sort_buffer_size = 64M
- max_connections = 1500
- max_connect_errors = 1500
- query_cache_size = 64M
- thread_cache_size = 8
- thread_concurrency = 8
- #log_slow_queries
- #long_query_time = 5
- #log_long_format
- [mysqldump]
- quick
- max_allowed_packet = 16M
- [mysql]
- no-auto-rehash
- [isamchk]
- key_buffer = 256M
- sort_buffer_size = 256M
- read_buffer = 2M
- write_buffer = 2M
- [myisamchk]
- key_buffer = 256M
- sort_buffer_size = 256M
- read_buffer = 2M
- write_buffer = 2M
- [mysqlhotcopy]
- interactive-timeout
经过测试发现key_buffer及query_cache_size 对mysql性能影响较大。
另外,发现mysq在linux下高负载运行时,kswapd会经常出来捣乱,致使情况变得更糟。系统load average会急剧升高,直至mysql没有任何响应。
对此感兴趣的可以搜索 mysql+kswapd
如以下讨论:
http://www.ale.org/archive/ale/ale-2001-09/msg00149.html
http://bugs.mysql.com/bug.php?id=28751