gpt4 book ai didi

c++ - 如何检查 sched_setscheduler() 的权限?

转载 作者:太空宇宙 更新时间:2023-11-04 09:01:32 25 4
gpt4 key购买 nike

我有一个调用 sched_setscheduler(pid, SCHED_RR, ... ) 的 C++ 应用程序。

该应用程序以 root 权限在 Linux 上运行。通话通常有效。只有在一个特定的虚拟专用服务器中,它才会失败并返回 EPERM

有没有人见过具有 root 权限的进程无法执行此操作的情况?

如何检查进程是否具有所有必要的权限以避免调用?

更新:我发现它唯一基于 Virtuozzo 的虚拟服务器发生了这种情况。虚拟机使用例如。 KVM 可以。

最佳答案

不确定您正在运行哪个内核,但讨论了这个问题 here .它的修复是 here .问题出在CONFIG_SCHED_AUTOGROUP;它不支持 SCHED_RRSCHED_FIFO。但是,如果您像我一样,这可能仍然无法解决您的问题。问题在于 kernel/sched/core.c 中的这段代码(此 3.4.47 代码包含上述补丁)(早期内核中的 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 中,问题就解决了。这可以通过在 /etc/systemd/system.conf 中将 DefaultController 设置为 null 来永久更改。

关于c++ - 如何检查 sched_setscheduler() 的权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20412336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com