.\" Copyright (c) International Business Machines orp., 2006
.\"
.\" %%%LICENSE_START(GPLv2+_SW_3_PARA)
.\" This program is free software; you can redistribute it and/or
.\" modify it under the terms of the GNU General Public License as
.\" published by the Free Software Foundation; either version 2 of
.\" the License, or (at your option) any later version.
.\"
.\" This program is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
.\" the GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public
.\" License along with this manual; if not, see
.\" .
.\" %%%LICENSE_END
.\"
.\" HISTORY:
.\" 2006-04-27, created by Eduardo M. Fleury
.\" with various additions by Michael Kerrisk
.\"
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\"
.\" Japanese Version Copyright (c) 2007 Akihiro MOTOKI
.\" all rights reserved.
.\" Translated 2007-01-09, Akihiro MOTOKI , LDP v2.43
.\" Updated 2008-08-06, Akihiro MOTOKI, LDP v3.05
.\" Updated 2013-05-06, Akihiro MOTOKI
.\"
.TH IOPRIO_SET 2 2019\-03\-06 Linux "Linux Programmer's Manual"
.SH 名前
ioprio_get, ioprio_set \- I/O スケジューリングクラスと優先度の設定/取得
.SH 書式
.nf
\fBint ioprio_get(int \fP\fIwhich\fP\fB, int \fP\fIwho\fP\fB);\fP
\fBint ioprio_set(int \fP\fIwhich\fP\fB, int \fP\fIwho\fP\fB, int \fP\fIioprio\fP\fB);\fP
.fi
.PP
\fI注意\fP: これらのシステムコールには glibc ラッパー関数は存在しない。 「注意」の節を参照。
.SH 説明
システムコール \fBioprio_get\fP() / \fBioprio_set\fP() は、(1つ以上の) スレッドの I/O スケジューリングクラスと
優先度の取得/設定を行う。
.PP
\fIwhich\fP と \fIwho\fP 引数でシステムコールの操作対象となるスレッドを指示する。 \fIwhich\fP 引数は、 \fIwho\fP
をどのように解釈するかを決めるもので、以下のいずれか一つを指定する。
.TP
\fBIOPRIO_WHO_PROCESS\fP
\fIwho\fP は特定のプロセスやスレッドを特定するためのプロセス ID かスレッド ID である。 \fIwho\fP が 0
の場合、呼び出し元のスレッドに対して操作が行われる。
.TP
\fBIOPRIO_WHO_PGRP\fP
\fIwho\fP はプロセスグループ ID であり、プロセスグループの全メンバが対象となる。 \fIwho\fP が 0 の場合、
呼び出し元がメンバーとなっているプロセスグループに対して操作が行われる。
.TP
\fBIOPRIO_WHO_USER\fP
.\" FIXME . Need to document the behavior when 'who" is specified as 0
.\" See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=652443
\fIwho\fP はユーザーID であり、実 UID に一致する全プロセスが対象となる。
.PP
\fBioprio_get\fP() の呼び出し時に \fIwhich\fP に \fBIOPRIO_WHO_PGRP\fP か \fBIOPRIO_WHO_USER\fP
が指定され、 \fIwho\fP に一致するプロセスが複数あった場合、 一致するプロセス全体の中で最も高い優先度が返される。
優先度が高いとは、より高い優先度クラスに属している (\fBIOPRIO_CLASS_RT\fP が最も高い優先度クラスで、
\fBIOPRIO_CLASS_IDLE\fP が最も低い)、もしくは 同じ優先度クラスに属しているが優先度レベルが高い
(優先度番号が小さい方が優先度レベルが高いことを意味する)、 ということである。
.PP
\fBioprio_set\fP() に渡す \fIioprio\fP 引数は、対象となるプロセスに割り当てるスケジューリングクラスと
優先度の両方を指定するビットマスクである。 \fIioprio\fP の値を組み立てたり解釈するのに、以下のマクロが利用できる。
.TP
\fBIOPRIO_PRIO_VALUE(\fP\fIclass\fP\fB, \fP\fIdata\fP\fB)\fP
スケジューリングクラス \fIclass\fP と優先度 (\fIdata\fP) を与えると、このマクロは 2つの値を組み合わせて、 \fIioprio\fP
値を生成し、マクロの結果として返す。
.TP
\fBIOPRIO_PRIO_CLASS(\fP\fImask\fP\fB)\fP
\fImask\fP (\fIioprio\fP 値) を与えると、このマクロは I/O クラス要素、つまり \fBIOPRIO_CLASS_RT\fP,
\fBIOPRIO_CLASS_BE\fP, \fBIOPRIO_CLASS_IDLE\fP のいずれか一つの値を返す。
.TP
\fBIOPRIO_PRIO_DATA(\fP\fImask\fP\fB)\fP
\fImask\fP (\fIioprio\fP 値) を与えると、このマクロは優先度 (\fIdata\fP) 要素を返す。
.PP
See the NOTES section for more information on scheduling classes and
priorities, as well as the meaning of specifying \fIioprio\fP as 0.
.PP
I/O 優先度は読み出しと同期書き込み (\fBO_DIRECT\fP, \fBO_SYNC\fP) に対応している。 I/O
優先度は非同期書き込みには対応していない。なぜなら、 非同期書き込みはメモリー書き換えを行うプログラムの動作 (context) とは
関係なく発行され、そのためプログラム単位の優先度は適用されないから である。
.SH 返り値
成功すると、 \fBioprio_get\fP() は、 \fIwhich\fP と \fIwho\fP で指定された基準に合致した全プロセスで最も高い I/O
優先度を持つプロセスの \fIioprio\fP 値を返す。 エラーの場合、\-1 を返し、 \fIerrno\fP にエラーを示す値を設定する。
.PP
成功すると、 \fBioprio_set\fP() は 0 を返す。 エラーの場合、\-1 を返し、 \fIerrno\fP にエラーを示す値を設定する。
.SH エラー
.TP
\fBEINVAL\fP
\fIwhich\fP か \fIioprio\fP の値が不正である。 \fIioprio\fP 用に指定可能なスケジューラクラスと優先度レベルについては
「備考」を参照のこと。
.TP
\fBEPERM\fP
呼び出し元プロセスが、指定されたプロセスに \fIioprio\fP を割り当てるのに必要な権限を持っていない。 \fBioprio_set\fP()
に必要な権限についての詳しい情報は「備考」の節を参照のこと。
.TP
\fBESRCH\fP
\fIwhich\fP と \fIwho\fP で指定された基準に合致するプロセスが見つからなかった。
.SH バージョン
これらのシステムコールはカーネル 2.6.13 以降の Linux で利用可能である。
.SH 準拠
これらのシステムコールは Linux 独自である。
.SH 注意
glibc はこれらのシステムコールに対するラッパー関数を提供していない。 \fBsyscall\fP(2) を使って呼び出すこと。
.PP
複数のプロセスやスレッドが一つの I/O コンテキストを共有する場合がある。 \fBclone\fP(2) を \fBCLONE_IO\fP
フラグ付きで呼び出した場合にはこの状況となる。 しかしながら、デフォルトでは、一つのプロセスの個々のスレッドは I/O コンテキストを共有「しない」。
したがって、 プロセス内のすべてのスレッドの I/O 優先度を変更したい場合には、 それぞれのスレッドに対して \fBioprio_set\fP()
を呼び出す必要がある。 この操作を行うのに必要となるスレッド ID には \fBgettid\fP(2) か \fBclone\fP(2) が返す値を指定する。
.PP
これらのシステムコールは、I/O 優先度に対応した I/O スケジューラと 組み合わせて使用された場合にのみ効果を持つ。 カーネル 2.6.17
では、この条件を満たすスケジューラは Completely Fair Queuing (CFQ) I/O スケジューラだけである。
.PP
.\" commit 8ec680e4c3ec818efd1652f15199ed1c216ab550
If no I/O scheduler has been set for a thread, then by default the I/O
priority will follow the CPU nice value (\fBsetpriority\fP(2)). In Linux
kernels before version 2.6.24, once an I/O priority had been set using
\fBioprio_set\fP(), there was no way to reset the I/O scheduling behavior to
the default. Since Linux 2.6.24, specifying \fIioprio\fP as 0 can be used to
reset to the default I/O scheduling behavior.
.SS "I/O スケジューラの選択"
I/O スケジューラの選択はデバイス単位に行われ、その選択は スペシャルファイル
\fI/sys/block//queue/scheduler\fP 経由で行われる。
.PP
現在の I/O スケジューラは \fI/sys\fP ファイルシステム経由で参照できる。例えば、以下のコマンドを実行すると、
現在カーネルでロードされているスケジューラの全リストが表示される。
.PP
.in +4n
.EX
$\fB cat /sys/block/sda/queue/scheduler\fP
noop anticipatory deadline [cfq]
.EE
.in
.PP
括弧で囲まれたスケジューラがそのデバイス (上の例では \fIsda\fP) について実際に使用されているスケジューラである。
別のスケジューラを設定するには、このファイルに新しいスケジューラ名を 書き込めばよい。例えば、以下のコマンドを実行すると、デバイス \fIsda\fP
のスケジューラとして \fIcfq\fP が設定される。
.PP
.in +4n
.EX
$\fB su\fP
Password:
#\fB echo cfq > /sys/block/sda/queue/scheduler\fP
.EE
.in
.\"
.SS "Completely Fair Queuing (CFQ) I/O スケジューラ"
バージョン 3 (別名 CFQ Time Sliced) 以降、 CPU スケジューリングと同様の I/O nice レベルが CFQ
に実装されている。 これらの nice レベルは 3つのスケジューリングクラスに分類でき、 各スケジューリングクラスにつき
1つ以上の優先度レベルが定義されている。
.TP
\fBIOPRIO_CLASS_RT\fP (1)
これはリアルタイム I/O クラスである。 このスケジューリングクラスには他のクラスよりも高い優先度が与えられる。
このクラスのプロセスには、常にディスクへのアクセスが優先して 割り当てられる。そのため、この I/O クラスを使う際には、 たった一つの リアルタイム
I/O クラスのプロセスにより システム全体のディスクアクセスができなくなってしまうことがある という点に、注意を払う必要がある。 このクラスには、8
段階の class data (優先度レベル) がある。 この値は、そのプロセスが 1回のディスクアクセスにどれだけの
時間が必要かを正確に決めるためのものである。 最高のリアルタイム優先度レベルは 0 で、最低は 7 である。
将来的には、優先度レベルは、希望するデータレートを渡すなど、 より直接的に性能条件を反映できるように変更されるかもしれない。
.TP
\fBIOPRIO_CLASS_BE\fP (2)
これは ベストエフォートスケジューリングクラスである。 このクラスは、特定の I/O 優先度を設定していないプロセスの デフォルト値である。 class
data (優先度レベル) により、そのプロセスがどの程度の I/O 帯域を得られるかが決定される。 ベストエフォート優先度レベルは、CPU の
nice 値 (\fBgetpriority\fP(2) 参照) と同様のものである。 優先度レベルは、ベストエフォートスケジューリングクラスの中で
他のプロセスとの相対的な優先度を決定する。 優先度レベルの値の範囲は 0 (最高) から 7 (最低) である。
.TP
\fBIOPRIO_CLASS_IDLE\fP (3)
これは idle スケジューリングクラスである。 このレベルで動作するプロセスは他にディスクアクセスをしようとする プロセスがない場合にのみ I/O
時間を取得する。 idle クラスには class data (優先度) は用意されていない。 プロセスにこの優先度を割り当てる際には注意が必要である。
なぜなら、優先度の高いプロセスが常にディスクにアクセスしている場合には ディスクにアクセスできなくなる可能性があるからだ。
.PP
CFQ I/O スケジューラの更なる情報とサンプルプログラムについては、カーネルのソースファイル
\fIDocumentation/block/ioprio.txt\fP を参照のこと。
.SS "I/O 優先度の設定に必要な許可"
プロセスの優先度を変更する許可が得られるかどうかは 以下の 2 つの基準に基いて決定される。
.TP
\fBプロセスの所有権\fP
非特権プロセスは、プロセスの実 UID が呼び出し元プロセスの実 UID もしくは 実効 UID と一致するプロセスの I/O 優先度のみを設定できる。
\fBCAP_SYS_NICE\fP ケーパビリティを持つプロセスは、どのプロセスの優先度でも変更できる。
.TP
\fBどの優先度に設定しようとしているか\fP
非常に高い優先度 (\fBIOPRIO_CLASS_RT\fP) を設定しようとする場合、 \fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
カーネル 2.6.24 以前では、非常に低い優先度 (\fBIOPRIO_CLASS_IDLE\fP) を設定するためにも \fBCAP_SYS_ADMIN\fP
ケーパビリティが必要であったが、 Linux 2.6.25 以降ではもはや必要なくなった。
.PP
\fBioprio_set\fP() はこの両方のルールに従い、条件を満たさない場合、エラー \fBEPERM\fP で失敗する。
.SH バグ
.\" 6 May 07: Bug report raised:
.\" http://sources.redhat.com/bugzilla/show_bug.cgi?id=4464
.\" Ulrich Drepper replied that he wasn't going to add these
.\" to glibc.
glibc は、このページに記載された関数プロトタイプやマクロを定義する 適切なヘッダーファイルをまだ提供していない。 必要な定義については
\fIlinux/ioprio.h\fP を見ればよい。
.SH 関連項目
\fBionice\fP(1), \fBgetpriority\fP(2), \fBopen\fP(2), \fBcapabilities\fP(7),
\fBcgroups\fP(7)
.PP
Linux カーネルソース内の \fIDocumentation/block/ioprio.txt\fP
.SH この文書について
この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は
\%https://www.kernel.org/doc/man\-pages/ に書かれている。