Linux カーネルのタイム スライス (またはクォンタム) の値を探しています。
具体的な質問:
/proc
そのような情報を公開するファイルはありますか?- (または) ディストリビューションの Linux ヘッダーで明確に定義されていますか?
- (または) この値を公開する Linux API (おそらく sysinfo) の C 関数はありますか?
Linux カーネルのタイム スライス (またはクォンタム) の値を探しています。
具体的な質問:
/proc
そのような情報を公開するファイルはありますか?特定のプロセスに割り当てられるクォンタムは異なる場合があります。
sched_latency_nsと sched_min_granularity_nsを調整することで「スライス」を調整できますが、「スライス」は固定量ではないことに注意してください。また、CFS プリエンプションの決定は、瞬間的な状態に基づいていることに注意してください。タスクは CPU 時間の完全な (可変の) 「スライス」を受け取った可能性がありますが、より適切なタスクが利用可能な場合にのみプリエンプションがトリガーされます。そのため、「スライス」は「中断されない最大 CPU 時間」ではありません。となりますが、少し似ています。
これは、デフォルトの LinuxスケジューラであるCompletely Fair Schedulerが、固定のタイムスライスではなく、ある割合のプロセッサをプロセスに割り当てるためです。つまり、各プロセスのタイムスライスは現在の負荷に比例し、プロセスの優先度値によって重み付けされます。
SCHED_RR を使用する特別な目的のリアルタイム プロセスの場合、デフォルトのタイムスライスは Linux カーネルRR_TIMESLICE
でinclude/linux/sched/rt.hとして定義されます。
/*
* default timeslice is 100 msecs (used only for SCHED_RR tasks).
* Timeslices get refilled after they expire.
*/
#define RR_TIMESLICE (100 * HZ / 1000)
sched_rr_get_interval()
特定の SCHED_RR プロセスの SCHED_RR 間隔を取得するために使用できます。
CFS (プロセスのデフォルトのスケジューラー) には固定のタイムスライスがなく、ターゲットのレイテンシー ( sysctl_sched_latency
) と実行中のプロセスの数に応じて実行時に計算されます。タイムスライスが最小粒度 ( ) 未満になることはありませんsysctl_sched_min_granularity
。
タイムスライスは常に と の間sysctl_sched_min_granularity
にありsysctl_sched_latency
、デフォルトはそれぞれ 0.75 ミリ秒と 6 ミリ秒で、kernel/sched/fair.cで定義されています。
ただし、実際のタイムスライスはユーザー空間にエクスポートされません。
SCHED_OTHER
プロセス (つまり、(デフォルトの) 非リアルタイム ラウンドロビン タイムシェアリング ポリシーの下で動作するプロセス) とプロセスの間で受け入れられた回答には、いくつかの混乱がありSCHED_RR
ます。
sched_latency_ns
およびファイル (これらsched_min_granularity_ns
はデバッグ目的であり、カーネルが で構成されている場合にのみ表示されますCONFIG_SCHED_DEBUG
) は、プロセスのスケジューリングに影響しSCHED_OTHER
ます。Alexey Shmalko の回答に記載されているように、CFS でのタイム スライスは固定されておらず (ユーザー空間にエクスポートされていません)、カーネル パラメーターやプロセスのナイス値などの要因に依存します。
sched_rr_get_interval()SCHED_RR
は、プリエンプトまたはブロックされない限り、プロセスが取得することが保証されているクォンタムである固定値を返します。従来の Linux では、SCHED_RR
クォンタムは 0.1 秒です。Linux 3.9 以降、制限はファイルを介して調整/proc/sys/kernel/sched_rr_timeslice_ms
できます。クォンタムはデフォルトが 100 であるミリ秒値として表されます。
Linuxでのタイム スライスに関するこの質問と同じ疑問をグーグルで検索しようとしましSCHED_RR
たが、こことカーネルのソース コードの両方から明確な回答が得られませんでした。
さらにチェックしたところ、キーポイントはRR_TIMESLICE
デフォルトのタイムスライスがミリ秒ではなく jiffies であることがわかりました! そのため、設定内容に関係なく、 のデフォルトのタイム スライスSCHED_RR
は常に 100 ミリ秒HZ
です。
/proc/sys/kernel/sched_rr_timeslice_ms
入力値がミリ秒単位であるの値と同じですが、保存および出力はjiffiesで行われます。
したがって、CONFIG_HZ=100
設定すると、次のことがわかります。
# echo 100 > /proc/sys/kernel/sched_rr_timeslice_ms
# cat /proc/sys/kernel/sched_rr_timeslice_ms
10
少し混乱していますが、これが理解に役立つことを願っています!