本节讨论初级管理(LPIC-1)考试 101 的主题 1.103.6 的内容。这个主题的权值是 3。
在本节中,学习以下主题:
优先级
在前一节中我们看到,与大多数现代操作系统一样,Linux 可以运行多个进程。为此,Linux 会在进程之间分享 CPU 和其他资源。如果某些进程可以使用 100% 的 CPU,那么别的进程就可能没反应了。在前一节中查看 进程状态 时,我们看到 top 命令的默认输出按照 CPU 使用情况的降序列出进程。如果对我们的简单时钟脚本运行 top 命令,这个进程可能进不了这个列表,因为这个进程在大多数时候不使用 CPU。
系统上可能有许多需要大量使用 CPU 的命令。例如,视频编辑工具以及在不同图像类型或不同声音编码之间进行转换(比如从 mp3 到 ogg)的程序。
我们将创建一个小脚本,它只是使用 CPU,不做有意义的事儿。这个脚本有两个输入,一个计数值和一个标签。它打印标签以及当前日期和时间,然后递减计数值直至为 0,然后再打印标签和日期。这个脚本没有错误检查,也不很健壮,但是它可以帮助我们说明概念。
CXvLinux联盟
清单 100. CPU 密集型脚本
[ian@echidna ian]$ echo 'x="$1"'>count1.sh
[ian@echidna ian]$ echo 'echo "$2" $(date)'>>count1.sh
[ian@echidna ian]$ CXvLinux联盟 echo 'while [ $x -gt 0 ]; do let x=$x-1;done'>>count1.sh
[ian@echidna ian]$ echo 'echo "$2" $(date)'>>count1.sh
[ian@echidna ian]$ cat count1.sh
x="$1"
echo "$2" $(date)
while [ $x -gt 0 ]; do let x=$x-1;done
echo "$2" $(date)
|
如果在您自己的系统上运行这个脚本,可能会看到清单 101 所示的输出。这个脚本要使用大量 CPU。如果您不是使用自己的工作站,那么在运行这个脚本之前要确定使用大量 CPU 不会对别人造成不良影响。
CXvLinux联盟
清单 101. 运行 count1.sh
[ian@echidna ian]$ sh count1.sh 10000 A
A Mon Nov 14 07:14:04 EST 2005
A Mon Nov 14 07:14:05 EST 2005
[ian@echidna ian]$ sh count1.sh 99000 A
A Mon Nov 14 07:14:26 EST 2005
A Mon Nov 14 07:14:32 EST 2005
|
到目前为止,还算好。现在使用在本教程中学到的知识创建一个命令列表,从而在后台运行这个脚本,并启动 top 命令来查看这个脚本使用多少 CPU。命令列表如清单 102 所示,top 的输出见清单 103。
CXvLinux联盟
清单 102. 运行 count1.sh 和 top
[ian@echidna ian]$ (sh count1.sh 99000 A&);top
|
CXvLinux联盟
CXvLinux联盟
清单 103. 使用了大量 CPU
7:20am up 48 days, 20:54, 2 users, load average: 0.05, 0.05, 0.00
91 processes: 88 sleeping, 3 running, 0 zombie, 0 stopped
CPU states: 0.1% user, 0.0% system, 0.0% nice, 0.9% idle
Mem: 1030268K av, 1002864K used, 27404K free, 0K shrd, 240336K buff
Swap: 1052216K av, 118500K used, 933716K free 605152K cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
8684 ian 20 0 1044 1044 932 R 98.4 0.1 0:01 sh
|
不坏啊。我们用一个简单的脚本就占用了 98.4% 的 CPU。
显示和设置优先级
如果有这样的作业长期运行,那么可能发现它会干扰我们(或其他用户)在系统上进行其他工作的能力。Linux 和 UNIX 系统使用一个优先级系统,共有 40 个优先级,范围从 -20(最高优先级)到 19(最低优先级)。
nice
由一般用户启动的进程的优先级常常是 0。nice 命令显示默认优先级。ps 命令也可以显示优先级(nice 或 NI 级别),例如使用 -l 选项。清单 104 显示这种信息,其中突出显示了 nice 值 0。
CXvLinux联盟
清单 104. 显示优先级信息
[ian@echidna ian]$ nice
0 [ian@echidna ian]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 7283 7282 0 70 0 - 1103 wait4 pts/2 00:00:00 bash
000 R 500 9578 7283 0 72 0 - 784 - pts/2 00:00:00 ps
|
nice 命令还可以用于以不同优先级启动进程。用 -n(或 --adjustment)选项和一个负值来提高优先级,用正值来降低优先级。记住,具有最低优先级值的进程以最高的调度优先级运行。所以可以认为提高优先级值就是对其他进程更谦让。注意,常常需要具有超级用户(根用户)身份才能指定负的优先级调整值。换句话说,一般用户常常只能让他们的进程更谦让。在清单 105 中,在后台以不同的调度优先级运行 count1.sh 脚本的两个副本。注意,这两个进程的完成时间相差 5 秒。尝试使用不同的 nice 值,或者对第一个进程而不是对第二个进程进行优先级调整,从而体会不同情况的效果。
CXvLinux联盟
清单 105. 使用 nice 设置优先级
[ian@echidna ian]$ (sh count1.sh 99000 A&);\
> (nice -n 19 sh count1.sh 99000 B&);\
> sleep 2;ps -l;sleep 20
B Mon Nov 14 08:17:36 EST 2005
A Mon Nov 14 08:17:36 EST 2005
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 7283 7282 0 70 0 - 1104 wait4 pts/2 00:00:00 bash
000 R 500 10765 1 84 80 0 - 1033 - pts/2 00:00:01 sh
000 R 500 10767 1 14 79 19 - 1033 - pts/2 00:00:00 sh
000 R 500 10771 7283 0 72 0 - 784 - pts/2 00:00:00 ps
A Mon Nov 14 08:17:43 EST 2005
B Mon Nov 14 08:17:48 EST 2005
|
注意,与 nohup 命令一样,不能将命令列表或管道用作 nice 的参数。
修改优先级
renice
如果启动了一个进程并意识到它应该以不同的优先级运行,那么也有办法在进程启动之后修改它的优先级,也就是使用 renice 命令。为要修改的进程指定绝对的优先级(而不是调整值),如清单 106 所示。
CXvLinux联盟
清单 106. 使用 renice 修改优先级
[ian@echidna ian]$ sh count1.sh 299000 A&
[1] 11322
[ian@echidna ian]$ A Mon Nov 14 08:30:29 EST 2005
[ian@echidna ian]$ renice +1 11322;ps -l
11322: old priority 0, new priority 1
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 7283 7282 0 75 0 - 1104 wait4 pts/2 00:00:00 bash
000 R 500 11322 7283 96 77 1 - 1032 - pts/2 00:00:11 sh
000 R 500 11331 7283 0 76 0 - 786 - pts/2 00:00:00 ps
[ian@echidna ian]$ renice +3 11322;ps -l
11322: old priority 1, new priority 3
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 7283 7282 0 75 0 - 1104 wait4 pts/2 00:00:00 bash
000 R 500 11322 7283 93 76 3 - 1032 - pts/2 00:00:16 sh
000 R 500 11339 7283 0 76 0 - 785 - pts/2 00:00:00 ps
|
可以在手册页中找到关于 nice 和 renice 的更多信息。
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论