2014-05-25 25 views
2

在某些情况下,我想减少运行进程优先级以执行费用高的操作,然后将其增加回原始值。该过程应该自己完成,没有根权限在短时间内减少自我优先级,然后将其增加回

我试过在一个红宝石应用程序里面用Process.setpriority

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

这在壳的例子:

$ 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 
+2

如果允许用户更高的优先级,他们总是会将其增加到最大,自私。那将是一个缺陷。 – Pavel

+0

brauliobo,你的linux内核版本是什么(或者只显示'uname -a'的输出) – osgx

+0

@Pavel内核可以保存原始的优先级,并允许进程将其设置回它或更低的值 – brauliobo

回答

3

一般仅根(或具有CAP_SYS_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进行更改。

那么,你能做些什么使你的过程临时具有低优先级(高nice值):

  1. 从根获得CAP_SYS_NICE特权
  2. 设置权RLIMIT_NICE(默认为0,所以RLIMIT_NICE是禁用,这是Linux发行版中的缺陷),通过根ulimit -e VALUE或系统范围/etc/security/limits.conf,项nice(此配置由pam_limits.so PAM模块使用,因此检查,在启动进程之前调用它,通常称为通过登录,* dm管理员,crond和atd。不知道它是否被init.d脚本启动的进程调用)

来自brauliobo的第二个变体的两个示例允许在系统范围内返回0。添加到/etc/security/limits.conf

*    soft nice 0 # ranges from -20 to 19 

或者用sudo根改变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。这将使其他进程尽早抢占你的程序。
+0

对于我登录的用户,'ulimit -e'已经返回0,但是我不能将优先级设置为0 – brauliobo

+0

也'limits.conf'使用不同的格式,我不怎么做'ulimit -e V '从那里开始 – brauliobo

+1

'ulimit -e'值被移位了20(在0..40的范围内;设置20使重新恢复为“0”),并且'nice'值在renice使用时没有移位(它们是在范围-20..19):http://manpages.ubuntu.com/manpages/precise/man2/getrlimit.2.html“*好的价值的实际上限计算为20 - rlim_cur。(这种奇怪发生因为负数不能被指定为资源限制值,因为它们通常具有特殊的含义......)*“。根据man'limits.conf(5)',limits.conf将接受'[-20,19]'范围,但我想仔细检查一下。 – osgx