skip-name-resolve重要
MySQLを使っていて、サーバーの負荷は高くないのに接続できないクライアントが発生、状況を見ようとshow processlistするとunauthenticated userがたくさんいることがわかった。そのコネクションがあふれてmax connectionsに到達、接続できないクライアントがあるらしかった。
いろいろ調べてみるとクライアントのIPアドレスのDNS逆引きをしていて、その処理が追いつかなくなるとそうなるらしく、解決方法としては2つあった。
- /etc/hostsでクライアントの名前解決をできるようにする
- /etc/my.cnfにskip-name-resolveを設定してMySQLをrestart
/etc/hostsでの対策はお手軽だがメンテナンスが面倒な感じ。
skip-name-resolveのオプション付けていなかったっけ…と調べたら付いていないことが発覚。/etc/my.cnfに設定を追記してMySQLをrestartしたらきれいにunauthenticated userがいなくなった。ただしこれを設定するとMySQLのユーザーでホスト名ベースで管理されているユーザーがログインできなくなるので注意(IPアドレスで管理されていれば問題ない)。localhostで管理されているユーザーも127.0.0.1で管理すべき。
ただ1つ気になるのは、unauthenticated userがあふれ出すタイミングがわからないということ。接続数が多くなるとあふれるのだろうけど、見ていると急にあふれているように見えた。
参考:
- http://dev.mysql.com/doc/refman/5.1/ja/dns.html
- http://d.hatena.ne.jp/y_fudi/20090109/1231484391
- http://ameblo.jp/dione/entry-10020079685.html
追記:
http://d.hatena.ne.jp/studio-m/20100924/1285303021 で id:studio-m がそれぞれの設定におけるベンチマークを計測してくれました。そちらもあわせてご覧くださいませ。