プレリュード:mysqldumpコマンドを使用して5.2 GBのデータベースをダンプしました。これは、メモリが512 MBしか搭載されていないパワー不足の仮想サーバーで行いました。約1時間かかりました。現在、デュアルコアCPUと2 GBのメモリを搭載したデスクトップマシンにデータベースをリロードしています。リロードは9時間目で、終了まであと少しかどうかはわかりません。約1年前に同じデータベースにこのデータベースをリロードしましたが、2時間しかかかりませんでした。そのときと今の違いは、raid1モードでは、1台のATAハードディスクを2台のSATAディスクに交換したことです。 raid1は(理論的には)遅くなることは知っていますが、4.5倍遅くなることはありません!それで私はiostatを壊しました、そして私はもっと混乱しました。
$ Sudo iostat
Linux 2.6.30-2-AMD64 (lukahn) 12/12/2009 _x86_64_ (2 CPU)
avg-cpu: %user %Nice %system %iowait %steal %idle
7.13 0.00 1.94 27.96 0.00 62.97
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 144.02 198.41 11139.44 9322418 523399320
sdb 143.78 165.59 11137.39 7780516 523303000
hda 0.01 0.05 0.00 2492 0
md0 0.66 6.44 0.71 302538 33496
md1 7.32 67.02 7.51 3148938 352960
md2 6.08 240.02 18.95 11277610 890584
md3 1389.80 46.85 11106.55 2201410 521853640
md4 0.41 3.03 0.21 142322 9824
sdaとsdbは、/ proc/mdstatで確認できるように、mdデバイスをサポートする実際のSATAドライブです。
$ cat /proc/mdstat
Personalities : [raid0] [raid1]
md4 : active raid0 sda6[0] sdb6[1]
48821248 blocks 64k chunks
md3 : active raid1 sda5[0] sdb5[1]
48829440 blocks [2/2] [UU]
md2 : active raid1 sda4[0] sdb4[1]
1318358080 blocks [2/2] [UU]
md1 : active raid1 sda2[0] sdb2[1]
48829440 blocks [2/2] [UU]
md0 : active raid1 sda1[0] sdb1[1]
9767424 blocks [2/2] [UU]
リロード元の.sqlファイルはmd2の/ homeパーティションにあり、/ varパーティションはmd3にあります。 MySqlがインデックスを再生成するため、md3に書き込まれたブロックは、md2から読み取られたブロックよりもはるかに高いと思います。しかし、私が抱えている大きな問題は、md3のtpsメジャーをsdaおよびsdbのtpsメジャーよりもはるかに高くできることです。
Iostatの-mオプションは、md3とsda/sdbの両方について、同じ量のデータ(5.55 MB /秒)がディスクに書き込まれていることを示しています。
$ Sudo iostat -m
Linux 2.6.30-2-AMD64 (lukahn) 12/12/2009 _x86_64_ (2 CPU)
avg-cpu: %user %Nice %system %iowait %steal %idle
7.39 0.00 2.00 28.16 0.00 62.44
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 145.16 0.10 5.55 4976 267768
sdb 144.90 0.09 5.55 4143 267716
hda 0.01 0.00 0.00 1 0
md0 0.66 0.00 0.00 154 16
md1 7.18 0.03 0.00 1580 172
md2 6.19 0.13 0.01 6153 443
md3 1418.41 0.02 5.53 1146 266994
md4 0.40 0.00 0.00 69 5
Iostatのmanページには次のように書かれています。
tps
デバイスに発行された1秒あたりの転送数を示します。転送は、デバイスへのI/O要求です。複数の論理要求をデバイスへの単一のI/O要求に組み合わせることができます。転送のサイズは不確定です。
私はそれらが完全に同じであるとは思っていませんが、確かに864%違いはありません!これは、mdデバイスの設定ミスによるボトルネックの兆候ですか、それとも何も心配していませんか?
これは単一のiostat呼び出しであり、「毎秒」の値に意味のあるデータを提供せず、カウンターのみが役立ちます。単一の値から毎秒の変化を計算することはできません。2つの値とそれらの間の時間を知る必要があります。実際の値を確認するには、次のように試してください。
iostat -d 1 2
2番目の出力は実際の値になります。
Iostatのマンページから:
Iostatコマンドによって生成される最初のレポートは、システムがブートされてからの時間に関する統計を提供します。後続の各レポートは、前のレポートからの時間をカバーしています。
転送速度は同じであるため、提供された出力では、MDレイヤーがトランザクションをキャッシュしてから、物理ディスクに大きなチャンクで書き込むとしています。
あなたが言ったように、データベースのリロードで見られる遅いのは、おそらくインデックスが原因です。データをロードするときにインデックスを更新せずに、最後にインデックスを再作成するだけでこれを回避できます。
特定のディスクがサポートするトランザクションレートは、トラックシーク時間の関数です。 SATAドライブの場合、これは通常5〜8ミリ秒程度であるため、1秒あたり125〜200トランザクションに近いところが予想されます。
各ドライブで約145 tpsが表示されるので、それはかなり妥当なようです。