- query and set CPU scheduling parameters
[ -0|-N] [-1|-F] [-2|-R] [-3|-B] [-4|-I] [-5|-D]
[ -M policy]
[ -a affinity]
[ -p prio]
[ -n nice_level]
[ -e command [arg ...]]
[LIST OF PIDs]
can set all CPU scheduling parameters Linux is capable of or
display information for given processes.
Long-running, non-interactive tasks may benefit from SCHED_BATCH as timeslices
are longer, less system-time is wasted by computing the next runnable process
and the caches stay stable.
Audio/video or other near-realtime applications may run with less skipping if
set to SCHED_RR. Use the static priority-switch -p
- schedtool now supports setting the CPU-affinity
introduced in linux 2.5.8.
- -N or -0
- set all PIDs to SCHED_NORMAL/OTHER
- -F or -1
- to SCHED_FIFO root-credentials required
- -R or -2
- to SCHED_RR root-credentials required
- -B or -3
- to SCHED_BATCH
- -I or -4
- to SCHED_ISO
- -D or -5
- to SCHED_IDLEPRIO
- -M policy
- for manual/raw mode; policy is the number of the scheduling
policy (see above for 0-4). This option is mostly for kernel guys that
want to test their new implementations.
- -p prio
- specify static priority required for SCHED_FIFO and
SCHED_RR. Usually ranged from 1-99.
- -a affinity
- set the PID's affinity to this bitmask
(hexadecimal); alternatively, a list mode is supported.
- -n nice_level
- set the PID's nice level; see nice(2), nice(1).
- -e command [arg ...]
- execute command with given scheduling parameters
(overwrites schedtool's process image). See EXAMPLES.
- display min and max priority for each policy.
- be verbose.
To query the $SHELL's policies:
#> schedtool $$
To query some PIDs, namely 1 2 and 3:
#> schedtool 1 2 3
mplayer in SCHED_RR
with priority 20. The priority arg
is needed for both SCHED_RR and SCHED_FIFO.
#> schedtool -R -p 20 -e mplayer -quiet some_file.avi
To set current shell to SCHED_BATCH
, which all programs the shell starts
#> schedtool -3 $$
To set all processes with the name 'cpu_hog' to SCHED_BATCH:
#> schedtool -3 `pidof cpu_hog`
To set a process' affinity
to only the first CPU (CPU0):
#> schedtool -a 0x1 <PID>
Using the list mode and affinty of CPU0 and CPU3:
#> schedtool -a 0,3 <PID>
A combination of an affinity
and a policy
-argument is - of course
- always possible.
#> schedtool -B -a 0x1 <PID>
-argument determines on which CPUs a process is allowed to
run. It consists of a simple bitmask represented in hexadecimal. CPU0 is
denoted by the least-significant bit, CPU1 by the second least-significant and
so on, thus giving:
-> only run on CPU0
-> only run on CPU1
-> only run on CPU2
-> only run on CPU3 ... and so on.
Multi-target CPUs may be specified using bitwise OR of the values:
-> run on CPUs 0, 1, 2 but NOT
-> run only on CPUs 0 and 1
The default is to run a process on all CPUs, giving a mask of
for all 4 CPUs
for all 8 CPUs
Alternatively a list mode is supported where you can specify the CPUs delimited
by ",". The following runs <PID> on CPU0 and CPU1 (equivalent
#> schedtool -a 0,1 <PID>
SCHED_NORMAL / SCHED_OTHER
This is the default policy and for the average
program with some interaction. Does preemption of other processes.
First-In, First Out Scheduler, used only for real-time
constraints. Processes in this class are usually not preempted by others, they
need to free themselves from the CPU via sched_yield() and as such you need
special designed applications. Use with extreme care.
Round-Robin Scheduler, also used for real-time constraints.
CPU-time is assigned in an round-robin fashion with a much smaller timeslice
than with SCHED_NORMAL and processes in this group are favoured over
SCHED_NORMAL. Usable for audio/video applications near peak rate of the
system. ROOT-credentials required.
[ since 2.6.16 in mainline ] SCHED_BATCH was designed for
non-interactive, CPU-bound applications. It uses longer timeslices (to better
exploit the cache), but can be interrupted anytime by other processes in other
classes to guaratee interaction of the system. Processes in this class are
selected last but may result in a considerable speed-up (up to 300%). No
interactive boosting is done.
[ patch needed ] SCHED_ISO was designed to give users a
SCHED_RR-similar class. To quote Con Kolivas: "This is a non-expiring
scheduler policy designed to guarantee a timeslice within a reasonable latency
while preventing starvation. Good for gaming, video at the limits of hardware,
video capture etc."
[ patch needed ] SCHED_IDLEPRIO is similar to SCHED_BATCH,
but was explicitly designed to consume only the time the CPU is idle. No
interactive boosting is done. If you used SCHED_BATCH in the -ck kernels this
is what you want since 2.6.16
PID 0 means "current process", in our case, schedtool. May occur when
using the -e switch.
Be careful with SCHED_FIFO! You may lock out other processes from the CPU,
including your shell.
For SCHED_BATCH you certainly
need the a recent 2.6 kernel.
A short overview is given in SCHED_DESIGN and the README
thourough discussion. The INSTALL
file also lists all prerequisites and
where you can get patches.
Affinity 0x0 should never be used.
You need some knowledge about the kernel and scheduling. The author is a grumpy
Please contact me via freshmeat.net's "contact author"-feature