先週から特に理由もなく、私のウェブサイトの速度が急激に低下し始めました。MySQL にログインして show processlist を実行したところ、次のような結果になりました。
mysql> show full processlist;
+------+------+-----------+---------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+------+-----------+---------+---------+------+-------+------------------+
| 2047 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2049 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2050 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2052 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2053 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2054 | web | localhost | myDB | Sleep | 81 | | NULL |
| 2055 | web | localhost | myDB | Sleep | 81 | | NULL |
...
| 2066 | web | localhost | myDB | Sleep | 80 | | NULL |
| 2067 | web | localhost | myDB | Sleep | 80 | | NULL |
| 2178 | web | localhost | myDB | Sleep | 76 | | NULL |
+------+------+-----------+---------+---------+------+-------+------------------+
131 rows in set (0.00 sec)
MySQL を再起動すると、予想どおりプロセスがなくなります。Web サイトを更新してプロセスをすばやくチェックすると、しばらくすると消えるクエリがいくつか表示されます。すべては完璧ですが、しばらくすると、突然、上記のようなプロセスが多数表示されます。これにより、当然、Web サイトがフリーズします。
これらは、しばらくすると値の前に消えwait_timeout
、その後しばらくすると異なる ID で再び表示されるようです。
この原因が何なのか分かる人はいますか?
私のサーバーの仕様:
CentOS 5
MySQL バージョン: 5.1.33-log ソース配布
RAM 8GB
my.cnfの一部
[mysqld]
default-character-set = utf8
character_set_server = utf8
default-collation = utf8_unicode_ci
collation_server = utf8_unicode_ci
ft_min_word_len = 3
port = 5689
socket = /tmp/mysql.sock
skip-locking
skip-name-resolve
key_buffer_size = 256M
group_concat_max_len = 2048
max_allowed_packet = 10M
table_cache = 512
table_definition_cache = 512
sort_buffer_size = 10M
net_buffer_length = 8K
read_buffer_size = 40M
read_rnd_buffer_size = 10M
myisam_sort_buffer_size = 8M
long_query_time = 1
net_read_timeout = 30
net_write_timeout = 60
log_slow_queries = /var/log/slowqueries
query_cache_type = 1
query_cache_limit = 5MB
query_cache_size = 134217728
max_heap_table_size = 24MB
tmp_table_size = 24MB
expire_logs_days = 99
max_connections = 500
init-connect = 'SET NAMES latin1'
thread_cache_size = 4
wait_timeout = 600
皆さんの誰かが私を正しい方向に導いてくれることを願っています。私にはアイデアがありません。
答え1
MySQL サーバーの値を確認してください。MySQL でデフォルトのユーザーを使用していますか? 次の 2 つの点も確認してください。
特定のサーバーのみが mysql データベースに接続できることを確認してください。% から接続するユーザーがいる場合は、適切なパスワード (および適切な理由) があることを確認してください。
アプリケーションを実行するために設定したコード要件の範囲外で、誰かがアプリケーションにクエリを送信していないことを確認してください。誰かがサイトにアクセスすることなく、データベースにデータを挿入している可能性があります。
netstat を注意深く監視して、アクティブな接続をしばらく追跡します。wait_timeout は、誰かまたは何かがサーバーにクエリを実行したことを示します。注意深く監視すると、それが誰であるかがわかります。監視したら、大幅な変更を加えずにすぐにブロックする必要がある場合は、iptables を使用します。
最後に...MySQLのログを一時的に有効にしてください。サーバーにダメージを与えます。しかしmysql で何が起こっているかを正確に確認できます。
my.cnf ファイルを編集し、以下を追加 (または更新) します。
log = /var/log/mysql/mysql.log
編集: 情報フィールドの NULL 値は、ステートメントが実行されていないことを示しているため、上記の提案を行いました。