2 つの専用サーバーに MySQL インスタンスがあります。 1つは生産用で、もう1つはテストベッド用です。
どちらのサーバーもほぼ同じで、唯一の違いはRAIDコントローラと仮想ボリュームです(HDは同じ)。本番環境には専用ハードウェア 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
襲撃コントローラが疑われる。どうやって確かに分かりますか?
ベストアンサー1
私の答えは、ブロックデバイスドライバの調査とユースケースに合わせて最適化する価値がある2つの部分に分かれています。しかし、データが失われる可能性があるという報告があり、最後の部分を削除しました。コメントを読んでください。
ハードウェア調査
同じアプリケーションで2つの異なるハードウェアセットでパフォーマンスが非常に異なることを理解し、その理由を理解したいと思います。それで、私は「なぜ」に対する答えを見つけるのに役立つ方法を提案することから始めます。
パフォーマンスに関しては、しばしば以下を参照してください。LinuxパフォーマンスグラフBrendan Greggが彼のブログに投稿しました。低レベル(ハードウェアに最も近い)の場合、これらのツールはblktrace
完璧であることがわかります。
このツールについてよく知らなかったので、あちこちで検索してこれを見つけました。blktraceに関する興味深い記事著者:マーク・ブルッカーは基本的に以下をお勧めします。を使用blktrace
してI / Oトレースを実行します。BTTTこのトレースから情報を抽出するツールです。これは次のとおりです(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
...
I/Oあたりの平均時間は45ミリ秒で失望し、最悪の場合は最大3.94秒です!
この調査を実行するためにblktraceを使用するより多くの方法については、Marc Brookerの記事を読んでください。とてもお得な内容です。