CFS (der Standard-Scheduler für Prozesse) hat keine feste Zeitscheibe, sie wird zur Laufzeit in Abhängigkeit von der angestrebten Latenz berechnet (sysctl_sched_latency
) und Anzahl der laufenden Prozesse. Timeslice konnte nie kleiner als die minimale Granularität sein (sysctl_sched_min_granularity
).
Timeslice liegt immer zwischen sysctl_sched_min_granularity
und sysctl_sched_latency
, die standardmäßig 0,75 ms bzw. 6 ms sind und in kernel/sched/fair.c definiert sind.
Aber die tatsächliche Zeitscheibe wird nicht in den Benutzerbereich exportiert.
Das für einen bestimmten Prozess zugewiesene Quantum kann variieren:
Sie können "Slice" optimieren, indem Sie sched_latency_ns anpassen und sched_min_granularity_ns , aber beachten Sie, dass "Slice" kein festes Quantum ist. Beachten Sie auch, dass CFS-Präemptionsentscheidungen auf dem momentanen Status basieren. Eine Aufgabe hat möglicherweise ein volles (variables) „Slice“ CPU-Zeit erhalten, aber die Vorrangigkeit wird nur ausgelöst, wenn eine mehr verdiente Aufgabe verfügbar ist, sodass ein „Slice“ nicht die „maximale ununterbrochene CPU-Zeit“ ist, die Sie vielleicht erwarten .. aber es ist etwas ähnlich.
Dies liegt daran, dass der Completely Fair Scheduler, der standardmäßige Linux-Scheduler, einem Prozess statt einer festen Zeitscheibe einen Teil des Prozessors zuweist. Das bedeutet, dass die Zeitscheibe für jeden Prozess proportional zur aktuellen Last ist und mit dem Prioritätswert des Prozesses gewichtet wird.
Für spezielle Echtzeitprozesse, die SCHED_RR verwenden, ist die Standardzeitscheibe im Linux-Kernel als RR_TIMESLICE
definiert in 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)
Sie können sched_rr_get_interval()
verwenden um das SCHED_RR-Intervall für einen bestimmten SCHED_RR-Prozess zu erhalten.