我有一个调用sched_setscheduler(pid, SCHED_RR, ... )
的C ++应用程序。
应用程序在具有root权限的Linux上运行。通话通常有效。仅在一个特定的虚拟专用服务器中,它以EPERM
失败。
是否有人看到过root权限进程无法执行此操作的情况?
如何检查进程是否具有避免呼叫的所有必要权限?
更新 我发现了它唯一基于Virtuozzo的虚拟服务器。虚拟机使用例如。 KVM没关系。
答案 0 :(得分:2)
不确定您正在运行哪个内核但是会讨论此问题here。它的修复程序是here。问题出在CONFIG_SCHED_AUTOGROUP
;它不支持SCHED_RR
或SCHED_FIFO
。但是,如果您喜欢我,这可能仍然无法解决您的问题。问题在于此代码(此3.4.47代码包含上述补丁)在kernel/sched/core.c
(早期内核中的kernel/sched.c
)中:
/*
* Do not allow realtime tasks into groups that have no runtime
* assigned.
*/
if (rt_bandwidth_enabled() && rt_policy(policy) &&
task_group(p)->rt_bandwidth.rt_runtime == 0 &&
!task_group_is_autogroup(task_group(p))) {
task_rq_unlock(rq, p, &flags);
return -EPERM;
}
在我的情况下,一个系统工作,一个系统不起作用,基于!task_group_is_autogroup(task_group(p))
子句(两个系统都运行完全相同的内核)。在失败的系统中,该子句的计算结果为1(即它不在自动组中)。补丁最早出现在3.1.10内核中。听起来你有同样的问题,因为你的系统中只有一个出现故障。这指向配置问题。我没有发现/proc/sys/kernel/sched_autogroup_enabled
解决了问题;我在启用自动组时遇到了上述问题,并且当我禁用它时,另一个问题(rt_runtime
在一个系统上为零,在另一个系统上为950000000),即使/sys/fs/cgroup/cpu,cpuacct/cpu.rt_runtime_us
(我认为是直接链接) ,或至少与rt_runtime
)有关,在两种情况下都说950000000。
所以它看起来就像一个任务被分配给自动组并成功,而一个任务不是因为它没有运行时而失败。
<强>更新强>
我确实找到了一种解决方案,我在https://unix.stackexchange.com/questions/115114/why-are-cgroups-mapped-differently-on-these-two-systems-by-systemd中讨论了这个解决方案。如果我更改进程的cgroup映射,使其位于根cgroup中,则可以解决问题。通过在DefaultController
中将/etc/systemd/system.conf
设置为空,可以永久更改此设置。
答案 1 :(得分:1)
您是否尝试更改应用程序本身或系统中其他进程的优先级?
手册页man 2 sched_setscheduler
在权限和资源限制部分中说,只有拥有 CAP_SYS_NICE 功能的进程才能将计划策略更改为实时。至少在2.6.12之前的内核中,它在更新的内核中变得更复杂。
也许给你带来麻烦的机器有一些关于功能的特殊配置。
我想要发现这种情况你可以继续做你已经做的事情:调用sched_setscheduler,如果它返回EPERM,那么,没有权限。