yassy's note

なんかかきます

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セクタのアクセスとなる。
f:id:yassy_225:20210613120032p:plain

問題点

先ほどの結果の何が問題だったかというと、

モデル: ATA VBOX HARDDISK (scsi)
ディスク /dev/sdb: 1074MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt

番号  開始    終了    サイズ  ファイルシステム  名前     フラグ
 1    17.4kB  1074MB  1074MB                    primary

開始位置が17.4kB=17817.6バイト、1074MBサイズとなってしまっている点。
つまり、セクタの途中から開始してしまっているため、物理的に読み込む際に効率が悪くなってしまうのだ。

効率の良いデータ配置

f:id:yassy_225:20210613120042p:plain

効率の悪いデータ配置

f:id:yassy_225:20210613120036p:plain

このため、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で割り切れる)であるため、先ほどのような警告は表示されなかった。