在短时间内降低自我优先级,然后再将其增加

时间:2014-05-25 20:10:57

标签: ruby linux process linux-kernel

在某些情况下,我希望减少正在运行的进程优先级以执行costy操作,然后将其增加回原始值。该过程应该在没有root权限的情况下单独执行

我在Process.setpriority的红宝石应用中尝试过这个。

这不是内核设计的缺陷吗?

这是shell中的一个例子:

$ nice
0

然后

$ renice -n 19 -p $$ 
5094 (process' ID) old priority 0, new priority 19

然后

$ renice -n 0 -p $$
renice: failed to set priority for 5094 (process' ID): Permission denied

1 个答案:

答案 0 :(得分:3)

通常只有root(或具有CAP_SYS_NICE权限的进程)可以将其“nice”更改为更高优先级(更低的值)。但是自2.6.12版本的内核(http://man7.org/conf/lca2006/Linux_2.6_changes/rlimit_5.html)以来,linux引入了增加优先级(降低好看)的额外方法,即RLIMIT_NICE rlimit(man getrlimit)。您可以在bash中使用ulimit -e进行检查,然后在切换(su)到普通用户或无人(example)之前按root更改。

那么,你怎么做才能使你的过程暂时具有低优先级(更高的好价值):

  1. 从root
  2. 获取CAP_SYS_NICE权限
  3. 设置右RLIMIT_NICE(默认为0,因此RLIMIT_NICE被禁用,这是linux发行版中的缺陷),可以是root ulimit -e VALUE,也可以是系统范围/etc/security/limits.conf,项目nice (此配置由pam_limits.so PAM模块使用,因此检查是否在启动进程之前调用。通常由login,* dm managers,crond和atd调用。不知道是否需要进程调用由init.d脚本启动)
  4. 来自brauliobo的第二个变体的两个示例,允许在系统范围内返回0。添加到/etc/security/limits.conf

    *              soft    nice    0 # ranges from -20 to 19
    

    或使用sudo root来更改单个shell的RLIMIT_NICE:

    sudo bash
    ulimit -e 20 # equivalent to 0, as it ranges from 0 to 40
    sudo -u youruser bash
    # now you can renice back to 0
    

    如果没有root用户的帮助,您可以:

    1. 执行低优先级工作的第二个进程并仅对其进行renice。使用进程间通信发送工作项并获得结果。
    2. 您可以在执行低优先级工作时经常致电sched_yield。这将使其他进程能够提前抢占您的程序。