Yocto Linux中Preempt RT与Docker冲突致实时任务无法运行问题排查
问题排查思路:Docker启动后Preempt RT主机实时任务失效
核心现象
在打了Preempt RT补丁的Yocto Linux系统上,主机原本可正常运行FIFO、RR实时调度任务,但启动Docker服务后,这类任务提示不支持FIFO调度;停止并禁用Docker后恢复正常。已尝试更换Docker版本、验证内核Docker配置、确认CONFIG_RT_GROUP_SCHED开启、对比ARM64内核配置无差异,但问题仍存在。
排查步骤
1. 检查cgroup实时调度组的资源限制
Docker启动后会创建cgroup层级,可能限制了根cgroup的实时调度配额:
- 查看根cgroup的实时调度参数:
如果cat /sys/fs/cgroup/cpu,cpuacct/cpu.rt_runtime_us cat /sys/fs/cgroup/cpu,cpuacct/cpu.rt_period_uscpu.rt_runtime_us被设置为0,会导致主机无法分配实时调度时间。可尝试手动调整:
调整后重新测试实时任务是否正常。echo 950000 > /sys/fs/cgroup/cpu,cpuacct/cpu.rt_runtime_us
2. 验证Docker的cgroup驱动配置
Docker使用的cgroup驱动(cgroupfs或systemd)可能影响实时调度组的继承:
- 查看当前Docker的cgroup驱动:
docker info | grep Cgroup- 若使用
cgroupfs:检查Docker是否修改了根cgroup的实时参数;可尝试切换为systemd驱动,修改/etc/docker/daemon.json:
重启Docker后测试。{ "exec-opts": ["native.cgroupdriver=systemd"] } - 若使用
systemd:检查systemd切片配置,确认system.slice或docker.service的实时资源限制是否被压低。
- 若使用
3. 检查内核cgroup v2的兼容性
如果系统使用cgroup v2,Docker对实时调度的处理可能和v1不同:
- 查看当前cgroup版本:
若为cgroup v2,检查根cgroup的实时参数:mount | grep cgroup
确保cat /sys/fs/cgroup/cpu.max cat /sys/fs/cgroup/cpu.rt_max_uscpu.rt_max_us不为0,且有足够配额分配给主机任务。
4. 排查Docker启动时的内核参数修改
Docker启动可能加载模块或调整sysctl参数,影响实时调度:
- 对比Docker启动前后的sysctl参数差异:
重点关注# 启动前保存参数 sysctl -a > pre_docker_sysctl.txt # 启动Docker后保存 sysctl -a > post_docker_sysctl.txt # 对比差异 diff pre_docker_sysctl.txt post_docker_sysctl.txtkernel.sched_rt_runtime_us、kernel.sched_rt_period_us这类实时调度相关参数。
5. 检查实时任务的权限与优先级范围
Docker启动后可能修改了系统的实时优先级限制:
- 查看当前用户的实时优先级限制:
如果值为0,调整ulimit -r/etc/security/limits.conf:
重新登录后测试。* soft rtprio 99 * hard rtprio 99
6. 验证内核CONFIG_CGROUP_RT与CONFIG_RT_GROUP_SCHED的联动
虽然已确认CONFIG_RT_GROUP_SCHED开启,但需确保CONFIG_CGROUP_RT也已开启(部分内核版本中两者联动):
- 查看内核配置:
若未开启,需重新编译内核开启该选项。zcat /proc/config.gz | grep CONFIG_CGROUP_RT
内容的提问来源于stack exchange,提问作者Lee qun zhao
相关产品推荐
相关产品推荐

