Mysqlは、クエリを定期的に実行する1つのアプリケーションでのみ使用されます。サーバーを再起動すると、一定期間スムーズに動作します。その後、サーバー全体をクラッシュさせます。
私のmy.cnfファイル
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
innodb_file_per_table=1
set-variable = max_connections=200
log-slow-queries=/var/lib/mysql/slow.log
safe-show-database
query_cache_size=128M
join_buffer_size=50M
tmp_table_size=128M
max_heap_table_size=128M
table_cache=10K
long_query_time =10
open_files_limit=50000
table_open_cache=20000
table_cache=20000
query_cache_limit=134217728
innodb_buffer_pool_size=900M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
スクリーンショットから、4GBのRAMのすぐ下のマシンで実行しているようです。また、MySQLが必要に応じて使用できる最大4GBのSWAPスペースがあります。設定で許可されるメモリ量の概算は、約11.5GBです。
メモリ割り当ては複雑な性質を持っているため、これは最悪のシナリオのみの見積もりです。
箱から出して、あなたの join_buffer_size
は非常に大きいです。これは、クエリで複数回割り当てることができるセッションごとのスレッドです。
インデックスが使用されていない複数のテーブル間の複雑な結合の場合、複数の結合バッファーが必要になる場合があります。
これをデフォルト(5.6では256kb)に戻すことをお勧めします。 Explainプランで「join_buffer」を表示し始めているクエリが多数見つかった場合は、インデックスの使用法を改善するためにそれらを調べる必要があります。それが失敗した場合は、特定のクエリに対してSESSIONレベルでjoin_buffer_size
を増やすことを検討してください。
table_open_cache = 20000 table_cache = 20000
table_open_cache
に数百を超えるものが必要になることはめったにありません。 table_cache
は使用されなくなりました。
CPU(または負荷平均)が高いのは、ほとんどの場合、インデックスの不足またはクエリの記述が不十分なためです。 slowlogをオンにして、long_query_time = 1に設定します。次に、slowlogに何が表示されるかを確認します。
または、SHOW FULL PROCESSLIST;
を実行して、現在実行されているものを確認します。それでは、それらについて話し合いましょう。 SHOW CREATE TABLE
を入力してください。