如何为systemd服务配置SCHED_DEADLINE调度策略?
给systemd服务配置SCHED_DEADLINE调度策略的正确方法
下面是三种可行的配置方案,覆盖不同场景和systemd版本:
方案1:用chrt直接启动服务(全版本兼容)
不用等进程启动后再修改PID,直接让chrt以SCHED_DEADLINE策略启动服务主程序,把服务配置里的ExecStart改成这样:
[Service] # 替换成你的服务实际路径和启动参数 ExecStart=/usr/bin/chrt -d --sched-runtime 1000000 --sched-deadline 5000000 --sched-period 5000000 /usr/bin/your-service # 修改调度策略需要权限,一般用root运行 User=root
这种方式最可靠,进程一启动就处于目标调度策略下,没有延迟,而且不管你用哪个版本的systemd都能生效。
方案2:启动后自动调整(不改动原启动命令)
如果不想修改原有的ExecStart,可以添加ExecStartPost,利用systemd自带的$MAINPID变量自动获取服务主进程ID,启动后再调整调度策略:
[Service] ExecStart=/usr/bin/your-service ExecStartPost=/usr/bin/chrt -d --sched-runtime 1000000 --sched-deadline 5000000 --sched-period 5000000 -p $MAINPID User=root
注意:得确保服务运行用户有CAP_SYS_NICE权限,root用户默认就有;非root用户的话,需要给服务程序加权限:sudo setcap cap_sys_nice+ep /usr/bin/your-service
方案3:用systemd原生配置(仅适用于新版systemd)
如果你的systemd版本在246及以上(输入systemd --version即可查看),可以直接用systemd的原生参数,无需依赖chrt:
[Service] ExecStart=/usr/bin/your-service CPUSchedulingPolicy=deadline # 这里用ms单位对应你原来的参数:1ms runtime、5ms deadline/period CPUSchedulingRuntimeSec=1ms CPUSchedulingDeadlineSec=5ms CPUSchedulingPeriodSec=5ms User=root
这种方式更贴合systemd的配置风格,不用额外调用外部命令。
验证生效的方法
改完配置后,先重载systemd再重启服务:
sudo systemctl daemon-reload && sudo systemctl restart your-service.service
然后用chrt -p <你的服务PID>检查,输出里应该能看到deadline调度类以及对应的runtime、deadline、period参数。
内容的提问来源于stack exchange,提问作者Trofen
相关产品推荐
相关产品推荐

