InnoDBテーブルを使用してMySQL5.5を実行しています。 1秒あたり約200のクエリがあります。 500000行以上のテーブルもあります。しかし、特にjdb2では、サーバーの負荷とio/waitに大きな問題があります。
jdb2/md2-8は99%のIO /待機を取っています。iotop出力イメージを参照してください: Iotop出力
ボックスの仕様:Xeon 1246 v3、32 GB RAM、2x 240 Intel SSD RAID 1
設定に問題があるのか、それともRAIDに関連する問題なのかわかりません。任意のヒント ?
私のmysqlmy.cfg:
innodb_file_per_table = 1
join_buffer_size = 1M
open_files_limit = 10000
myisam_use_mmap = 1
query_cache_type = 1
table_open_cache = 2000
concurrent_insert = 2
max_connections = 3000
query_cache_size = 16M
key_buffer_size = 16M
read_buffer_size = 8M
query_cache_limit = 4M
query_cache_min_res_unit = 1K
tmp_table_size = 64M
thread_cache_size = 1500
sort_buffer_size = 2M
max_heap_table_size = 64M
innodb_buffer_pool_size = 5000M
read_rnd_buffer_size = 128M
thread_concurrency = 8
thread_stack = 1M
innodb_log_buffer_size = 2M
ありがとう。
jbd2は、ファイルシステムジャーナルをディスクに同期するために使用されるカーネルプロセスです。これは、MySQLセットアップが現時点で書き込みにバインドされていることを意味します。
クエリ数が少ない(1秒あたり200)場合のjdb2の負荷が高いなど、特に高速SSDの場合は非常に奇妙です。キャッシュレスRAIDカードを使用していますか? SSD内部キャッシュが無効になり、パフォーマンスが低下する可能性があります。もしそうなら、あなたは試みることができます:
innodb_flush_log_at_trx_commit=0
オプションn.1およびn.2には、電力が失われた場合に一部のトランザクションが失われるリスクがありますが、ゼロではないことに注意してください。断然、最も安全なオプションは3番目のオプションです-適切なRAIDカードを購入することです。
考慮すべき2つのこと:
1)クエリに適切なインデックスがありますか?
2)サーバーにadd RAMを追加できますか?
#1に対処することで、クエリを実行するために必要な全表スキャンの数を大幅に減らすことができます。ただし、どのタイプのクエリが最も多くのIO負荷を引き起こしているのかを理解するには、かなりの時間を費やす必要があります。
#2に対処することで、より多くのデータベースをRAMにキャッシュできるようになり、クエリが高速化されると同時にIOが削減されます。
My.cnfには、削除する必要のある4行が含まれています。
read_buffer_size
read_rnd_buffer_size
join_buffer_size
thread_stack
これらはすべて接続ごとにありますRAM要件であり、RAMフットプリントを必要以上に高くします。デフォルトを機能させて、余裕を持って応答時間を改善します。 RAM内。
より詳細な分析については、OriginalPostに以下を追加してください。
SHOW GLOBAL STATUS;
SHOW GLOBAL VARIABLES;
SHOW ENGINE INNODB STATUS;
1日に1つずつ、最大5つの特定のcfg推奨事項を適用する場合は、監視します。