2012/07/30

仮想ディスクのファイル転送速度はホストOS並みのようです。

ubuntu10.04(ホストOS)に載せたubuntu10.04(ゲストOS)の仮想ディスクのベンチマークを採ったんですが、ホストOSとほとんど変わらない転送速度を示しました。

補)8GiB/464GiBという狭い範囲なので、「右肩下がり」のグラフにはなっていません。

仮想ディスクを確保したのは、ホストOSパーティションの前方です。

仮想ディスクに割り当てた場所のホストOSのベンチマーク結果は次のようになっています。

パーティションの使用状況をみると、全体の20%を過ぎたあたりに仮想ディスクが割り当てられているようです。

数値を見ると、ホストOS側では125MB/sくらいのようです。ゲストOSでは、122MB/s(平均)となっていますので、大きなファイルの「転送速度」はほとんど同じと言ってよさそうです。

平均アクセス時間の内訳を分析すると小さなファイルのアクセス性能を推測できそうなので、表にしてみました。

- 平均シーク時間 平均待ち時間 オーバーヘッド 合計
ホストOS 9ms 4.2ms 2.3ms 15.5ms
ゲストOS 0.2ms 4.2ms 3.8ms 8.2ms
「シーク時間」や「待ち時間」はハードウェア毎に決まった時間があります。その時間を引けば、OSの持つ「オーバーヘッド」を把握できると思います。

一つのファイルを処理するための「オーバーヘッド」は「3.8ms」くらいですが、ホストOSの「2.3ms」と比べてもそれほど悪くない値のようです。相応の「シーク時間」と「待ち時間」を加えると、(仮想ディスクのサイズにもよりますが)実際の平均アクセス時間は「6.7ms:8.5ms」程度なので、小さなファイルを大量に処理する操作以外では、速度差を体感するのは難しいように思います。

以上、「仮想マシン(VirtualBox)」のディスクアクセス性能は「思った以上に高かった」というお話でした。

補)個人的には「7割程度」の性能でも十分と考えていました。(2010年発表のビジネス用途向けパソコンで調査しました。)

特別な事情がなければ、パーティションを細切れにしてマルチブート環境を作るよりも、仮想環境で同時に複数のOSを動かす方が便利に作業できそうですね。私の場合はWindows7とのマルチブートですが、これにはもちろん特別な事情があります。

2012/07/27

ext4パーティションとLinuxカーネルの既知のバグ(VirtualBox)

新しいハードディスクにVirtualboxをインストールして古いハードディスクにあった仮想ディスクを移設すると、起動時に次のメッセージが表示されるようになりました。

メッセージの意味はよくわかりませんが、「違うファイルシステム」なら問題を避けることができそうです。以前は、VirtualBoxを「ext4」にインストールして、仮想ディスクを「ntfs」に置いていました。奇妙な使い方でしたが、今回の問題を(偶然)避けていたようです。

補)「put the disk image and the snapshot folder onto a different file system」としていました。

今回は、両方を「ext4」に導入しています。使い方を正したつもりでしたが「警告」を受けたのでファイルシステムを変更することにしました。「新しいから」という理由だけで「ext4」を使っていましたので、変更に抵抗はありません。

補)「located on an ext4 partition」→「located on an ext3 partition」としました。

ファイルシステムを「ext3」に変更すると、警告は出なくなりました。

入れ替えたあとで気が付いたんですが、「VirtualBoxの設定を変更する」という選択肢もあったようです。英語が苦手ということもあるんですが、「既知のバグ」という言葉に過剰に反応したようです。

補) 「enable the host I/O cache permanently in the VM settings」としませんでした。

振り返ると、警告を避けるために3つの選択肢があったのですが、最も手間のかかる方法を選択しました。

最終的な判断の根拠は乏しいので、この選択が正しいのか、間違っているのか、今のところわかりません。


「ext3」と「ext4」の違い:

エクステントは、ext2およびext3で使われてきた伝統的なブロックマッピング方式を置き換える概念である。エクステントは連続した物理ブロックの集合であり、大きなファイルに対するパフォーマンスを改善し、フラグメンテーションの発生を減らすことができる。ext4におけるエクステントは、4KBのブロックサイズで最大128MBまでの連続した領域をマッピングすることができる。inodeごとに4つのエクステントを格納することができる。ひとつのファイルに5つ以上のエクステントがあるとき、残りのエクステントはHtreeで構造化される。

「エクステント」という概念の有無が大きな違いのようです。

仮想ファイルは大きなファイルなのでパフォーマンスやフラグメンテーションの発生で多少不利な面がありそうですが、これは程度問題なので、致命的な不具合の発生を事前に避けられたことをよしとしたいと思います。

2012/07/26

ハードディスクの「線記録密度」などを調べるとプラッタ構造を推測できるようです。

ハードディスクの記録密度を表す指標に「線記録密度」「トラック密度」「面記録密度」があるそうです。特に線記録密度はディスクの「読み書き性能」に関係するので興味深いですが、カタログには載っていません。手持ちのハードディスクの外周部と内周部の書き込み性能を調べたついでに計算してみると次のようになりました。

項目 記号 内容 Note
型番 - WD5000AAKX-001CA0 500GB
プラッタ容量 - 500GB*1 -
セクタサイズ A 512 Byte -
セクタ総数 B 976773168 両面合計(公開領域)
セクタ総数 B' 1116312192 B*8/7(非公開領域を含む)
回転数 C 7200rpm -
平均シーク時間 - 9ms 一般的なPC用HDDのスペック
平均待ち時間 - 4.2ms プラッタが半周する時間
セクタ数(最外周) D 2246 sector/track 138MB/s*60/C/A
セクタ数(最内周) E 1159 sector/track 71.2MB/s*60/C/A
線記録密度 F 837,125 bit/inch 138MB/s*60/C*8/3.5Pi
トラック密度 G 385,586 track/inch B'/2/(D+E)/2/0.85inch
面記録密度 - 323 Giga bit/inch^2 F*G
キャッシュメモリ - 16MB -

外周部と内周部の書き込み速度(後述)を調べるとおおよその記録密度がわかるようです。分かったことからこのハードディスクのプラッタ構造を推測してみました。

  1. 7200回転/分の3.5インチハードディスクのプラッタ直径は、95ミリが一般的なようです。
  2. アームの長さと回転軸の位置は、中央のトラックにアクセスする時のヘッドの傾きが「0」となるよう調整されているようです。
  3. 1プラッタ2ヘッドの製品なので、大きなファイルのシーケンシャルライト時は2周して(両面に書き込んで)から隣のトラックにヘッドが移動するようです。
  4. ヘッドが隣のトラックに移動する時間は極めて短いです。同じ時間でのトラックの回転距離はセクタ1つ分もありません。
  5. この製品の場合は、全体の1/8程度が非公開領域となっているようです。
  6. トラックごとにアクセス時の動作周波数を変更することでセクタ数の違いに対応しているそうです。
  7. セクタの長さは一定(124μm)で、この中に512バイトのデータやECC情報、セクタ情報、隙間などが詰め込まれているそうです。
  8. プラッタには無数の小さな磁石が配置されています。この製品では、セクタ方向の間隔が狭いようなので、「トラック密度」を上げて「面記録密度」を向上させる余地があるようです。
  9. 外周部のパーティションは、「シークタイム」と「転送速度」の2つの面で性能上の利点があります。

ベンチマークテスト:

よく使われるソフトで「読み書き性能」を確認してみました。

補)465.76Gi(2^30)B=500G(10^9)Bです。(2^10=1024,10^3=1000)

4つのパーティションでテストすると、大体の傾向をつかめるようです。

補)8つのパーティションでも同じことをしてみたかったのですが、「論理ドライブ」を作れなかったので諦めました。


書き込み性能調査:(その1)

Linuxの「dd」コマンドを使って、全領域の「書き込み性能」を確認しました。(1GiB*464回)

4つのパーティションの「読み書き性能(ピンク)」を重ねたグラフです。「ほぼ一致」してますが、内周部分には「転送速度の低い領域」があります。ファイルシステム領域からの距離が関係するのかもしれません。

補)1GiBデータの書き込み速度は、140MB/s~69.2MB/sの範囲でした。グラフは4回ごとの平均値を記載しています。


パーティション分割:

実際に使う形でパーティションを分割してから比較テストを行います。

        0+----------------+
         | MBR Region     |マスターブートレコード領域(2048セクタ)1MiB
     2048|----------------|
         | Partition (1)  |Linux swap(8388608セクタ)4GiB
  8390656|----------------|
         | Partition (2)  |Linux /(33554432セクタ)16GiB
 41945088|----------------|
         | Partition (3)  |Linux /home(446443520セクタ)約212.88GiB
488388608|----------------| <-- ほぼ真ん中
         | Partition (4)  |Windos7(488384560セクタ)約232.88GiB
976773167+----------------+
       ↑パーティション開始セクタ(最終セクタ:976773167)
補)パーティションの開始セクタはすべて「2048の倍数」にしました。(特に意味はありません)


書き込み性能調査:(その2)

データ領域の書き込み位置と(パーティション先頭の)ファイルシステム領域の距離を縮めてみましたが、結果に違いはありませんでした。距離の影響ではなく、「内周付近ではプラッタの片面しか利用しない」という構造上の特徴が現れているようです。


「dd」コマンドが表示する時間:

プログラムがデータを送り始めてから、ハードディスクが受け取りを完了するまでの時間を表示するようです。ディスクのキャッシュに転送できた時点がゴールで、その後の作業時間は反映されません。

+-------+    +-------+    +-------+    +-------------------+
|       |    |       |    |       |    | 16MiB |   500GB   | 500GB HDD
|  CPU  | -> | Memory| -> | SATA2 | -> | Cache |  Platter  | シーク時間:9ms
|       |    |       |    |300MB/s|    |       |  140MB/s  | 待ち時間:4.2ms
+-------+    +-------+    +-------+    +-------------------+
512KiB Data   -->                      |-| 512KiB
1GiB Data     -->                      |-16MiB-|--1008MiB--|
キャッシュメモリよりも小さなファイルの転送時間は2ms程度と表示されました。平均的なプラッタへの書き込み時間は、次のようにデータと配置情報の2度の書き込みのために512KiBデータでは32msを必要としますが、表示されたのはボトルネックになった「伝送路」の通過時間(2ms)だけでした。

                    Data                        FAT
+-----------------+---------+-----------------+---------+ プラッタ全体での
| seek 1 | wait 1 | WRITE 1 | seek 2 | wait 2 | WRITE 2 | 平均的な
+-----------------+---------+-----------------+---------+ 書き込み時間
512KiB       13ms       6ms              13ms       -        32ms
1GiB         13ms   11500ms              13ms       -     11526ms
キャッシュメモリよりも大きなファイルの転送ではデータの書き込み時間のほとんどが反映されますが、配置情報の書き込み時間は反映されません。作業前にキャッシュメモリへの転送が完了しているからです。 データを書き込む前の「平均シーク時間」と「平均待ち時間」は、結果に反映されています。両方を合わせた時間は0~26msの幅を持ちますが、書き込み時間(11500ms)との比較では無視できるほど小さな値です。

補)512KiB程度の小さなファイルではシーク時間や待ち時間といった「オーバーヘッド」が転送速度を下げる大きな要因であることが分かります。


「dd」コマンドの利用方法:

記録媒体のメンテナンスでよく使われるコマンド形式のツールです。データの転送時間や速度を結果に表示するので利用しました。次のように無内容のデータを作り、任意のディレクトリにコピーすることもできます。

$ cd /media/589A-122A
/media/589A-122A$ sudo dd if=/dev/zero of=1gb001 bs=16384 count=65536 <--1回目
65536+0 記録始め
65536+0 記録終わり
1073741824 バイト (1.1 GB) コピー終了, 7.66519 s, 140 MB/s
 :
/media/589A-122A$ sudo dd if=/dev/zero of=1gb464 bs=16384 count=65536 <--464回目
65536+0 記録始め
65536+0 記録終わり
1073741824 バイト (1.1 GB) コピー終了, 14.8633 s, 72.2 MB/s
補)大きなファイルほどプラッタへの書き込み時間を「精度よく」計ることができます。


「『dd』コマンドが示す時間」を「プラッタに書き込む時間」に補正すると次のようになります。
  • 最外周:1056964608 バイト (1.1 GB) コピー終了, 7.65619 s, 138 MB/s
  • 最内周:1056964608 バイト (1.1 GB) コピー終了, 14.8503 s, 71.2 MB/s

小さなファイルは一瞬でキャッシュに格納されるのでプラッタの性能は計れません。

$ sudo dd if=/dev/zero of=512kb001 bs=16384 count=32
32+0 記録始め
32+0 記録終わり
524288 バイト (524 kB) コピー終了, 0.00119346 s, 439 MB/s
あるいは、
524288 バイト (524 kB) コピー終了, 0.00313677 s, 167 MB/s
補)瞬間の転送速度なので「439MB/s」や「167MB/s」となっていますが、測定を繰り返すと平均値はハードディスクの伝送路(SATA2)の上限値(300MB/s)に近づくようです。(FAT32の場合です。ファイルシステムによっては違う結果になることがあります)


読み込み性能:(ベンチマーク)

ubuntu10.04(Linux)標準のベンチマークソフト(ディスク・ユーティリティ)で読み込み性能を調べると次のようになりました。

補)フォーマット済みハードディスクの「書き込みベンチマーク」は実行できません。

読み込み性能ですが、これ以前のベンチマークと同様の結果が得られました。テストは数分で終わるので、短い時間で大体の性能を把握したい場合に使うといいかもしれません。


まとめ:

シーク時間を短くしたい場合は、ディスク使用率を下げるとよいかもしれません。使用量が同じでも、「250GB/500GB」と「250GB/250GB」では前者の平均シークタイムは後者の半分になります。小さなファイルにアクセスする場合のオーバーへッドとしてシークタイムのウェイトは大きいので、窮屈な(システム用)ハードディスクのレスポンスに不満がある場合は、(使い切れないほど)大きな容量の製品に置き換えることを検討してもよいと思います。

LinuxのようなOSで、システム領域(「/」)とユーザ領域(「/home」)をパーティションで分離することは、レスポンスを保つ上で一定の効果を期待できると思います。(「/boot」パーティションを作るのは起動時間を短めに保つ狙いがあるんですね。今やっと気が付きました。でも私には不要です)

プラッタの「線記録密度」は転送速度に直結し、「トラック密度」はシークタイムに関わるので、「面記録密度の高さ」は「性能面で有利」と言えそうです。その反面で、信頼性を心配する必要があるかもしれません。 「非公開領域」のことは分かりませんけど、大体の性能は把握できたのでOSを導入して使い始めたいと思います。

2012/07/23

ハードディスクの購入とパーティションサイズを検討した時のメモ

2年ほど前にBTOのパソコンで250GBのハードディスクを選択したんですが、仮想環境など利用するうち手狭になりました。容量自体は不足ないのですが、パーティティションの区切り方に問題があったようです。

現在のパーティション構成:

今思うと、どうしてこんなことをしたのか不思議な感じさえする「区画分け」になっています。「見通しの甘さ」がありましたが、それは「知らないことが多かった」せいだと思います。Linuxを使い始めたばかりの私には「適切な区分け」は難しい作業でした。

例えば、次のような構成なら特に問題はなかったかもしれません。

+--------------------+-+---------+---------------------------------------+
|      /dev/sda1     | |/dev/sda3|               /dev/sda4               |
|        64GiB       | |  16GiB  |                148GiB+                |
|        ntfs        | |  ext4   |                ext4                   |
|      windows7      | |  /      |                /home                  |
+--------------------+|+---------+---------------------------------------+
                      +---/dev/sda2(4GiB)Linux swap
これ(↑)は、2年ほど使ううちに考えた「今よりもましな構成の案」です。

パーティションを再構成して使いやすくしたいのですが、スムースに切り替えようと思えば新しいハードディスクを購入して入れ替えると間違いが少ないと思いましたので、使い方を整理して、機種選定を行いたいと思います。
  • Linux(メイン)とWindowsをデュアルブートする。
  • 仮想環境を割とよく使う。
  • サスペンドやハイバーネイトといった機能は使わない。
  • Linuxの入れ替えをスムースに行いたい。
  • とにかく安定して長く使えることが大事。
  • 高い性能は求めない。
  • 大容量を必要としない。

調べてみると、故障率を下げる要因に次のようなものがあることが分かりました。
  • プラッタの枚数が少ない。 → 1枚プラッタ
  • 回転数が低い。 → 5400rpm
  • 消費電力が低い。 → 4w以下

選定条件が決まったので候補を探すことにしたんですが、買い換え候補のハードディスクに「知らない技術や機能」が追加されていました。呼び名はメーカ独自のものらしいです。


新しい技術や機能:

  • Advanced Format Technology: 4KBセクタハードディスク
  • intellipower: 回転数の自動調整機能
  • intellipark: ヘッドの自動退避機能(8秒周期)

新しい機能について、「大きなお世話」と感じている人もいるようです。省エネタイプでとても魅力的でしたが、面倒は避けたいので機能のシンプルな製品を探すことにしました。

OSを入れるハードディスクとしては、とにかく「安定していること」が重要なので、今回は見送ります。最終的に決めたのは、次の製品です。


現行品と購入(予定)品:

項目 現行品 購入品 Note
型番 WD5000AAJX-75M0A0 WD5000AAKX 3.5"
インターフェイス SATA 2 SATA 3 3Gbps(300MB/s)/6Gbps(600MB/s)
容量 250GB 500GB -
セクタサイズ 512B 512B 古くからの小さいセクタです。
回転数 7200rpm 7200rpm 低速ではないですが、定速です。
キャッシュ 8MB 16MB -
シークタイム 8.9ms -ms -
プラッタ 160GB*2 500GB*1 枝番で枚数が分かるようです。
転送速度 - 126MB/s 最大値(Buffer to Disk)
Sequential Read 50MB/s *ベンチマーク -MB/s *ベンチマーク 転送速度の実効値(最大値)
Sequential Write 50MB/s *ベンチマーク -MB/s *ベンチマーク 転送速度の実効値(最大値)
消費電力 7.2w 6.1w アイドル時
騒音 25dBA 28dBA アイドル時
補)インターフェイス仕様が違いますが「下位互換性」があるようなので、コネクタ形状が同じなら問題なく使えると思います。

補)型番だけではプラッタ枚数は分からないようです。提供する側の人は「枝番」で枚数を区別できるようですが、一般には公開されないようです。転送速度などを頼りに推測する場合は、周辺の情報を集める必要もあると思います。

3つ上げた条件のうち、1つだけしか満たせませんでした。少し残念ですが、探すことにも疲れたので、この辺りでお終いにしようと思います。


AFT(Advanced Format Technology):

AFTは、ハードディスクの新しい規格に使われている技術の(メーカ独自の)呼称ということです。これまでハードディスクのセクタサイズは512バイトでしたが、新しい規格では4Kバイトになっているそうです。WindowsではVISTA以降で利用できるそうですが、Linuxの場合はどうなっているのかよくわかりません。


大容量ハードディスクでは4Kバイトセクタが当たり前となるようなので、仮想マシンで「fdisk」というツールの使い方を試してみることにしました。コマンドラインは次の通りです。
$ sudo fdisk /dev/sda
fdiskのバージョンは次の通りです。(ubuntu 10.04)
$ fdisk -v
fdisk (util-linux-ng 2.17.2)
最初に「DOS互換モードは廃止予定です。…」 というメッセージに従い、LBA方式でセクタを操作するモードに切り替えます。 その後はパーティションの始点を「8の倍数」で指定すればよいのですが、ツールの使い方を飲み込めるまでは結構難しかったです。

最終的には、ハードディスクの全セクタ数を把握して、各パーティションの開始セクタと終了セクタを「直接指示」する方法が確実だとわかりました。

直接指示した「始点」は次のように「8の倍数」です。1GiB分のセクタの倍数でもあります。終点に制限はないですが、パーティションのサイズがGiB単位になるよう調整しています。

パーティション 始点 終点 ブロック(KiByte) Note
/dev/sda1 2048 16777215 8387574(8GB-1MB) 512Byte*2048=1MiB
/dev/sda2 16777216 25165823 4194304(4GB) 1GB=4,194,304セクタで計算
/dev/sda3 25165824 41943039 8386608(8GB) -
/dev/sda4 41943040 - - 全部使う場合は終点指示は不要
補)仮想マシンでは、32GBの領域を確保し、8GB/4GB/8GB/12GBの区分けにしています。


最初のパーティションの始点は、「Windows7のパーティショニングツールとの兼ね合い」から「2048」が無難と推奨されていたので、その提案に従った結果です。

今度購入するハードディスクは「512バイト」セクタの製品ですが、将来4Kバイトセクタの製品を購入しても作業に困ることはないと思います。


新しいハードディスクのパーティションサイズ:

2年間での「/」領域の増加分を調べてみました。仮想マシンに新規インストールしたubuntuと実マシンにインストールしているubuntuのそれぞれで「ディスク使用量の解析」を実行すると、最初は2.6GBで、2年後には5.2GBになっていることがわかりました。

私の使い方ではシステム領域はそれほど増えなかったようなので、新しいハードディスクでは16GiBにしようと思います。5.2GBに対して十分な余裕がありますし、これ以上大きくてもメリットはないと思います。

+-------------------------------------+-------------------------------------+
| |/dev/sda2|        /dev/sda3        |             /dev/sda4               |
| |  16GiB  |         212GiB+         |              232GiB+                |
| |  ext4   |         ext4            |              ntfs                   |
| |  /      |         /home           |              Windows7               |
+|------------------------------------+-------------------------------------+
 +---/dev/sda1(4GiB)Linux swap
ubuntu(Linux)をメインに使います。Linuxからはntfs領域も操作できるので、普段は全ての領域を使えます。

スワップファイルは、主記憶と同じサイズにしておこうと思います。2割増くらいが「無難」かもしれませんが、スワップファイルに吐き出す頻度は少ないので、特に困ることはないと思います。

まとめ:

記録容量だけで選定するのは簡単ですが、「自分の使い方にあったものを探すのは大変」ということが分かりました。「壊れにくさ」と「扱いやすさ」を求めたわけですが、途中で挫折しています。売れ筋商品の中から選択するしかなかったからですが、私自身の調査能力の低さを悔やむしかありません。

Linuxのパーティションサイズを決めるのは最初は難しいと思います。使ってみないと「適切なサイズ」が分からないからです。パーティションを細分化することもあるようですが、その理由は私にはよくわかりません。今回、「/」と「/home」に分割することにしましたけど、この場合は「OS」の入れ替え作業が楽になるようです。その時が来れば分かると思いますが、もしかすると面倒なことが待っているのかもしれません。