2つの専用サーバーにMySQLインスタンスがあります。 1つは本番用、もう1つはテストプラットフォーム用です。
2つのサーバーはほとんど同じですが、唯一の違いはRAIDコントローラーと仮想ボリュームです(HDは同じです)。本番環境には、専用のHW RAIDコントローラとRAID 10ボリュームがあります。一方、RAIDコントローラーはソフトウェア(Lenovo ThinkServer RAID 110i)のようで、ボリュームはRAID 5です。
MySQLのコミット中に、iowaitが高くなっていることに気付きました。
while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done
root 26661 0.0 0.0 0 0 ? D Jun09 5:41 \_ [jbd2/dm-14-8]
root 26691 0.0 0.0 0 0 ? D Jun09 0:57 \_ [jbd2/dm-10-8]
Thu Jun 18 13:49:37 CEST 2015
root 26691 0.0 0.0 0 0 ? D Jun09 0:57 \_ [jbd2/dm-10-8]
Thu Jun 18 13:49:38 CEST 2015
root 1474 0.0 0.0 0 0 ? D Jun04 0:23 \_ [jbd2/dm-5-8]
root 26691 0.0 0.0 0 0 ? D Jun09 0:57 \_ [jbd2/dm-10-8]
Thu Jun 18 13:49:39 CEST 2015
Thu Jun 18 13:49:40 CEST 2015
root 1474 0.0 0.0 0 0 ? D Jun04 0:23 \_ [jbd2/dm-5-8]
root 1478 0.0 0.0 0 0 ? D Jun04 0:03 \_ [jbd2/dm-7-8]
root 26661 0.0 0.0 0 0 ? D Jun09 5:41 \_ [jbd2/dm-14-8]
dm-10-8およびdm-14-8は、データベースパーティションに関連しています。
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 3 240904 809656 572624 7114416 0 0 59 1681 2002 5141 3 1 67 30 0
0 4 240880 809656 572632 7114604 0 0 139 2069 2090 4985 3 1 67 29 0
1 2 240880 809284 572636 7114676 0 0 27 2159 2253 4247 2 1 72 25 0
5 2 240880 809408 572656 7114820 0 0 27 2404 2254 5350 3 1 69 27 0
RAIDコントローラを疑っていますが、どうすれば確認できますか?
私の答えは2つの部分に分かれていました。ブロックデバイスドライバーの調査です。ユースケースで検討する価値のある最適化。しかし、データの損失につながる可能性があると報告されていたため、最後の部分を削除しました。コメントを参照してください。
同じアプリケーションですが、2つの異なるハードウェアセットではパフォーマンスが大きく異なるため、その理由を理解したいと思います。したがって、私はまず、「なぜ」の答えを見つけるのに役立つ手段を提案します。
パフォーマンスについては、Brendan Greggがブログで提供している Linux Performance Map をよく参照しています。低レベル(ハードウェアに最も近い)では、blktrace
のようなツールが最適であることを確認できます。
このツールを本当に知らないので、私は周りを検索しましたが、Marc Brookerによる blktraceに関する興味深い記事 を見つけました。基本的には、次のことを提案しています。blktrace
を使用してI/Oトレースを実行します。 btt ツールを使用して、このトレースから情報を抽出します。これは次のようなものです(30秒のトレースの場合)。
# blktrace -w 30 -d /dev/dm-10-8 -o dm-10-8
# blkparse -d blkmerged.out dm-10-8*
# btt -i blkmerged.out | less
出力はかなり長くなる可能性がありますが、D2Cエントリを探します。これにより、デバイスドライバーに配信されたI/Oが、このドライバーによって完了したと報告されるまでにかかる時間がわかります。
出力例(dnf upgrade
VirtualBoxで実行VM):
ALL MIN AVG MAX N
--------------- ------------- ------------- ------------- -----------
...
D2C 0.000046515 0.045781696 3.940577359 11713
...
最悪の場合、最大で3.94秒で、I/Oあたりの平均は45ミリ秒という残念な結果です。
この調査を実行するためにblktraceを使用するその他の方法については、非常に有益なMarc Brookerの記事を参照してください。
jbd2プロセスはext4ジャーナリング用です。 mysqlのコミット中にファイルシステムがジャーナルに書き込む必要があることは論理的です。これが心配の理由ではありません。 jbdによって引き起こされる負荷の量は、dm-10-8およびdm-14-8パーティションのマウントパラメーターの影響を受けます。何かが発生してサーバーが誤って再起動した場合にデータベースが破損しないようにするには、データベースパーティションで非常に保守的なジャーナリングを使用することが望ましいでしょう。比較のために、テスト環境で別のジャーナリングマウントオプションを選択できます。