「Linux基础」nice命令探秘

Published on:
Tags: Linux nice ruby

今天打开Ruby5扫了一眼,看到一篇文章:「Ruby & Rails: Making sure rake task won’t slow the site down」,里面谈到了使用nice命令优化rake任务,更详细的可以点进去看看。

这个命令我以前知道,以前订阅rss,某篇文章里提过,但是我只是知道而已,并没有去消化那些内容。 RSS就是有这种缺点,信息轰炸,你可以获取很多消息,眼花缭乱,但是你真正消化的能有多少? 今天还和别人在讨论rss,突然感觉,自从Google Reader停掉以后,我就没这个订阅rss的习惯了,仔细想来,我现在的习惯是自己去寻找需要的资源,而不是被动的获取。我觉得现在的方式很好,跟随自己的求知欲以及学习计划和结构,主动去寻找学习资源,不至于分散精力。这个nice命令就是这样,看过又能咋样,今天遇见还不是不了解? 不过今天的方式不一样,是我主动去寻找的资源,那我就一定得了解它的用法。

nice与进程优先级

nice命令可以改变进程的优先级。

语法:

nice [-n adjustment] [-adjustment] [--adjustment=adjustment] [--help] [--version] [command [arg...]]

说明:

  • -n adjustment, -adjustment, --adjustment=adjustment 皆为将该原有优先序的增加 adjustment
  • --help 显示求助讯息
  • --version 显示版本资讯

示例:设置程序运行时的优先级

# vi &    //后台运行

[1] 15297

# nice vi & //设置默认优先级

[2] 15298
[1]+ Stopped         vi

# nice -n 19 vi & //设置优先级为19

[3] 15299
[2]+ Stopped         nice vi

# nice -n -20 vi & //设置优先级为 -20

[4] 15300
[3]+ Stopped         nice -n 19 vi

// ls 的优先序加 1 并执行

# nice -n 1 ls


// ls 的优先序加 10 并执行
# nice ls

那什么叫进程的优先级呢?

进程cpu资源分配就是指进程的优先级(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。

进程观察

使用下面命令,我们可以观察到系统进程的优先级:

# ps -l //显示进程

F S  UID  PID PPID C PRI NI ADDR SZ WCHAN TTY     TIME CMD
4 S   0 15278 15212 0 80  0 - 1208 wait  pts/2  00:00:00 bash
0 T   0 15297 15278 0 80  0 - 2687 signal pts/2  00:00:00 vi
0 T   0 15298 15278 0 90 10 - 2687 signal pts/2  00:00:00 vi
0 T   0 15299 15278 1 99 19 - 2687 signal pts/2  00:00:00 vi
4 T   0 15300 15278 3 60 -20 - 2687 signal pts/2  00:00:00 vi
4 R   0 15301 15278 0 80  0 -  625 -   pts/2  00:00:00 ps

[4]+ Stopped         nice -n -20 vi

# ps -lA //显示全部进程

...

上面有几个重要概念需要说明:

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice值

跟我们今天的主题相关的,是后面这两个信息:PRI和NI。

  • PRI: 是指进程的优先级(priority), 是指进程被CPU执行的先后顺序,此值越小,那么进程的优先级越高。
  • NI: 是指nice的值,这个值表示的是进程可被执行的优先级的修正数值,注意,nice命令只是用来设置NI的数值,NI的数值一旦改变,就会影响到PRI。

计算公式如下:

PRI(new)=PRI(old)+nice

可以看得出来, nice的值,越小,PRI的值就越小, 进程优先级越高,则越快被执行。

nice的值,也就是NI,可以指定的范围为[-20, 19],其中-20最高,19最低,值得注意的是,只有系统管理者(root)可以设置负数的等级。

应用

这个命令的应用,就是用来优化系统。比如文章开头说的那篇文章中,用nice命令来调整rake后台的优先级:

RAILS_ENV=:environment nice -n 19 bundle exec rake :your_task 

在执行rake命令的时候,带上nice参数,指定了NI值为19, 意思是告诉CPU,这个rake 任务优先级最低,你们先忙别的吧,忙完别的再执行我。

比如我的App后台,我会把队列任务的优先级调低, 这样后台执行任务的时候,就不会跟其他API接口抢占CPU资源。 不过这个后台任务是不那么紧急的。如果你的后台任务很紧急,那么你可以调高优先级。

值得注意的是:

nice命令,只用于启动新的进程,才起作用。

renice命令

如果你想调整已经存在的进程的优先级,那么可以使用 renice命令:

renice -5 -p 5200 #PID为5200的进程nice设为-5

语法:

renice [优先等级][-g <程序群组名称>...][-p <程序识别码>...][-u <用户名称>...]

补充说明:

renice指令可重新调整程序执行的优先权等级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级, 并修改所有隶属于该程序群组或用户的程序的优先权。等级范围[-20,19],只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。更nice命令类似。

参数说明:

  • -g <程序群组名称>  使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
  • -p <程序识别码>  改变该程序的优先权等级,此参数为预设值。
  • -u <用户名称>  指定用户名称,修改所有隶属于该用户的程序的优先权。

也可以用top命令更改已存在进程的nice:

$ top

#进入top后按“r”–>输入进程PID–>输入nice值

结语

虽然我们了解了这一技巧,但是建议使用的时候,还要比较谨慎,要结合你的应用具体情况来优化。

Comments

comments powered by Disqus