KennyQiのPHPメモと息抜きブログ

KennyQi(ケニーチー)のブログへようこそ
Web制作 PHP開発のメモと息抜きブログ
ウェブ開発・デザイン・Nucleusのメモや旅日記などを綴っています
MySQLの接続数が多いときのチューニング
2009年11月02日 | Linux | Posted by: kennyqi | 1284 PV
データベースを使ったウェブサイトで、
アクセス数が多いと、当然データベースへの接続数も多くなるかと思います。
MySQLだとデフォルトの最大接続数は100接続までOKのようですが、
接続を維持するキャッシュというのがあるようで、このサイズはデフォルトで0の模様。
また接続維持時間がデフォルトは8時間になっているようです。
ですので、アクセスがたくさんあると、
接続ができなくなるので、このような設定をしました。



とりあえず、MySQLにどれくらいの接続要求があったのか確認します。

[root@myhost ~]# mysqladmin -u root -p extended-status | egrep '(Max|Threads_)'
Enter password:
| Max_used_connections | 101 |
| Threads_cached | 0 |
| Threads_connected | 59 |
| Threads_created | 5225 |
| Threads_running | 43 |
[root@myhost ~]#

最大接続数はSUPER権限ユーザのために1つ用意されているそうで
Max_used_connectionsは101になっています。
それぞれの値については下記[参考サイト]のThinkITのリンクに書かれています。

とりあえず、こんな感じでチューニングしました。

まず、max_connections は最大接続数。これを100から500に変更。

[root@myhost ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2949
Server version: 5.0.45 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 100 |
+-----------------+-------+
1 row in set (4.97 sec)

mysql> set global max_connections = 500;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 500 |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> exit
Bye


次に、キャッシュの大きさを変更

[root@myhost ~]# mysql -u root -p -e 'SET GLOBAL thread_cache_size = 10'
Enter password:

続いて、接続維持時間を8時間から2分(120秒)に変更
(もっと少なくてもいいと思う。ちなみに参考サイトでは15秒にしている)

[root@myhost ~]# mysql -u root -p -e 'SET GLOBAL wait_timeout = 120'
Enter password:


で、今回設定した値が反映されているか確認してみる。
キャッシュの大きさ

[root@myhost ~]# mysql -u root -p -e 'select @@thread_cache_size'
Enter password:
+---------------------+
| @@thread_cache_size |
+---------------------+
| 10 |
+---------------------+

接続維持時間

[root@myhost ~]# mysql -u root -p -e 'show variables like "wait_timeout"'
Enter password:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 120 |
+---------------+-------+

これだけしておけば、当分大丈夫じゃないかと思ってますが、
さていかに。。

[参考サイト] Thanks!
MySQLの最大接続数を変更する - 治療不可
MySQL接続数多すぎ問題 - のみまくし日記
はじめてのMySQLチューニング 第2回:負荷によるベンチマークを試す - ThinkIT
MySQL の wait_timeout と thread_cache_size の関係

余裕があれば、ThinkITで紹介されている「super-smack」という
MySQLの負荷監視ツールも入れてみたいかな。

Comments

kennyqi wrote:
この設定をしたら、サーバのCPU稼働率が100%になる時間が出てきた。
うーん、さて次はどうするか。。。
11/05 02:37:46

kennyqi wrote:
CPUの稼働率、
DBとWebサーバを分けたら落ち着きました^^;
11/26 09:22:28

Add Comment