【Linux】ioniceコマンドでI/O優先度を管理し、大容量コピー時の動作低下を防ぐ方法
数十GB〜数百GBものデータをコピーまたは移動したことはありませんか?その際、システムの動作が著しく重くなった経験がある方も多いはずです。Linuxでは「ionice」コマンドを使うことで、この問題を回避できます。
I/O優先度とは?
I/Oとは「input/output(入出力)」の略です。I/Oデバイスにはさまざまな種類がありますが、ここではストレージデバイス(記憶装置)に焦点を当てます。
こうしたデバイスに対してデータの読み書きを行う各プロセスには、「スケジューリングクラス」と「優先度番号(nice値)」が割り当てられます。これはext4などのファイルシステムにおけるLinuxの標準的な仕組みです。ZFSなど他のファイルシステムでは、ディスクへの読み書きスケジューリング方法が多少異なる場合があります。
また、この機能が正しく動作するにはCFQスケジューラが有効になっている必要があります。以下のコマンドで確認できます。
cat /sys/block/*/queue/scheduler
nice値が高いほど、そのプロセスの優先度は低くなります。これは「数値が大きいほど、他のプロセスに対して親切(nice)である」という考え方に基づいています。
I/O優先度はどのように機能するのか
ストレージデバイスが1秒間に処理できるI/O操作の数(IOPS)には限りがあります。そのため、2つのプロセスが同時に読み書きしようとすると、それぞれがIOPSの一部を受け取ることになります。両者の優先度が同じであれば、おおよそ50%ずつ分配されます。

ただし、IOPSという概念は抽象的で分かりにくいかもしれません。簡単のため、結果として現れる「読み書き速度」で考えてみましょう。ディスクの最大書き込み速度が100MB/sだと仮定します。まずプロセスAが書き込みを開始し、100MB/sでディスクに書き込みます。そこへプロセスBが同じディスクへの書き込みを求めると、Bは約50MB/sで書き込み、Aの速度も同じく50MB/sまで低下します。
ここでプロセスBにより高いnice値を設定すると、Bは20MB/sで書き込み、Aには80MB/sが残されます。そしてAの処理が完了すれば、Bは再び100MB/sで書き込みできるようになります。
この例から重要なポイントが見えてきます。低優先度(高いnice値)のプロセスが常に遅いわけではないということです。ディスクを使用しているのがそのプロセスだけなら、最大速度で読み書きできます。しかし他のプロセスがディスクを必要とするときは、一時的に道を譲り、相手に多くのディスク帯域を譲ります。完了まで何時間もかかるようなコピー・書き込み操作は、その間PCを使いたいのであれば、低優先度に設定するのが賢明です。
ioniceコマンドの使い方
ioniceコマンドの基本的な構文は次のとおりです。
ionice -c scheduling_class -n priority_nice_value command
ioniceのスケジューリングクラス
アイドル(クラス3):このクラスのプロセスは、他のプログラムがディスクアクセスを必要としていないときにのみ読み書きを行います。競合がなければフルスピードで動作し、他のプログラムがディスクを使い始めると、残りのリソースだけで読み書きします。100MB/sで書き込んでいても、他のプログラムがアクセスしている間は一時的に5MB/s程度に落ち、終われば再び100MB/sに戻ります。システム全体の速度を落としたくない長時間ジョブに最適なクラスです。このクラスでは優先度の指定は不要です。
コマンド例:
ionice -c 3 cp /home/user/largefile /Backups
ベストエフォート(クラス2):0〜7の範囲で優先度(nice値)を指定します。数値が小さいほど優先度が高い点に注意してください。複数のプロセス間でディスク使用時間を細かく調整したい場合に使います。
例えば、バックアップを早く終わらせたい場合はnice値0を割り当てます。同時に映画6本を別のディスクに移動していて急ぎでなければ、こちらにはnice値7を設定します。
コマンド例:
ionice -c 2 -n 0 backup_command

リアルタイム(クラス1):プロセスが他のプログラムに邪魔されずに、できるだけ早く書き込むことが極めて重要な場合にのみ使用すべきクラスです。ほとんどのユーザーは必要とせず、特別な理由がない限り避けるべきです。こちらも0〜7のnice値をサポートしますが、root権限が必要なため、通常はsudoを付けて実行することになります。
注意点として、リアルタイムクラスで優先度0のプロセスは、他のプロセスからリソースを奪ってしまう可能性があります。実際には、別のプログラムがわずか数MBの読み書きのために数分、場合によっては数時間待たされることもあり得ます。本当に必要だと確信できる場合のみ、慎重に使いましょう。クラス2や3の重要なプロセスがディスクアクセスを必要としているとき、リアルタイムプロセスの書き込みが完了するまでシステムがフリーズする恐れもあります。
コマンド例:
sudo ionice -c 1 -n 7 bash
便利なioniceの活用例
最後の例では、コピー/移動コマンドの代わりにシェル(Bash)を起動しました。こうすると、そのシェルで実行する以降のコマンドはすべて、指定したI/Oスケジューリングクラスと優先度を引き継ぎます。GUIでも同じことが可能です。
ionice -c 3 pcmanfm
上のコマンドはLXDEデスクトップ環境のファイルマネージャー(PCManFM)を起動します。「pcmanfm」の部分は、お使いのデスクトップ環境のファイルマネージャー名に置き換えてください。これにより、そこから開始するすべてのディスク操作がアイドルクラスで実行されます。
また、コピー/移動操作がすでに実行中の場合もあるでしょう。そんなときは、ioniceを別の方法で使えます。
ionice -c 3 -p 4910
これは、プロセスID(PID)4910で実行中のプログラムの優先度クラスを変更するコマンドです。PIDはタスクマネージャーやpgrepなどのコマンドで調べられます。

まとめ
ioniceは、大きなファイルのコピーや移動中にデスクトップが重くなるのを防ぐのに役立ちます。しかし忘れてはならないのは、サーバーではさらに有用だということです。フルバックアップ中に、ホストしているWebサイトが訪問者にとって重くなってしまうのは避けたいところでしょう。日常的な運用からサーバー管理まで、ioniceを上手に活用してI/O負荷を賢く制御しましょう。
-
Linuxでプロセスを強制終了する方法!top・ps・killコマンドの使い方を徹底解説
Linuxには、プロセスを強制終了(キル)するためのさまざまな方法があります。このチュートリアルでは、動作がおかしくなったプロセスを見つけて終了させる方法を解説します。 プロセスは簡単に「孤児」になってしまうことがあります。意図的であろうとなかろうと、親プロセスがクラッシュすると、子プロセスだけが取り残されて実行され続けることがあります。また、親プロセスが完了した子プロセスを回収(reap)できず、ゾンビプロセスになってしまうケースもあります。 どちらの状態のプロセスも放置されたままでは動けず、手動での介入が必要です。そこで登場するのがジョブコントロールです。それでは、壊れたプロセスを終了させ
-
Linuxでディスク容量を確認・管理する方法|df・duコマンドの使い方を徹底解説
ディスク容量の管理は、使用するプラットフォームに関わらず、すべてのコンピューターユーザーにとって重要な課題です。特にシステム管理者の方は、オンライン・オフライン問わずシステムの健全性を常に監視する必要があります。Linuxではディスク容量が不足するとアップデートが妨げられ、深刻なエラーにつながる可能性もあるからです。 そこで、ディスク全体の空き容量や特定のファイルが使用している容量を把握するためには、「df」コマンドと「du」コマンドを使いこなせるようになることが不可欠です。 本記事では、dfコマンドとduコマンドを使ってLinux上のディスク容量を確認・管理する方法を詳しく解説します。 df