【 ionice 】コマンド――ディスクI/Oの優先度を変更するLinux基本コマンドTips(136)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ディスクI/Oの優先度を変更する「ionice」コマンドです。

» 2017年08月18日 05時00分 公開
[西村めぐみ@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ディスクI/Oの優先度を変更する「ionice」コマンドです。

ioniceコマンドとは?

 プロセスがディスクを使用する際の「クラス」と「優先度」を表示、変更するコマンドです。ディスクのI/OスケジューラーにLinux標準の「CFQ(Completely Fair Queuing)」を使用している場合に有効です。

 niceコマンド(第134回)のように、コマンド実行時に優先度を指定したり、reniceコマンド(第135回)のように、実行中のプロセスの優先度を変更したりできます。



ioniceコマンドの書式

ionice [オプション] -p プロセスID

ionice [オプション] [実行したいコマンドとそのオプション]

※[ ]は省略可能な引数を示しています。





ioniceの主なオプション

短いオプション 長いオプション 意味
-c クラス --class クラス I/Oスケジューリングのクラスを指定する(0〜3、1が最優先)
-n レベル --classdata レベル クラス1と2の中での優先度を0〜7で指定する(0が最優先)
-p プロセスID --pid プロセスID 対象とするプロセスのID(空白区切りで複数指定可能)
-t --ignore クラスや優先度がセットできない場合もコマンドを実行する ※1

※1 例えば「ionice -c 1 コマンド」とした場合、一般ユーザーでは「1」が指定できないためエラーとなりコマンドは実行されない。しかし「ionice -t -c 1 コマンド」とすると優先度を指定しない状態でコマンドが実行される。




ディスクI/Oのクラスと優先度を指定してコマンドを実行する

 ioniceコマンドを使うと、ディスクのI/Oスケジューリングの際に使うクラスと「優先度」を変更できます。niceコマンドで設定できるのは優先度のみですが、ioniceコマンドでは3種類のクラスと、クラス内での優先順位を決める優先度があります。

 クラスと優先度を組み合わせて指定すると、ディスクアクセスが多いプロセスの処理速度を高めたり、逆にシステムへの負荷を下げたりするために使用できます。

 I/Oスケジューリングクラスは「-cクラス」オプションで指定します。クラスは4つ(0〜3)あり、優先度は以下の通りです。

クラス 意味 優先度
0 なし(none) ※2
1 リアルタイム(realtime) 最高。最優先される。一般ユーザーは指定できない
2 ベストエフォート(best-effort) 指定がない場合のデフォルト
3 アイドル(idle) 最低。一般ユーザーのみ指定できる ※3

※2 ベストエフォート扱いになる。
※3 一定期間、他のプログラムがディスクアクセスしようとしなかったときのみディスクを利用する。



 クラス1(リアルタイム)と2(ベストエフォート)の場合、さらに、「-n」オプションを使ってクラス内の優先度を指定できます。指定できる範囲は0〜7で、0が最優先。指定しなかった場合は「4」になります。なお、「クラス1、優先度7(最低)」は、「クラス2、優先度0(最高)」よりも優先されます。

 「ionice -c クラス -n 優先度 コマンド」で、クラスと優先度を指定してコマンドを実行します。例えば、「rsync -av ~ /mnt/0818/」を最も低い優先度で実行するのであれば「ionice -c 3 rsync -av ~ /mnt/0818/」のように実行します。

 rsyncはディレクトリの同期を行うコマンドです(第82回第83回)。画面1は、ホームディレクトリのファイルを/mntにマウントしたディスクの「0818」ディレクトリにバックアップのためコピーする、という操作をイメージしています。

 なお、一般ユーザーはクラス1(リアルタイム)を指定できないため、「-c 2 -n 0」の優先度が最も高くなります(画面1)。

コマンド実行例

ionice -c 3 rsync -av ~ /mnt/0818/

(最低レベルの優先度でrsyncコマンドを実行する)

ionice -c 1 -n 0 rsync -av ~ /mnt/0818/

(最高レベルの優先度でrsyncコマンドを実行する。root権限が必要)

ionice -c 2 -n 0 rsync -av ~ /mnt/0818/画面1

(一般ユーザーで指定可能な最高レベルの優先度でrsyncコマンドを実行する)


画面1 画面1 ディスクI/Oのクラスと優先度を指定してrsyncコマンドを実行したところ


プロセスのクラスと優先度を変更する

 実行中のプロセスに対してディスクI/Oのスケジューリングのクラスや優先度を指定したい場合は「-p プロセスID」で指定します。インデックスの作成や定期的なウイルスチェックなど“実行を中断したくはないけれど他の処理の邪魔になっているので優先度を下げたい”といった場合に便利です。逆に、早く終わらせるために優先度を上げることも可能です。

コマンド実行例

ionice -c 3 -p 9999

(プロセスID「9999」のI/Oスケジューリングのクラスを最低レベルに落とす)


 なお、「-p」オプションのみで実行した場合は、指定したプロセスの現在の設定を表示します。「-p」も指定せず「ionice」のみで実行した場合は、現在のクラスと優先度を表示します。

 画面2では「tar -cf dum.tar /usr/share」で動作を試しています。tarコマンドはファイルのアーカイブを作成するコマンドです(第40回第41回)。ここでは単に“ファイルを読み書きする処理”として実行しています。

 メッセージは不要なため「2> /dev/null」を指定し、最後に「&」を付けてバックグラウンドで実行しています ※4。

※4 CentOS 7環境では、ioniceを指定せずに実行したプロセスのクラスは「unknown」となるため、画面2のように「不明な」と表示される。prioは、優先度(priority)を示す。


画面2 画面2 実行中のプロセスのクラスを変更しているところ


ioniceコマンドはどんな場合に有効か

 複数のI/O要求を並べ替えることを「I/Oスケジューリング」と呼びます。

 I/OスケジューラーとしてCFQを選んだ場合、あらかじめ用意しておいた多数のキューに対して各プロセスのI/O要求を1つずつ割り振ることで、各プロセスのI/O要求が公平に処理されるように動作します。ioniceコマンドはこの優先度を変更します。

 Linuxでは、使用するスケジューラーをデバイスごとに指定することが可能です。

 スケジューラーの設定は「/sys/block/デバイス名/queue/scheduler」の内容から確認できます。このファイルはcatコマンドなどで表示でき、現在有効になっている設定は「noop deadline [cfq]」のように、「[]」で囲まれています。

表示 意味
noop I/O要求をほぼ要求順に処理する
deadline ディスク上で位置が近いI/O要求を優先する(例えばHDDヘッドの移動量を減らす)
cfq プロセスごとに公平に割り振る

 HDDのデバイス名は、「lsblk」コマンドや「df」コマンド(第58回)、rootユーザーであれば「fdisk -l」などで確認できます。画面3ではlsblkコマンドを使用しています。

画面3 画面3 I/Oスケジューラの設定を表示したところ


ioniceの効果を確かめる(参考情報)

 コマンドを「time コマンド」のように実行すると、どのくらい処理に時間がかかったかを完了時に表示します。

 大変簡易的ではありますが、このようにしてコマンドの実行速度を測ることで、ioniceの効果を見ることができます。

 ただし、ioniceは優先度だけを変えるコマンドなので、他のプロセスがディスクをどの程度使用しているかによって、測定結果がかなり影響を受けます。さらにディスクキャッシュの効果も考慮する必要があります(キャッシュにヒットするとディスクにアクセスしないため)。

 以下の画面4〜6では、「sync」コマンドと「echo 3 > /proc/sys/vm/drop_caches」を実行して、ディスクキャッシュをクリアした上で評価しています。実行にはroot権限が必要です。

 テスト用に実行しているのは先ほどと同じくtarコマンドで、1回目のtar(dum1.tarを作成)をバックグラウンドで実行してディスクI/Oを発生させて、2回目のtar(dum2.tarを作成)にかかった時間を計測しています。あまり大きなファイルではありませんし、簡便なものなので、結果はあくまで参考にとどめてください。

 なお、ディスクI/Oの状況は、iostatコマンド(第128回)やpidstatコマンド(第129回)で表示できます。

画面4 画面4 tarコマンドを最優先で実行した結果 青枠で囲った部分が処理時間
画面5 画面5 tarコマンドをデフォルトで実行した結果 処理時間が30%程度延びた
画面6 画面6 tarコマンドをクラス3で実行した結果 画面4や画面5と比較してtarコマンドの呼び出しから終了までにかかった実時間(real)が約57秒と20〜30倍に増えている


【訂正:2019年11月25日午前11時55分】本記事の初出時、冒頭のコマンド実行例で「ionice -c 0 -n 0 rsync -av ~ /mnt/0818/」とありましたが、正しくは「ionice -c 1 -n 0 rsync -av ~ /mnt/0818/」でした。お詫びして訂正いたします。該当箇所は既に修正済みです(編集部)。

筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。