* BigSector ドライブを試す [#n2455dcc]

遅ればせながら,Western Digital の BigSector ドライブを試してみた.
型番は WD20EARS,2TB のドライブである.

** BigSector とは [#i4983559]

従来の HDD は読み書きの最小単位(セクタ)が 512 バイトであった.
が,BigSector ドライブではこの最小単位が 4KB ( = 4096 バイト ) となっている.

** 参考資料 [#raa3655d]

#af_amazon(4789833216,right)
BigSector についてもっと詳しく知りたい方は [http://www.bigsector.org/_smartsite/external/bigsector/index.php bigsector.org] を参照のこと.

PC/AT のパーティションテーブル(いわゆる MBR)については→が詳しい.
#clear


** 互換性 [#z63079e0]

現状では,BigSector ドライブは,電源投入後は「エミュレーションモード」で動作する.
つまり,HDD 内部の回路やファームウェアで,外見上は 512 バイト/セクタのドライブと同等の動作をするようになっている.
つまり,PC 側から 512 バイト/セクタのつもりで発行されたリクエストを HDD 内部で 4KB/セクタのリクエストに変換し,512バイト/セクタのような応答を返す.
あくまでもエミュレーションなので,HDD 上の物理的なセクタは 4KB/セクタのままである.

というわけで,レガシーなシステムで使用しても直ちに「動作しない」ということはない.
が,後に述べる理由により,パフォーマンスが低下する.

** セクタ番号の対応 [#u6ceca05]
おそらくは下表のような対応になっているものと思われる.

|512バイト/セクタ|4KB/セクタ|h
|0|0|
|1|~|
|2|~|
|3|~|
|4|~|
|5|~|
|6|~|
|7|~|
|8|1|
|9|~|
|10|~|
|…|~|

** 512バイト/セクタエミュレーションでのアクセス [#t79d0ef2]

512 バイト/セクタのエミュレーション時に例えば
> セクタ番号 0 から 8 セクタの読み込み

をする場合,HDD 内部では
+ 物理番号 0 のセクタを読み込み
+ これを 8 セクタ分の応答として返す

という動作をすればいい.

ところが
> セクタ番号 1 から 8 セクタの読み込み

となると
+ 物理番号 0 と 1 のセクタを読み込み
+ 対応する 8 セクタ分の応答を返す

という動作になる.
同じセクタ数の読み出しなのに,後者では2物理セクタの読み込みが発生することになる.
これは

> 8 で割り切れないセクタ番号で始まるアクセス

なのが原因なのは明らかだろう.

書き込みの場合は,もっと深刻である.
> セクタ番号 1 から 8 セクタの書き込み

の場合は
+ 物理セクタ 0, 1  を読み出し
+ 物理セクタ 0 の後ろ 7 論理セクタ分と物理セクタ 1 の最初 1 論理セクタ分を書き換え
+ 物理セクタ 0, 1 を書き戻す

となる.
いわゆる read-modify-write と呼ばれる動作になり,パフォーマンスへの影響は大きい.

** CHS パラメータの呪い [#na963a05]

HDD には「シリンダ数」「ヘッド数」「セクタ数」というパラメータがある.
HDD 上にはこのパラメータに沿ってセクタが配置されている,というのは昔の話.

現代の HDD の CHS パラメータは
:シリンダ|たくさん
:ヘッド|255
:セクタ|63

というパラメータとなっている.
ヘッドが 255 もあれば,ディスク(プラッタ)は 128 枚も入っていることになるが,壊れた HDD を分解してみてもそんなにたくさんの円盤は無い.
つまり,
> HDD のコントローラとファームウェアがホラを吹いている

のである.

ところで,パーティションを切る場合,Windows XP 以前だとディスクを目一杯使おうとすると,最初のトラックはパーティションテーブル等のために利用されない.
が,上記の CHS パラメータではセクタ/トラックは 63 となっている.
第一パーティションは 64 セクタ目,セクタ番号 63 から切られることになる.
パーティション先頭が 8 で割り切れないセクタ番号なので,パーティション内部のアクセスが 4KB 単位だったとしても,常に「切れの悪い」アドレスからのアクセスということになる.

困ったもんだ.

** 実験 [#jed6559e]

*** Windows XP でパーティションを切り,フォーマット [#r96d7a77]

Windows で HDD をフォーマットし,パーティションテーブルをダンプする.
第1パーテション部分は以下のようになっている.

 000001b0                                             00 01  |................|
 000001c0  01 00 07 fe ff ff 3f 00  00 00 82 74 e0 e8        |......?....t....|

パーティション開始のセクタ番号は 0x0000003f = 63 となっており,上記の説明どおりの現象となっている.
この状態でベンチマークを取ってみる.

#ref(bigsector_normal.PNG,center,50%)

*** Linux 上で強制的にセクタを整列 [#qe3efe01]

parted コマンドでパーティションを切り直す.

 # parted /dev/sdb
 GNU Parted 2.3
 Using /dev/sdb
 Welcome to GNU Parted! Type 'help' to view a list of commands.
 (parted) unit s     ///// 表示をセクタ数単位で                    
 (parted) print                                                            
 Model: WDC WD20  WD-WMAZA0000674 (scsi)
 Disk /dev/sdb: 3907029168s
 Sector size (logical/physical): 512B/512B
 Partition Table: msdos
 
 Number  Start  End          Size         Type     File system  Flags
  1      63s    3907024064s  3907024002s  primary  ntfs ///// WinXP で切ったパーティション
 
 (parted) rm 1 ///// パーティションを削除
 (parted) mkpart //// パーティションを切る
 Partition type?  primary/extended? primary ///// 基本パーティション
 File system type?  [ext2]? ntfs  ///// パーティションIDはNTFS
 Start? 64 ///// 開始セクタ番号
 End? 3907029167 ///// 終了セクタ番号 = しっぽまで
 Warning: The resulting partition is not properly aligned for best performance.
 Ignore/Cancel? ignore ///// 警告は無視
 (parted) print
 Model: WDC WD20  WD-WMAZA0000674 (scsi)
 Disk /dev/sdb: 3907029168s
 Sector size (logical/physical): 512B/512B
 Partition Table: msdos
 
 Number  Start  End          Size         Type     File system  Flags
  1      64s    3907029167s  3907029104s  primary ///// 切り直したパーティション
 
 (parted) q                                                                
 Information: You may need to update /etc/fstab.    
 
 #

これで8の倍数に揃ったパーティションが作成されたことになる.

ベンチマーク結果はこんな感じ.
多少はパフォーマンスが上がっているように見える.
けど,この程度なら「そのまま使ってもいいや」という気もしないではない.

#ref(bigsector_aligned.PNG,center,50%)


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS