Linux でディスクスケジューラが設定されているかどうかを確認する方法

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Linux 環境において設定されたディスクスケジューラをどのように特定するかを探ります。アクティブな I/O スケジューラを理解することは、パフォーマンスチューニングやストレージ操作の最適化において重要です。

これを実現するために、以下の作業を行います。

  • /sys ファイルシステムを調べて、ブロックデバイスのスケジューラ設定を直接照会する。
  • dmesg コマンドを使用して、カーネルリングバッファ内のスケジューラ情報を検証する。
  • スケジューラを含むデバイス設定に影響を与える可能性のある udev ルールを調査する。

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") subgraph Lab Skills linux/ls -.-> lab-558708{{"Linux でディスクスケジューラが設定されているかどうかを確認する方法"}} linux/cat -.-> lab-558708{{"Linux でディスクスケジューラが設定されているかどうかを確認する方法"}} linux/grep -.-> lab-558708{{"Linux でディスクスケジューラが設定されているかどうかを確認する方法"}} end

cat /sys/block/*/queue/scheduler でスケジューラを確認する

このステップでは、Linux のブロックデバイスで使用されている I/O スケジューラをどのように確認するかを探ります。I/O スケジューラは、ブロック I/O 操作がストレージデバイスに送信される順序を決定するカーネルコンポーネントです。異なるスケジューラは、異なるワークロードに最適化されています。

この情報は、/sys ファイルシステム内のファイルを見ることで取得できます。/sys ファイルシステムは、カーネルデータ構造へのインターフェースを提供する仮想ファイルシステムです。

すべてのブロックデバイスのスケジューラを確認するには、ワイルドカードとともに cat コマンドを使用できます。* ワイルドカードは任意の文字に一致するため、/sys/block/*/queue/scheduler/sys/block/ の下にリストされているすべてのブロックデバイスのスケジューラファイルに一致します。

ターミナルが開いていない場合は、開きます。デスクトップの左側にある Xfce Terminal アイコンをクリックすることで行えます。

次に、以下のコマンドを入力して Enter キーを押します。

cat /sys/block/*/queue/scheduler

次のような出力が表示されます。

noop [deadline] cfq
noop [deadline] cfq

この出力は、利用可能なスケジューラを示しており、現在使用中のスケジューラは角括弧 [] で囲まれています。この例では、ブロックデバイスに対して deadline スケジューラが現在アクティブになっています。

どのスケジューラがアクティブであるかを理解することは、パフォーマンスチューニング、特にサーバ環境や特定のストレージ要件を持つシステムにおいて重要です。

dmesg でスケジューラを確認する

前のステップでは、/sys ファイルシステムを使用して現在アクティブな I/O スケジューラを確認しました。カーネルやデバイスの初期化に関する情報を見つけるもう一つの場所は、dmesg コマンドを使用して表示できるカーネルリングバッファです。

dmesg コマンドは、カーネルのメッセージバッファを出力します。このバッファには、起動時および実行時にカーネルが生成したメッセージが含まれており、検出されたハードウェアやデバイスドライバに関する情報も含まれます。

dmesg を使用して、システムの起動プロセス中にブロックデバイスとその設定されたスケジューラに関連するメッセージを確認できます。dmesg の出力は非常に長くなる可能性があるため、grep コマンドを使用して出力をフィルタリングし、「scheduler」という単語を含む行を見つけます。

ターミナルに以下のコマンドを入力して Enter キーを押します。

dmesg | grep scheduler

| 記号はパイプと呼ばれます。これは左側のコマンド (dmesg) の出力を取得し、右側のコマンド (grep) の入力として送信します。grep scheduler は、受け取った入力の中から「scheduler」という単語を含む行を検索します。

次のような出力が表示されるはずです。

[    X.XXXXXX] io scheduler noop registered
[    X.XXXXXX] io scheduler deadline registered
[    X.XXXXXX] io scheduler cfq registered
[    X.XXXXXX] sdX: [sd-mod] Asking for cache data failed
[    X.XXXXXX] sdX: [sd-mod] Assuming drive cache: write through
[    X.XXXXXX] sdX: [sd-mod] Enabled discard support
[    X.XXXXXX] sdX: [sd-mod] **Using deadline scheduler**

「Using [スケジューラ名] scheduler」と記載されている行を探します。これにより、起動時にブロックデバイスに対してどのスケジューラが選択されたかが確認できます。出力はシステムの具体的な設定によって多少異なる場合がありますが、登録されたスケジューラと使用されているスケジューラの記載が表示されるはずです。

この方法は起動プロセスの履歴情報を提供しますが、/sys ファイルシステムを確認すると現在の状態がわかります。どちらもシステムの I/O 設定を理解するのに役立つ方法です。

/etc/udev/rules.d の udev ルールを調べる

前のステップでは、/sysdmesg を使用してアクティブな I/O スケジューラを確認する方法を学びました。次に、デバイスが検出されたときにシステムが自動的にスケジューラを設定するようにどのように構成されているかを見てみましょう。これは通常、udev によって処理されます。

udev は Linux カーネルのデバイスマネージャです。/dev 内のデバイスノードを管理し、システムにハードウェアデバイスが追加または削除されたときのすべてのユーザー空間イベントを処理します。udev はルールを使用してデバイスを一致させ、パーミッションの設定や I/O スケジューラなどのデバイスパラメータの構成などのアクションを実行します。

udev ルールは通常、/etc/udev/rules.d/ ディレクトリに保存されます。これらのファイルは .rules 拡張子を持っています。これらのファイルを調べることで、特定のデバイスに対して I/O スケジューラを設定するルールがあるかどうかを確認できます。

まず、ls コマンドを使用して /etc/udev/rules.d/ ディレクトリ内のファイルをリストアップしましょう。

ls /etc/udev/rules.d/

ブロックデバイスやストレージに関連するものを含むファイルのリストが表示されます。出力は次のようになるかもしれません。

10-snapd.rules  50-cloudimg-settings.rules  70-snap.core.rules  70-snap.lxd.rules  70-snap.microk8s.rules  70-snap.snapd.rules  70-snap.snapd-desktop-integration.rules  99-vmware-scsi-udev.rules

次に、これらのファイルの中の 1 つを開いて、スケジューラに関連するルールがあるかどうかを確認しましょう。cat コマンドを使用してファイルの内容を表示します。たとえば、99-vmware-scsi-udev.rules を見てみましょう(正確なファイル名は環境によって多少異なる場合がありますが、ストレージまたはデバイスに関連するものを探してください)。

cat /etc/udev/rules.d/99-vmware-scsi-udev.rules

特定のデバイス属性に一致し、その後にプロパティを設定するルールが表示されるかもしれません。ATTR キーワードを使用してデバイス属性を一致させ、ATTR{queue/scheduler} プロパティを使用してスケジューラを設定する行を探してください。

たとえば、deadline スケジューラを設定するルールは次のようになるかもしれません。

## Set scheduler for VMware SCSI devices
ACTION=="add|change", SUBSYSTEM=="block", ATTRS{idVendor}=="VMware", ATTRS{idModel}=="VMware Virtual S", ATTR{queue/scheduler}="deadline"

このルールは、特定のベンダーとモデル属性を持つブロックデバイス (SUBSYSTEM=="block") に一致し、それらが追加または変更されたときにそれらのスケジューラを deadline に設定します。

これらのルールを調べることで、システムでデフォルトの I/O スケジューラがどのように構成されているかを理解できます。

まとめ

この実験では、Linux で設定されたディスクスケジューラを確認する 2 つの主要な方法を学びました。まず、cat コマンドを使用して /sys/block/*/queue/scheduler の内容を調べることで、/sys ファイルシステムを利用しました。これにより、利用可能なスケジューラを確認し、角括弧で示される現在使用中のスケジューラを特定することができました。

次に、dmesg コマンドを使用してカーネルリングバッファを調べ、デバイス初期化時のスケジューラ情報を確認しました。これは、アクティブなスケジューラを確認し、ストレージデバイスに関連するカーネルメッセージを理解するための別の方法を提供します。最後に、/etc/udev/rules.d の udev ルールを調べることを、スケジューラ構成の潜在的な場所として簡単に触れましたが、この詳細な手順は提供された内容では完全には記載されていませんでした。