フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【Linuxのしくみ】8章 ストレージデバイス を読んで自分なりにまとめ

今回はこちらの書籍「[試して理解]Linuxのしくみ〜実験と図解で学ぶOSとハードウェアの基礎知識」 の8章 ストレージデバイスについて、自己理解のために内容をかいつまんで要約します。素晴らしい書籍で理解が進むと思いますのでぜひご購入を検討ください。

HDDについて

ここの内容については現在HDD自体が非常に使用する機会が減っているため読み飛ばしました。(基本情報などで勉強した内容にも近かった)

ブロックデバイス層について

HDDやSSDといったアクセス可能なデバイスをまとめてブロックデバイスと呼びます。ブロックデバイスへのアクセス方法には2種類あり、この図の通りです。

f:id:lirlia:20200421233231p:plain

私たちがコマンドライン操作を通じてアクセスする際はファイルシステムを経由し、マウント処理やパーティションを作成する特殊な行為の際はデバイスファイルを利用します。ブロックデバイス(HDDやSSDなど)は製品によって異なるデバイスドライバが必要となりますが共通の処理が多いため、共通処理についてはあらかじめカーネルに用意されたブロックデバイス層に処理をオフロードしています。

続いてブロックデバイス層に用意されているI/Oスケジューラ先読みを確認します。

I/Oスケジューラ

I/OスケジューラはブロックデバイスへのRead/Write要求を一定期間ためておき、要求をまとめることでI/O性能の向上を行う機能です。

名前 内容
マージ 複数の連続するセクタへのI/O要求をまとめる
ソート 複数の不連続なセクタへのI/O要求をまとめる

いずれもHDDの特性を利用した機能となっています。HDDは以下の図のBのセクタと呼ばれる領域にデータを格納しています。

f:id:lirlia:20200421234110p:plain

ディスクセクタ - Wikipediaより引用

呼び出されるデータは連続したセクタに保存されていることもあれば、不連続なセクタに保存されていることもあります。保存のされ方によってHDDが回転して移動先のセクタ内の情報を取り出せるようにしなければなりません。するとセクタへのアクセス方法によって何回ディスクが回転すれば良いのか?が変わり結果的にトータルのI/O性能に影響するわけです。

ということでユーザやアプリが難しいことを考えなくてもいい感じにディスクにアクセスしてくれるようにI/O要求を組み替えてくれるのがI/Oスケジューラの利点です。

先読み

先読みとは読み込んだセクタの隣のセクタも先に読んでおく機能です。

f:id:lirlia:20200421234110p:plain

「まだ命令は来てないけど多分続きも読むよね」と気を利かせてくれることで、あとでI/O要求が来た時にディスクへの呼び出しを行うことなく処理することができます。この特性のため、効果を発揮するのはセクタを順番に追っていくシーケンシャルアクセスの時のみ効果的な機能です。(ランダムアクセスの場合は隣のセクタを使うかは不明なため)

セクターサイズとは

セクターサイズとはHDDの1セクタに格納できる総データ量のことです。Linuxでは以下のコマンドで確認できます。

[root@master vagrant]# fdisk -l | grep Sector
Sector size (logical/physical): 512 bytes / 512 bytes

この筐体では512byteとなっています。そのため512byteを超えたファイルの場合は複数のセクタにまたがって保存されます。

ブロックサイズとは

ブロックサイズとはファイルシステム上の領域を扱う最小単位です。Linuxでは以下のコマンドで確認できます。

[root@master vagrant]# xfs_info /dev/sda1 | grep bsize | grep data
data     =                       bsize=4096   blocks=10485504, imaxpct=25

この筐体では4096byte(4KB)となっています。このファイルシステム上でI/O要求を行うと必ず4KB単位で呼び出しを行います。つまりファイルシステムにI/O要求をだすと必ずこのサイズのN倍になります。図示するとこんな感じです。

f:id:lirlia:20200422003712p:plain

22KBのI/O要求が来た場合には24KB(4096byte x 4)が最小となります。そして24KBは48セクタ(24KB / 512byte)となりますので実際のHDDの48セクタをReadすることになります。

基本的にははじめから設定されているサイズを使えば良いのですが、例えば512byteのファイルをよく扱うといった特殊な用途であればブロックサイズを512byteに調整した方が余計なセクタをReadしないため効率が良いです。また注意点としてブロックサイズ=セクタサイズ x N(Nは任意の自然数)から外れてしまうと効率が悪くなります。

こちらの図ではファイルシステムのブロックサイズを4KB→10KBにしてみました。

f:id:lirlia:20200422004928p:plain

すると22KBのファイルに対して10KB x 3のI/O要求となり先ほどより8KB呼び出す先が増え、セクタ数も60と大幅に増えました。これによりHDDの回転数も増えるので結果的にI/O性能が劣化します。これはあくまでも一例ですがディスクの利用のされ方に応じて考え方を変える必要があるということです。

SSDとは

SSDはHDDと異なりデータアクセス時に電気的な動作しか行いません。(ディスクが回転して該当のセクタを探すといった機械的な動作を行わない)そのため読み書きともにHDDより早いのが特徴です。

HDDで紹介した高速化の仕組みについてはもともとSSDが早いこともありI/Oスケジューラでマージやソートを行うとI/O速度が低下する傾向にあります。

まとめ

この章ではブロックストレージ層とHDD/SSDを整理しました。書籍にはより詳しい情報や、基礎的なため今回は端折った内容も豊富に掲載されていますので勉強の際はぜひお買い求めください。