跳转至内容

实时进程管理

来自 ArchWiki

本文档提供了有关实时优先处理进程线程的信息,而不是仅在启动时进行。它展示了如何控制单个进程或特定组运行的所有进程的 CPU、内存和其他资源利用率。

虽然许多最近的处理器功能强大,可以同时播放十几个视频或音频流,但仍有可能另一个线程会劫持处理器半秒钟来完成另一项任务。这会导致音频或视频流出现短暂中断。视频/音频流也可能不同步。对于一般的音乐听众来说,这很烦人;但对于内容制作者、作曲家或视频编辑来说,这个问题要严重得多,因为它会中断他们的工作流程。

解决方案是以实时方式运行对时间敏感的进程。在 Linux 中,这意味着将进程更改为实时调度程序,例如 SCHED_RRSCHED_FIFO。有关这些调度程序的描述,请参阅 sched(7)

配置

在 Arch Linux 上,可以使用 PAMsystemd 实现系统、组和用户范围的配置。

realtime 包组提供了修改 IRQ 和进程实时调度策略的附加工具。

注意 运行自定义内核时,请确保其已启用 PREEMPT 以便使用上述方法。

配置 PAM

/etc/security/limits.conf 文件为 pam_limits PAM 模块提供了配置,该模块设置系统资源的限制(请参阅 limits.conf(5))。

提示 建议将 pam_limits 的配置外部化到 /etc/security/limits.d 下的单独文件中,因为这些文件会优先于主配置文件。

pam_limits 提供了两种类型的资源限制:硬限制软限制。硬限制由 root 设置并由内核强制执行,而软限制可以由用户在硬限制允许的范围内进行配置。

安装 realtime-privileges 包并将用户添加到 realtime 组,将提供合理的默认值(例如,与 专业音频相关)。

配置 systemd 服务

由 systemd 系统服务生成的进程需要特别设置 limits.conf 的等效项。有关更多信息,请参阅 systemd.exec(5) § CREDENTIALSsystemd.exec(5) § PROCESS PROPERTIESsystemd.exec(5) 中。

用法

要在实时模式下运行,在 realtime 组中运行的进程必须将 LIMIT_RTPRIO 设置为大于 0 的任何值,然后更改为实时调度程序,例如 SCHED_FIFOSCHED_RR。以下是一个示例

#include <assert.h>
#include <sys/resource.h>
#include <sched.h>

void realtime()
{
    struct rlimit rl;
    assert(getrlimit(RLIMIT_RTPRIO, &rl) == 0);
    assert(rl.rlim_max != 0);
    rl.rlim_cur = rl.rlim_max;
    assert(setrlimit(RLIMIT_RTPRIO, &rl) == 0);

    assert(sched_setscheduler(0, SCHED_FIFO, &(struct sched_param){
            .sched_priority = rl.rlim_cur
        }) != -1);
}

同样,LIMIT_RTPRIO 必须大于 0 才能使进程能够更改其调度程序。这就是为什么 realtime-privilegesrealtime 组中所有进程的 rtprio 限制提高到 98。有关更多信息,请参阅 sched(7)

使用 chrt

要自动执行此操作,或者如果您运行的是别人的软件,则可以使用 chrt。以下是在 SCHED_FIFO 调度程序下以实时方式启动 ls -al 的示例

$ chrt --fifo 98 ls -al

通常不需要这样做。需要实时运行的应用程序,例如 jack2,通常会自己设置调度程序。

硬实时和软实时

实时是进程能够及时运行而不被任何其他进程中断的能力的同义词。然而,尽管如此,周期仍可能偶尔丢失。低功耗或优先级更高的进程可能是潜在原因。为了解决这个问题,实时质量存在一个缩放。本文讨论的是实时。硬实时通常不是那么“想要”,而是“必需”的。例如,汽车的 ABS(防抱死制动系统)。这无法“渲染”,也没有第二次机会。

技巧与提示

PAM 登录

警告 在对 /etc/pam.d 进行任何更改之前,请阅读 PAM 以避免破坏系统的身份验证或造成安全问题。默认安装应在不更改此配置的情况下正常工作。

PAM 已在默认的 Arch Linux 安装中安装和配置。几乎所有的 显示管理器也都启用了 PAM。您可以使用以下命令检查哪些模块使用了 pam_limits.so

$ grep pam_limits.so /etc/pam.d/*

在默认安装中,只有两个文件直接使用该模块

/etc/pam.d/system-auth:session    required                    pam_limits.so
/etc/pam.d/system-services:session   required    pam_limits.so

/etc/pam.d/system-auth 被其他支持 PAM 的应用程序包含。您可以进一步搜索 /etc/pam.d

$ grep system-auth /etc/pam.d/*

在默认配置中,这显示了哪些应用程序在使用 system-auth,因此也使用了 pam_limits.so。例如

...
/etc/pam.d/su:password        include         system-auth
/etc/pam.d/su-l:password        include         system-auth
/etc/pam.d/system-login:auth       include    system-auth
/etc/pam.d/system-login:account    include    system-auth
/etc/pam.d/system-login:password   include    system-auth
/etc/pam.d/system-login:session    include    system-auth
/etc/pam.d/system-services:account   include     system-auth

这涵盖了图形和控制台登录。

检查限制

Bash 中,使用 ulimit(请参阅 bash(1) § ulimit)来检查限制,例如 rtprio 限制可以按以下方式检查

$ ulimit -r
98

这是由 realtime-privileges 配置的值。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.