partedコマンド使用時におけるディスクのアライメント
※過去にまとめたwikiからの移行記事
アライメントとは一列に並べる、調節するという意味からディスクパーティションの開始位置を調整することを指す。
通常はアライメントを行う必要がないのだが、パーティションを切る場合に気にしなければならないシーンがある。
アライメントを気にする場面
下記のようにpartedコマンドでパーティションを作成する。
$ parted -s /dev/sdb mkpart primary 0 1GB
すると、下記の警告が表示される場合がある。
警告: The resulting partition is not properly aligned for best performance.
これはアライメントが最適でないため、パフォーマンスに影響が出るかもというメッセージだ。
実際にどのようにパーティションが切られたかを確認すると、
$ parted -s /dev/sdb print モデル: ATA VBOX HARDDISK (scsi) ディスク /dev/sdb: 1074MB セクタサイズ (論理/物理): 512B/512B パーティションテーブル: gpt 番号 開始 終了 サイズ ファイルシステム 名前 フラグ 1 17.4kB 1074MB 1074MB primary
となっている。
これの何が問題かというと、ディスクのセクタサイズが関係している。
【前提知識】ディスクのセクタサイズについて
基本的にディスクは1セクタ=512バイトである。
※なお、最近では1セクタ=4096バイト(4Kディスク)も見られるが、今回は512バイトとしておく。
4Kディスクの場合でも考え方は同じ。
HDDは物理的にセクタ単位でデータを読み取るため、基本的には512バイトずつ読み込まれる。
ちなみに、メモリやファイルシステムは4096バイト単位でデータを扱うため、OS的には4096バイト単位となる。
4096バイト/512バイト=8セクタとなるため、HDDとしては8セクタのアクセスとなる。
問題点
先ほどの結果の何が問題だったかというと、
モデル: ATA VBOX HARDDISK (scsi) ディスク /dev/sdb: 1074MB セクタサイズ (論理/物理): 512B/512B パーティションテーブル: gpt 番号 開始 終了 サイズ ファイルシステム 名前 フラグ 1 17.4kB 1074MB 1074MB primary
開始位置が17.4kB=17817.6バイト、1074MBサイズとなってしまっている点。
つまり、セクタの途中から開始してしまっているため、物理的に読み込む際に効率が悪くなってしまうのだ。
効率の良いデータ配置
効率の悪いデータ配置
このため、partedコマンドが警告を出している。
これを回避する方法としては、開始位置に0%を指定することで、partedコマンドが適切なアライメントを算出してくれる。
$ parted -s /dev/sdb mkpart primary 0% 100% $ parted -s /dev/sdb print モデル: ATA VBOX HARDDISK (scsi) ディスク /dev/sdb: 1074MB セクタサイズ (論理/物理): 512B/512B パーティションテーブル: gpt 番号 開始 終了 サイズ ファイルシステム 名前 フラグ 1 1049kB 1073MB 1072MB primary
開始位置である1049kBはセクタの始まり(512Bで割り切れる)であるため、先ほどのような警告は表示されなかった。