一如前面所说的,www.blogguy.cn的服务器慢到了我无法容忍的地步,经过观察确定是mysql数据库给拖累的,这段时间要拿这mysql开刀了。
通过ssh连上去,执行一下mysql的Show Processlist;命令,发现一堆的用户名是unauthenticated user的用户在连接。以前没有注意这个情况,现在终于明白,这个就是mysql值得优化的第一步了。
就从这里开始。
首先看看www.blogguy.cn的show processlist运行概况
mysql> show processlist;
+--------+----------------------+----------------------+----------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+----------------------+----------------------+----------+---------+------+-------+------------------+
| 317953 | root | localhost | NULL | Query | 0 | NULL | show processlist |
| 318367 | unauthenticated user | 220.181.6.184:50295 | NULL | Connect | NULL | login | NULL |
| 318371 | unauthenticated user | 220.181.6.184:50296 | NULL | Connect | NULL | login | NULL |
| 318383 | unauthenticated user | 220.181.6.184:50299 | NULL | Connect | NULL | login | NULL |
| 318387 | unauthenticated user | 220.181.6.184:50301 | NULL | Connect | NULL | login | NULL |
| 318391 | unauthenticated user | 220.181.6.184:50303 | NULL | Connect | NULL | login | NULL |
| 318392 | unauthenticated user | 220.181.6.184:50304 | NULL | Connect | NULL | login | NULL |
| 318395 | unauthenticated user | 220.181.6.184:50305 | NULL | Connect | NULL | login | NULL |
| 318404 | root | localhost | blogguy.cn | Sleep | 1 | | NULL |
| 318409 | unauthenticated user | 220.181.6.184:50309 | NULL | Connect | NULL | login | NULL |
+--------+----------------------+----------------------+----------+---------+------+-------+------------------+
10 rows in set (0.00 sec)
看到大量unauthenticated user了吧。
这个是因为mysql的原始特性决定的,也有人说是bug,我认为不是bug,只是mysql从历史就遗留下来的一个特征而已:mysql在接到连接请求的时候,如果收到的连接请求是ip地址的话,mysql会尝试由ip地址到DNS的反向解析,白白的浪费了资源。
解决的办法如下:
1、在my.cnf中修改,[mysqld] 行下添加 --skip-name-resolve,这是公开的优化方式
改成如下的方式,下面是我的脚本
[mysqld]
datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
socket=/tmp/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
max_allowed_packet=50M
wait_timeout=2880000
interactive_timeout = 2880000
max_connections=2000
skip-name-resolve
[mysql.server]
user=mysql
#basedir=/var/lib
basedir=/usr/local/blogguy.cn/mysql
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
如果配置文件中有set-variable 这样的参数,后面可以用--skip-name-resolve的方式
2、修改/etc/hosts文件,把相应的主机名,ip等信息写道hosts文件中,这个不用细说
重启mysql试试看,是不是就没有那么多unauthenticated user了呢?