什么是实时优先级限制
把进程设为实时调度策略(SCHED_FIFO/SCHED_RR)需要相应权限,来源有两个:一是 RLIMIT_RTPRIO(ulimit -r),二是 CAP_SYS_NICE 能力。普通用户若限额为 0,调用 sched_setscheduler 会返回 EPERM,程序日志里表现为“设置实时优先级失败”。服务化部署时应通过 systemd 的 LimitRTPRIO 或 AmbientCapabilities 精确放行,而不是把整台机器的限制放得很宽。
基本信息
| 查看限额 | ulimit -r(RLIMIT_RTPRIO) |
|---|---|
| 持久配置 | /etc/security/limits.conf 的 rtprio 项 |
| systemd 单元 | LimitRTPRIO= / AmbientCapabilities=CAP_SYS_NICE |
| 错误表现 | sched_setscheduler 返回 EPERM,日志提示权限不足 |
| 相关命令 | chrt -f -p <优先级> <pid> |
| 生效范围 | 限额按会话/服务进程,能力按进程 |
典型使用场景
- 实时应用报设置优先级失败:确认是限额为 0 还是能力缺失
- 音频与工业控制类服务:确保持续获得实时调度所需的权限
- 排障定位:区分 EPERM 来自 rtprio 限额还是整体能力受限
- 安全收敛:用最小必要权限放行单个服务,而不是放开全机限制
- 容器与编排环境:确认运行时是否阻止了能力与限额下发
查询与验证
查询与验证
ulimit -r # 当前会话的实时优先级上限
systemctl show myservice -p LimitRTPRIO # 服务单元的限额
systemctl show myservice -p AmbientCapabilities
chrt -f -p 10 $$ 2>&1 | head -2 # 自查是否具备设置权限
cat /proc/<pid>/status | grep -i policies # 查看进程实际调度策略
chrt -p <pid> # 查看某进程的调度策略与优先级放行方式对比
| 方式 | 作用范围 | 评价 |
|---|---|---|
| limits.conf rtprio | 登录会话 | 只对新会话生效,服务需重启 |
| LimitRTPRIO= | 单个 systemd 服务 | 推荐,范围可控 |
| AmbientCapabilities=CAP_SYS_NICE | 单个服务进程 | 比放开全局限额更收敛 |
| 直接给 root | 全局 | 范围过大,不符合最小权限 |
limits.conf 的改动只对新登录会话生效,正在运行的服务必须重启才能拿到新限额,验证时以 /proc/<pid>/status 中进程的实际策略为准。
实时调度策略优先级高于所有普通任务:放行前确认程序行为可控,否则一个死循环的实时进程可以把整台机器拖到无响应。
容器与编排环境要在实际运行的进程上验证:宿主侧 ulimit 与容器内可能不同,最终以进程状态里记录的调度策略与优先级为准。