WSL Ubuntu16.04下含pthread_setschedparam的CPP代码Docker运行失败如何调试
调试步骤
第一步:明确具体错误原因
pthread_setschedparam的返回值本身就是错误码,你可以修改代码打印错误描述,快速定位问题:
#include <cstring> // 新增头文件引用 void SetRealtimeThreadPriority() { sched_param const param{ThreadPriorities::Priority()}; int result = pthread_setschedparam(pthread_self(), ThreadPriorities::Policy(), ¶m); // 替换原有printf,打印错误描述 printf("SetRealtimeThreadPriority - result: %d, error info: %s \n", result, strerror(result)); assert(result == 0); (void) result; }
重新编译运行后根据输出排查:
- 如果返回
EINVAL:说明你设置的调度策略/优先级值非法 - 如果返回
EPERM:说明权限/资源配额不足,继续往下排查
第二步:排查WSL宿主环境限制
首先直接在WSL的Ubuntu宿主中运行你的可执行文件,确认是否能正常执行:
- WSL1完全不支持实时调度策略(SCHED_FIFO、SCHED_RR),如果用的是WSL1只能切换到WSL2或者改用非实时调度策略
- WSL2默认未开启硬实时支持,运行
zcat /proc/config.gz | grep CONFIG_PREEMPT_RT,如果输出不是y,说明内核不支持PREEMPT_RT实时调度:要么自行编译WSL内核开启对应配置,要么调整代码优先级参数适配非实时调度
如果WSL宿主中运行正常,再排查Docker层问题。
第三步:排查Docker配置问题
你之前的启动命令缺少实时调度配额参数,默认Docker的cgroup配置中cpu.rt_runtime_us为0,即使加了SYS_NICE权限也无法分配实时调度资源:
- 先修改Docker daemon配置,编辑
/etc/docker/daemon.json添加以下配置:
{ "cpu-rt-period": 1000000, "cpu-rt-runtime": 950000 }
保存后重启Docker服务:systemctl restart docker
2. 启动容器时加上实时运行时间参数:
docker run -it --rm --cap-add SYS_NICE --cpu-rt-runtime=950000 MyContainer
额外排查点
- 如果你在容器中用非root用户运行程序,需要在容器的
/etc/security/limits.conf中添加配置,允许对应用户设置实时优先级:* hard rtprio 99 - 如果你用的是cgroup v2,旧版本Docker对实时调度参数支持有兼容性问题,可以尝试切换到cgroup v1测试:编辑WSL内核启动参数添加
systemd.unified_cgroup_hierarchy=0,重启WSL后再测试
内容的提问来源于stack exchange,提问作者Brgv
相关产品推荐
相关产品推荐

