高级 Linux 命令精通指南(三)

高级 Linux 命令精通指南(三)

whence 和 which

这两个命令用于找到所提到的可执行文件在用户路径中的存储位置。在路径中找到可执行文件之后,这两个命令的行为基本相同,都显示文件的路径:

$ which sqlplus   
/u02/app/oracle/products/10.2.0.1/db1/bin/sqlplus
$ whence sqlplus 
/u02/app/oracle/products/10.2.0.1/db1/bin/sqlplus

输出完全相同。然而,如果在路径中未找到可执行文件,则两者的行为不同。which 命令生成一条显式消息:

$ which sqlplus1
/usr/bin/which: no sqlplus1 in (/u02/app/oracle/products/10.2.0.1/db1/bin:/usr
                                 /kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin)

whence 命令不生成任何消息:

$ whence sqlplus1]

而是返回到 shell 提示符。如果在路径中未找到可执行文件,这将很有帮助(不显示消息):

   
$ whence invalid_command
$ which invalid_command
which: no invalid_command in (/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:
                               /usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:                                /usr/bin/X11:/usr/X11R6/bin:/root/bin)

如果 whence 在路径中未找到可执行文件,它不返回任何消息,但返回代码不为零。在 shell 脚本中可以利用这个事实;例如:

RC=‘whence myexec‘
If [ $RC -ne "0" ]; then
    echo "myexec is not in the $PATH"
fi

它的一个非常有用的选项是 -i 选项,该选项显示别名以及可执行文件(如果有的话)。例如,您在本文开始部分了解了别名的用法。rm 命令实际上是我的 shell 中的一个别名,系统中某处也有一个 rm 命令。

$ which ls
/bin/ls

$ which -i ls
alias ls='ls --color=tty'
         /bin/ls

其默认行为是显示可执行文件在路径中的首次出现。如果可执行文件位于路径的多个目录中,则忽略其后的出现。您可以通过 -a 选项查看可执行文件的所有出现位置。

$ which java    
/usr/bin/java

$ which -a java
/usr/bin/java
/home/oracle/oracle/product/11.1/db_1/jdk/jre/bin/java

top

top 命令可能是 Oracle DBA 在 Linux 上管理数据库时最有用的命令。如果系统很慢,您可能希望查看谁在占用所有 CPU 和/或内存。要显示最大进程,可以使用 top 命令。

注意,与其他命令不同,top 不会产生输出,屏幕内容保持不变。它刷新屏幕以显示新信息。因此,如果您只执行 top 并保持屏幕一直开启,则屏幕始终显示最新信息。要停止并退出 shell,可以按下 Ctrl-C。

$ top

18:46:13   up 11 days, 21:50,   5 users,   load average: 0.11, 0.19, 0.18 
151 processes: 147 sleeping, 4 running, 0 zombie, 0 stopped 
CPU states:   cpu     user     nice   system     irq   softirq   iowait     idle 
            total    12.5%     0.0%     6.7%    0.0%      0.0%     5.3%    75.2% 
Mem:   1026912k av,   999548k used,    27364k free,        0k shrd,   116104k buff 
                     758312k actv,   145904k in_d,    16192k in_c 
Swap: 2041192k av,   122224k used, 1918968k free                   590140k cached 
 
   PID USER      PRI   NI   SIZE   RSS SHARE STAT %CPU %MEM    TIME CPU COMMAND 
   451 oracle     15    0   6044 4928   4216 S      0.1   0.4    0:20    0 tnslsnr 
 8991 oracle     15    0   1248 1248    896 R      0.1   0.1    0:00    0 top 
     1 root       19    0    440   400    372 S      0.0   0.0    0:04    0 init 
     2 root       15    0      0     0      0 SW     0.0   0.0    0:00    0 keventd 
     3 root       15    0      0     0      0 SW     0.0   0.0    0:00    0 kapmd 
     4 root       34   19      0     0      0 SWN    0.0   0.0    0:00    0 ksoftirqd/0 
     7 root       15    0      0     0      0 SW     0.0   0.0    0:01    0 bdflush 
     5 root       15    0      0     0      0 SW     0.0   0.0    0:33    0 kswapd 
     6 root       15    0      0     0      0 SW     0.0   0.0    0:14    0 kscand 
     8 root       15    0      0     0      0 SW     0.0   0.0    0:00    0 kupdated 
     9 root       25    0      0     0      0 SW     0.0   0.0    0:00    0 mdrecoveryd
... output snipped ...

让我们来看看产生的不同类型的信息。第一行:

18:46:13   up 11 days, 21:50,   5 users,   load average: 0.11, 0.19, 0.18

显示当前时间 (18:46:13),该系统已经运行了 11 天;并且已经工作了 21 小时 50 秒。后面显示的分别是最近 1、5、15 分钟的系统平均负载 (0.11、0.19、0.18)。(顺便提一下,您也可以通过执行 uptime 命令来获得这些信息。)

如果不需要平均负载,按下字母 "l"(小写字母 L);它将关闭。要再次将其打开,按下 l。第二行:

151 processes: 147 sleeping, 4 running, 0 zombie, 0 stopped

显示进程数、运行的进程数、休眠的进程数等。第三行和第四行:

CPU states:   cpu     user     nice   system     irq   softirq   iowait     idle 
            total    12.5%     0.0%     6.7%    0.0%      0.0%     5.3%    75.2%

显示 CPU 利用率的详细信息。上面一行显示用户进程占用了 CPU 的 12.5%,系统占用了 6.7%。用户进程中包括 Oracle 进程。按下 "t" 可以关闭和打开这三行。如果有多个 CPU,屏幕将在每行显示一个 CPU 的信息。

接下来的两行:

Mem:   1026912k av, 1000688k used,   26224k free,     0k shrd,   113624k buff 
                     758668k actv,   146872k in_d,   14460k in_c
Swap: 2041192k av, 122476k used,    1918716k free              591776k cached

显示可用的和已利用的内存。内存总量为 "1026912k av"(大约 1GB),其中只有 26224k(即 26MB)是可用的。交换空间为 2GB;但几乎并未使用。要关闭和打开这两行,可以按下 "m"。

其余的显示内容以表格格式显示进程。下面对各列进行解释:

描述

PID 进程的进程 ID
USER

运行该进程的用户
PRI

进程的优先级
NI nice 值:该值越高,任务的优先级越低
SIZE

该进程使用的内存(代码+数据+堆栈)
RSS

该进程使用的物理内存
SHARE

该进程使用的共享内存
STAT

该进程的状态,用代码显示。一些主要的状态代码包括:
R — 正在运行
S — 正在休眠
Z — 迟滞
T — 已停止

您还会看到第二个和第三个字符,它们表示:
W — 已换出的进程
N — 正 nice 值
%CPU

该进程使用的 CPU 百分比
%MEM

该进程使用的内存百分比
TIME

该进程使用的总 CPU 时间
CPU

如果这是一个多处理器系统,该列指明正在其上运行进程的 CPU 的 ID。
COMMAND 该进程发出的命令

显示 top 时,您可以按几个键来设置希望的显示格式。按下大写字母 M 键可根据内存使用情况对输出进行排序。(注意,使用小写字母 m 将在显示屏的顶部打开或关闭内存汇总行。)当您希望了解谁在占用内存时,该键非常有用。示例输出如下:

PID USER      PRI   NI   SIZE   RSS SHARE STAT %CPU %MEM    TIME CPU COMMAND 
31903 oracle     15    0 75760   72M 72508 S      0.0   7.2    0:01    0 ora_smon_PRODB2 
31909 oracle     15    0 68944   66M 64572 S      0.0   6.6    0:03    0 ora_mmon_PRODB2 
31897 oracle     15    0 53788   49M 48652 S      0.0   4.9    0:00    0 ora_dbw0_PRODB2

既然您了解了如何解释输出,我们来看看如何使用命令行参数。

最有用的参数是 -d,它指示两次屏幕刷新之间的延迟。要每秒刷新一次,则使用 top -d 1。

另一个有用的选项是 -p。如果您希望只监视几个进程而并非全部,可以在 -p 选项后指定这几个进程。要监视进程 13609、13608 和 13554,执行以下命令:

top -p 13609 -p 13608 -p 13554

这将以和 top 命令相同的格式显示结果,但只显示特定进程的信息。

适用于 Oracle 用户的技巧

众所周知,使用 top 实用程序分析数据库服务器的性能非常方便。下面是部分 top 输出。

20:51:14   up 11 days, 23:55,   4 users,   load average: 0.88, 0.39, 0.27 
113 processes: 110 sleeping, 2 running, 1 zombie, 0 stopped 
CPU states:   cpu     user     nice   system     irq   softirq   iowait     idle 
            total     1.0%     0.0%     5.6%    2.2%      0.0%    91.2%     0.0% 
Mem:   1026912k av, 1008832k used,    18080k free,        0k shrd,    30064k buff 
                     771512k actv,   141348k in_d,    13308k in_c 
Swap: 2041192k av,    66776k used, 1974416k free                   812652k cached 
 
   PID USER      PRI   NI   SIZE   RSS SHARE STAT %CPU %MEM    TIME CPU COMMAND 
16143 oracle     15    0 39280   32M 26608 D      4.0   3.2    0:02    0 oraclePRODB2...
     5 root       15    0      0     0      0 SW     1.6   0.0    0:33    0 kswapd
... output snipped ...

我们来仔细分析此输出。首先,您需要注意 CPU states 下面的 "idle" 列;该列为 0.0%,这意味着 CPU 被完全占用来执行某项任务。问题是 CPU 在做什么?将注意力转向 "system" 列,就在左侧不远处;该列显示 5.6%。这说明,系统本身占用的 CPU 并不多。再向左就是 "user" 列,该列显示 1.0%。由于用户进程还包括 Oracle,因此 Oracle 并未占用 CPU 周期。那么,到底是什么占用了整个 CPU?

答案就在同一行右侧 "iowait" 列下面,该列为 91.2%。一切都明白了:91.2% 的 CPU 时间都在等待 IO。

为什么会有这么多的 IO 等待?答案在显示内容中。注意最消耗资源的进程的 PID:16143 您可以使用以下查询来确定该进程在做什么:

select s.sid, s.username, s.program
from v$session s, v$process p
where spid = 16143
and p.addr = s.paddr
/

        SID USERNAME PROGRAM
------------------- -----------------------------
        159 SYS       rman@prolin2 (TNS V1-V3) 

rman 进程在进行与 CPU 周期相关的 IO 等待。该信息可以帮助您确定接下来的操作流程。

skill 和 snice

通过前面的讨论,您已经了解了如何识别占用 CPU 的资源。如果您发现了一个占用大量 CPU 和内存的进程,但又不想停止它,该怎么办?考虑下面的 top 输出:

$ top -c -p 16514

23:00:44   up 12 days,   2:04,   4 users,   load average: 0.47, 0.35, 0.31 
1 processes: 1 sleeping, 0 running, 0 zombie, 0 stopped 
CPU states:   cpu     user     nice   system     irq   softirq   iowait     idle 
            total     0.0%     0.6%     8.7%    2.2%      0.0%    88.3%     0.0% 
Mem:   1026912k av, 1010476k used,    16436k free,        0k shrd,    52128k buff 
                     766724k actv,   143128k in_d,    14264k in_c 
Swap: 2041192k av,    83160k used, 1958032k free                   799432k cached 
 
   PID USER      PRI   NI   SIZE   RSS SHARE STAT %CPU %MEM    TIME CPU COMMAND 
16514 oracle     19    4 28796   26M 20252 D N    7.0   2.5    0:03    0 oraclePRODB2...

既然您确认进程 16514 占用了大量内存,您就可以使用 skill 命令“冻结”它,而不是停止它。

$ skill -STOP 1

之后,检查 top 输出:

23:01:11   up 12 days,   2:05,   4 users,   load average: 1.20, 0.54, 0.38 
1 processes: 0 sleeping, 0 running, 0 zombie, 1 stopped 
CPU states:   cpu     user     nice   system     irq   softirq   iowait     idle 
            total     2.3%     0.0%     0.3%    0.0%      0.0%     2.3%    94.8% 
Mem:   1026912k av, 1008756k used,    18156k free,        0k shrd,     3976k buff 
                     770024k actv,   143496k in_d,    12876k in_c 
Swap: 2041192k av,    83152k used, 1958040k free                   851200k cached 
 
   PID USER      PRI   NI   SIZE   RSS SHARE STAT %CPU %MEM    TIME CPU COMMAND 
16514 oracle     19    4 28796   26M 20252 T N    0.0   2.5    0:04    0 oraclePRODB2...

现在,CPU 从 0% 空闲变为 94% 空闲。该进程被有效冻结。过一段时间之后,您可能希望唤醒该进程:

$ skill -CONT 16514

如果希望暂时冻结进程以便为完成更重要的进程腾出空间,该方法非常有用。

此命令用途很广。如果您要停止 "oracle" 用户的所有进程,只需要一个命令即可实现:

$ skill -STOP oracle

可以使用用户、PID、命令或终端 id 作为参数。以下命令可停止所有 rman 命令。

$ skill -STOP rman

如您所见,skill 决定您输入的参数(进程 ID、用户 ID 或命令)并进行相应操作。这可能会导致在某些情况下出现这样的问题:您可能具有同名的用户和命令。最好的示例是 "oracle" 进程,通常由用户 "oracle" 运行。因此,当您希望停止名为 "oracle" 的进程时,可执行以下命令:

$ skill -STOP oracle

用户 "oracle" 的所有进程都停止,包括您可能要使用的会话。要非常明确地执行命令,您可以选择使用一个新参数指定参数的类型。要停止一个名为 oracle 的命令,可执行以下命令:

$ skill -STOP -c oracle

snice 命令的功能与 skill 类似。但它用于降低进程的优先级,而不是停止进程。首先,检查 top 输出:

   PID USER      PRI   NI   SIZE   RSS SHARE STAT %CPU %MEM    TIME CPU COMMAND 
     3 root       15    0      0     0      0 RW     0.0   0.0    0:00    0 kapmd 
13680 oracle     15    0 11336   10M   8820 T      0.0   1.0    0:00    0 oracle 
13683 oracle     15    0   9972 9608   7788 T      0.0   0.9    0:00    0 oracle 
13686 oracle     15    0   9860 9496   7676 T      0.0   0.9    0:00    0 oracle 
13689 oracle     15    0 10004 9640   7820 T      0.0   0.9    0:00    0 oracle 
13695 oracle     15    0   9984 9620   7800 T      0.0   0.9    0:00    0 oracle 
13698 oracle     15    0 10064 9700   7884 T      0.0   0.9    0:00    0 oracle 
13701 oracle     15    0 22204   21M 16940 T      0.0   2.1    0:00    0 oracle

现在,将 "oracle" 进程的优先级降低四个点。注意,该值越高,优先级越低。

$ snice +4 -u oracle

   PID USER      PRI   NI   SIZE   RSS SHARE STAT %CPU %MEM    TIME CPU COMMAND 
16894 oracle     20    4 38904   32M 26248 D N    5.5   3.2    0:01    0 oracle

注意,NI 列(nice 值)现在是 4,优先级现在设置为 20,而不是 15。这对于降低优先级非常有帮助。

你可能感兴趣的:(oracle,linux,rss,command,user,System)