首页/系统/Linux 内核与性能调优速查/实时优先级权限(rtprio 限制)
CPU 与调度60 条

实时优先级权限(rtprio 限制)

普通用户设置实时策略需要 rtprio 资源限制(ulimit -r);权限不足时 sched_setscheduler 返回 EPERM,systemd 服务用 LimitRTPRIO 放行。

什么是实时优先级限制

把进程设为实时调度策略(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 与容器内可能不同,最终以进程状态里记录的调度策略与优先级为准。

易错点

  • limits.conf 只对新登录会话生效,运行中的服务要重启,否则验证时看不到任何变化
  • 给服务加 CAP_SYS_NICE 比放开全局 rtprio 更收敛,优先考虑;但加能力等于授予较大权限,需评估程序可信度
  • 遇到 EPERM 就直接把服务改成 root 运行,扩大了权限面而没弄清真正的限制来源
  • 忽略容器运行时对能力与限额的下发限制,宿主侧配置正常但容器内仍然失败

数据来源与参考

  • util-linux 文档 chrt(1)
  • systemd.exec 手册(LimitRTPRIO)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌