web-dev-qa-db-ja.com

iostatのtpsメジャーの解釈に関する問題

プレリュード: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デバイスの設定ミスによるボトルネックの兆候ですか、それとも何も心配していませんか?

4
dvogel

これは単一のiostat呼び出しであり、「毎秒」の値に意味のあるデータを提供せず、カウンターのみが役立ちます。単一の値から毎秒の変化を計算することはできません。2つの値とそれらの間の時間を知る必要があります。実際の値を確認するには、次のように試してください。

iostat -d 1 2

2番目の出力は実際の値になります。

Iostatのマンページから:

Iostatコマンドによって生成される最初のレポートは、システムがブートされてからの時間に関する統計を提供します。後続の各レポートは、前のレポートからの時間をカバーしています。

9
Richlv

転送速度は同じであるため、提供された出力では、MDレイヤーがトランザクションをキャッシュしてから、物理ディスクに大きなチャンクで書き込むとしています。

あなたが言ったように、データベースのリロードで見られる遅いのは、おそらくインデックスが原因です。データをロードするときにインデックスを更新せずに、最後にインデックスを再作成するだけでこれを回避できます。

2
Kamil Kisiel

特定のディスクがサポートするトランザクションレートは、トラックシーク時間の関数です。 SATAドライブの場合、これは通常5〜8ミリ秒程度であるため、1秒あたり125〜200トランザクションに近いところが予想されます。

各ドライブで約145 tpsが表示されるので、それはかなり妥当なようです。

0
Daniel Lawson