ディスク I/O のチューニング
理解のために小咄形式でまとめました。
登場人物
- 太郎(後輩):入社1年目の若手エンジニア。
- 花子(先輩):システムエンジニア歴3年の先輩。
場面:オフィスのチューニング作業中
太郎が ionice
コマンドを試しながら、花子に質問する。
太郎:「花子先輩、 ディスク I/O のパフォーマンスチューニング
について調べてるんですが、 OS の設定
や ディスクのパラメータ
をどう調整すればいいのか、イメージが湧かなくて…。」
花子:「なるほどね。 ディスク I/O のチューニング
では、大きく 3 つの領域に分けて考えると整理しやすいわ。それぞれの領域を説明するわね。」
ディスク I/O のチューニング
花子:「ディスク I/O のチューニング
は、大きく 3 つの領域
があるの。」
- OS のパラメータ
- ディスクデバイスのパラメータ
- ディスクコントローラのパラメータ
花子:「チューニングは システムの負荷を減らし、I/O を効率化する
のが目的よ。どのパラメータを調整できるかは、 OS のバージョン
や ディスクの種類
によって変わるから、それぞれのドキュメントを確認するのが基本ね。」
1. OS のパラメータ
花子:「OS レベルでは、 プロセスの I/O 優先度制御
や I/O スケジューラの選択
などができるの。」
1.1 ionice - I/O スケジューリング
- Linux の
ionice
コマンドを使えば、プロセスの I/O 優先度
を制御できる。 - スケジューリングクラスは以下の 3 つ:
- 0(なし): カーネルのデフォルト設定を使用。
- 1(リアルタイム): 他のプロセスよりも優先して I/O を処理。
- 2(ベストエフォート): 標準のスケジューリング、優先度を 0 〜 7 で設定。
- 3(アイドル): 他の I/O がないときにのみ処理。
太郎:「例えば、バックグラウンドのデータバックアップ
を アイドルクラス
に設定すれば、 通常の業務に影響を与えずに I/O を実行
できるってことですね!」
1.2 I/O スケジューラの選択
花子:「Linux には 複数の I/O スケジューラ
があるから、 ワークロードに応じて最適なものを選ぶ
のがポイントね。」
-
none
(NVMe 専用) → 低遅延、オーバーヘッドが少ない -
mq-deadline
(デフォルト) → バランス型、HDD/SSD 向け -
bfq
(デスクトップ向け) → インタラクティブなレスポンスを重視 -
kyber
(データセンター向け) → SSD 向け、キューの制御が可能
太郎:「ってことは、 データベースサーバーの NVMe SSD
なら none
、 一般的な HDD
なら mq-deadline
を選ぶのが良さそうですね!」
2. ディスクデバイスのパラメータ
花子:「ディスク自体の設定も、 I/O の効率化
に影響を与えるの。」
2.1 先読み(read-ahead)設定
-
blockdev --setra
コマンドでディスクの先読みバッファサイズ
を変更可能。 - シーケンシャル I/O が多い場合 → 先読みバッファを増やす
- ランダム I/O が多い場合 → 先読みを減らす
blockdev --setra 4096 /dev/sda
太郎:「大きなファイルの 動画編集
や バックアップ処理
なら、 先読みを増やす
のが効果的なんですね!」
2.2 書き込みキャッシュ設定
花子:「ディスクの ライトキャッシュ(書き込みキャッシュ)
もチューニングポイントよ。」
-
キャッシュを有効化(
hdparm -W1
) -
キャッシュを無効化(
hdparm -W0
)
「データベースの クラッシュ時の整合性を重視する場合
は キャッシュを無効化
して、 fsync を確実に処理させる
ことが重要ね。」
太郎:「ってことは、 データの整合性が重要な環境
では 書き込みキャッシュをオフ
にして、 パフォーマンス優先ならオン
にするってことですね!」
3. ディスクコントローラのパラメータ
花子:「ディスクコントローラ(RAID コントローラなど)の設定も、 I/O の最適化
に影響を与えるの。」
3.1 RAID レベルの選択
- RAID 0(ストライピング) → 高速だけど冗長性なし
- RAID 1(ミラーリング) → 冗長性あり、読み取り速度向上
- RAID 5/6(パリティ付き) → バランス型、書き込み速度がやや低下
- RAID 10(ミラー+ストライプ) → 高性能かつ冗長性あり
「例えば、 データベースサーバー
なら RAID 10
、 大容量ストレージ
なら RAID 5
が適しているわ。」
花子:「チューニングを 自動車の運転設定
に例えると、こんな感じね。」
- OS のパラメータ(ionice, I/O スケジューラ) → アクセルやブレーキの感度
- ディスクデバイスのパラメータ(read-ahead, キャッシュ) → 燃費モードやスポーツモード
- ディスクコントローラのパラメータ(RAID, キャッシュ) → 駆動方式(2WD, 4WD)
太郎:「なるほど! ワークロードに応じた設定変更
で、 最適なドライブ
ができるんですね!」
まとめ
花子:「ディスク I/O の パフォーマンスを向上
させるには、 OS・ディスク・コントローラ
の 3 つのレベルで 適切なパラメータ調整
をするのが重要よ。」
太郎:「ありがとうございます! ionice
や read-ahead
の設定を調整して、 `実際にどれくらい I/O パフォーマンスが変わるか試してみます!」
参考リンク
システムパフォーマンス関連記事の目次
システムパフォーマンス関連記事は、以下の書籍を参考に記述しています。