Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Scheduling policy switching #861

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 17 additions & 0 deletions cnf/make.conf.example
Expand Up @@ -291,6 +291,23 @@
# unset.
#PORTAGE_IONICE_COMMAND="ionice -c 3 -p \${PID}"
#
# PORTAGE_SCHEDULING_POLICY allows changing the current scheduling policy. The
# supported options are 'other', 'batch', 'idle', 'fifo' and 'round-robin'. When
# unset, the scheduling policy remains unchanged, by default Linux uses 'other'
# policy. Users that wish to minimize the Portage's impact on system
# responsiveness should set scheduling policy to 'idle' which significantly
# reduces the disruption to the rest of the system by scheduling Portage as
# extremely low priority processes.
#
#PORTAGE_SCHEDULING_POLICY="idle"
#
# PORTAGE_SCHEDULING_PRIORITY allows changing the priority (1-99) of the current
# scheduling policy, only applies if PORTAGE_SCHEDULING_POLICY is set to 'fifo'
# or 'round-robin', for others the only supported priority is 0, If unset,
# defaults to lowest priority of the selected scheduling policy.
#
#PORTAGE_SCHEDULING_PRIORITY="99"
#
# AUTOCLEAN enables portage to automatically clean out older or overlapping
# packages from the system after every successful merge. This is the
# same as running 'emerge -c' after every merge. Set with: "yes" or "no".
Expand Down
45 changes: 45 additions & 0 deletions lib/_emerge/actions.py
Expand Up @@ -3054,6 +3054,7 @@ def config_protect_check(trees):
def apply_priorities(settings):
ionice(settings)
nice(settings)
set_scheduling_policy(settings)


def nice(settings):
Expand Down Expand Up @@ -3094,6 +3095,50 @@ def ionice(settings):
)


def set_scheduling_policy(settings):
scheduling_policy = settings.get("PORTAGE_SCHEDULING_POLICY")
scheduling_priority = settings.get("PORTAGE_SCHEDULING_PRIORITY")

if platform.system() != "Linux" or not scheduling_policy:
return os.EX_OK

policies = {
"other": os.SCHED_OTHER,
"batch": os.SCHED_BATCH,
"idle": os.SCHED_IDLE,
"fifo": os.SCHED_FIFO,
"round-robin": os.SCHED_RR,
}

out = portage.output.EOutput()

if scheduling_policy in policies:
policy = policies[scheduling_policy]
else:
out.eerror("Invalid policy in PORTAGE_SCHEDULING_POLICY.")
out.eerror(
"See the make.conf(5) man page for PORTAGE_SCHEDULING_POLICY usage instructions."
)
return os.EX_USAGE

if not scheduling_priority:
scheduling_priority = os.sched_get_priority_min(policy)
else:
scheduling_priority = int(scheduling_priority)
if scheduling_priority not in range(
os.sched_get_priority_min(policy), os.sched_get_priority_max(policy) + 1
):
out.eerror("Invalid priority in PORTAGE_SCHEDULING_PRIORITY.")
out.eerror(
"See the make.conf(5) man page for PORTAGE_SCHEDULING_PRIORITY usage instructions."
)
return os.EX_USAGE

os.sched_setscheduler(portage.getpid(), policy, os.sched_param(scheduling_priority))

return os.EX_OK


def setconfig_fallback(root_config):
setconfig = root_config.setconfig
setconfig._create_default_config()
Expand Down
16 changes: 16 additions & 0 deletions man/make.conf.5
Expand Up @@ -1080,6 +1080,22 @@ will set idle io priority. For more information about ionice, see
Portage will also set the autogroup-nice value (see fBsched\fR(7))), if
FEATURES="pid\-sandbox" is enabled.
.TP
\fBPORTAGE_SCHEDULING_POLICY\fR = \fI[policy name]\fR
Allows changing the current scheduling policy. The supported options are
\fBother\fR, \fBbatch\fR, \fBidle\fR, \fBfifo\fR, and \fBround-robin\fR. When
unset, the scheduling policy remains unchanged, by default Linux uses 'other'
policy. Users that wish to minimize the Portage's impact on system
responsiveness should set scheduling policy to \fBidle\fR, which significantly
reduces the disruption to the rest of the system by scheduling Portage as
extremely low priority processes. see \fBsched\fR(7) for more information.
.TP
\fBPORTAGE_SCHEDULING_PRIORITY\fR = \fI[priority]\fR
Allows changing the priority (1-99) of the current scheduling policy, only
applies if PORTAGE _SCHEDULING_POLICY is set to 'fifo' or 'round-robin',
for others the only supported priority is 0, If unset, defaults to lowest
priority of the selected scheduling policy. For more information about
scheduler, see \fBsched\fR(7). This variable is unset by default.
.TP
.B PORTAGE_LOG_FILTER_FILE_CMD
This variable specifies a command that filters build log output to a
log file. In order to filter ANSI escape codes from build logs,
Expand Down