7.1. 系统资源

能够监控系统的性能至关重要。如果系统资源变得过低,可能会导致很多问题。系统资源可能被单个用户占用,或者被您的系统可能托管的服务占用,例如电子邮件或网页。了解正在发生的事情可以帮助确定是否需要系统升级,或者是否需要将某些服务移动到另一台机器。

7.1.1. top 命令。

这些命令中最常用的是 toptop 将持续更新系统资源使用情况报告。

# top
 12:10:49  up 1 day,  3:47,  7 users,  load average: 0.23, 0.19, 0.10
125 processes: 105 sleeping, 2 running, 18 zombie, 0 stopped
CPU states:   5.1% user   1.1% system   0.0% nice   0.0% iowait  93.6% idle
Mem:   512716k av,  506176k used,    6540k free,       0k shrd,   21888k buff
Swap: 1044216k av,  161672k used,  882544k free                  199388k cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
 2330 root      15   0  161M  70M  2132 S     4.9 14.0  1000m   0 X
 2605 weeksa    15   0  8240 6340  3804 S     0.3  1.2   1:12   0 kdeinit
 3413 weeksa    15   0  6668 5324  3216 R     0.3  1.0   0:20   0 kdeinit
18734 root      15   0  1192 1192   868 R     0.3  0.2   0:00   0 top
 1619 root      15   0   776  608   504 S     0.1  0.1   0:53   0 dhclient
    1 root      15   0   480  448   424 S     0.0  0.0   0:03   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      35  19     0    0     0 SWN   0.0  0.0   0:00   0 ksoftirqd_CPU0
    9 root      25   0     0    0     0 SW    0.0  0.0   0:00   0 bdflush
    5 root      15   0     0    0     0 SW    0.0  0.0   0:00   0 kswapd
   10 root      15   0     0    0     0 SW    0.0  0.0   0:00   0 kupdated
   11 root      25   0     0    0     0 SW    0.0  0.0   0:00   0 mdrecoveryd
   15 root      15   0     0    0     0 SW    0.0  0.0   0:01   0 kjournald
   81 root      25   0     0    0     0 SW    0.0  0.0   0:00   0 khubd
 1188 root      15   0     0    0     0 SW    0.0  0.0   0:00   0 kjournald
 1675 root      15   0   604  572   520 S     0.0  0.1   0:00   0 syslogd
 1679 root      15   0   428  376   372 S     0.0  0.0   0:00   0 klogd
 1707 rpc       15   0   516  440   436 S     0.0  0.0   0:00   0 portmap
 1776 root      25   0   476  428   424 S     0.0  0.0   0:00   0 apmd
 1813 root      25   0   752  528   524 S     0.0  0.1   0:00   0 sshd
 1828 root      25   0   704  548   544 S     0.0  0.1   0:00   0 xinetd
 1847 ntp       15   0  2396 2396  2160 S     0.0  0.4   0:00   0 ntpd
 1930 root      24   0    76    4     0 S     0.0  0.0   0:00   0 rpc.rquotad

报告的顶部列出了诸如系统时间、运行时间、CPU 使用率、物理内存和交换内存使用情况以及进程数量等信息。下面是按 CPU 利用率排序的进程列表。

您可以在 top 运行时修改其输出。如果您按下itop 将不再显示空闲进程。再次按下i以再次查看它们。按下M将按内存使用率排序,S将按进程运行时间排序,而P将再次按 CPU 使用率排序。

除了查看选项外,您还可以从 top 命令中修改进程。您可以使用u查看特定用户拥有的进程,k终止进程,以及r重新设置进程优先级。

有关进程的更深入信息,您可以查看/proc文件系统。在/proc文件系统中,您会找到一系列以数字名称命名的子目录。这些目录与当前正在运行的进程的进程 ID 相关联。在每个目录中,您都会找到一系列包含有关进程信息的文件。

您必须极其小心,不要修改这些文件,这样做可能会导致系统问题!

7.1.2. iostat 命令。

iostat 将显示当前的 CPU 负载平均值和磁盘 I/O 信息。这是一个很棒的命令,可以监控您的磁盘 I/O 使用情况。

# iostat
Linux 2.4.20-24.9 (myhost)       12/23/2003

avg-cpu:  %user   %nice    %sys   %idle
          62.09    0.32    2.97   34.62

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
dev3-0            2.22        15.20        47.16    1546846    4799520
对于 2.4 内核,设备使用设备的主设备号和次设备号命名。在这种情况下,列出的设备是/dev/hda。要让 iostat 为您打印出来,请使用-x.
# iostat -x
Linux 2.4.20-24.9 (myhost)       12/23/2003

avg-cpu:  %user   %nice    %sys   %idle
          62.01    0.32    2.97   34.71

Device:  rrqm/s wrqm/s r/s  w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/hdc   0.00   0.00 .00 0.00   0.00   0.00  0.00  0.00     0.00     2.35  0.00  0.00 14.71
/dev/hda   1.13   4.50 .81 1.39  15.18  47.14  7.59 23.57    28.24     1.99 63.76 70.48 15.56
/dev/hda1  1.08   3.98 .73 1.27  14.49  42.05  7.25 21.02    28.22     0.44 21.82  4.97  1.00
/dev/hda2  0.00   0.51 .07 0.12   0.55   5.07  0.27  2.54    30.35     0.97 52.67 61.73  2.99
/dev/hda3  0.05   0.01 .02 0.00   0.14   0.02  0.07  0.01     8.51     0.00 12.55  2.95  0.01

iostat 的 man 手册包含对每一列含义的详细解释。

7.1.3. ps 命令

ps 将为您提供当前正在运行的进程列表。此命令为您提供了各种各样的选项。

一个常见的用法是列出当前正在运行的所有进程。为此,您将使用 ps -ef 命令。(此命令的屏幕输出太大而无法包含,以下仅是部分输出。)

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Dec22 ?        00:00:03 init
root         2     1  0 Dec22 ?        00:00:00 [keventd]
root         3     1  0 Dec22 ?        00:00:00 [kapmd]
root         4     1  0 Dec22 ?        00:00:00 [ksoftirqd_CPU0]
root         9     1  0 Dec22 ?        00:00:00 [bdflush]
root         5     1  0 Dec22 ?        00:00:00 [kswapd]
root         6     1  0 Dec22 ?        00:00:00 [kscand/DMA]
root         7     1  0 Dec22 ?        00:01:28 [kscand/Normal]
root         8     1  0 Dec22 ?        00:00:00 [kscand/HighMem]
root        10     1  0 Dec22 ?        00:00:00 [kupdated]
root        11     1  0 Dec22 ?        00:00:00 [mdrecoveryd]
root        15     1  0 Dec22 ?        00:00:01 [kjournald]
root        81     1  0 Dec22 ?        00:00:00 [khubd]
root      1188     1  0 Dec22 ?        00:00:00 [kjournald]
root      1675     1  0 Dec22 ?        00:00:00 syslogd -m 0
root      1679     1  0 Dec22 ?        00:00:00 klogd -x
rpc       1707     1  0 Dec22 ?        00:00:00 portmap
root      1813     1  0 Dec22 ?        00:00:00 /usr/sbin/sshd
ntp       1847     1  0 Dec22 ?        00:00:00 ntpd -U ntp
root      1930     1  0 Dec22 ?        00:00:00 rpc.rquotad
root      1934     1  0 Dec22 ?        00:00:00 [nfsd]
root      1942     1  0 Dec22 ?        00:00:00 [lockd]
root      1943     1  0 Dec22 ?        00:00:00 [rpciod]
root      1949     1  0 Dec22 ?        00:00:00 rpc.mountd
root      1961     1  0 Dec22 ?        00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root      2057     1  0 Dec22 ?        00:00:00 /usr/bin/spamd -d -c -a
root      2066     1  0 Dec22 ?        00:00:00 gpm -t ps/2 -m /dev/psaux
bin       2076     1  0 Dec22 ?        00:00:00 /usr/sbin/cannaserver -syslog -u bin
root      2087     1  0 Dec22 ?        00:00:00 crond
daemon    2195     1  0 Dec22 ?        00:00:00 /usr/sbin/atd
root      2215     1  0 Dec22 ?        00:00:11 /usr/sbin/rcd
weeksa    3414  3413  0 Dec22 pts/1    00:00:00 /bin/bash
weeksa    4342  3413  0 Dec22 pts/2    00:00:00 /bin/bash
weeksa   19121 18668  0 12:58 pts/2    00:00:00 ps -ef

第一列显示进程的所有者。第二列是进程 ID。第三列是父进程 ID。这是生成或启动该进程的进程。第四列是 CPU 使用率(以百分比表示)。第五列是启动时间,如果进程已运行足够长的时间,则为日期。第六列是与进程关联的 tty(如果适用)。第七列是累积 CPU 使用率(运行期间已使用的 CPU 时间总量)。第八列是命令本身。

通过此信息,您可以准确地了解系统上正在运行的内容,并终止失控进程或导致问题的进程。

7.1.4. vmstat 命令

vmstat 命令将提供一份报告,显示系统进程、内存、交换、I/O 和 CPU 的统计信息。这些统计信息是使用从上次运行命令到现在的数据生成的。如果从未运行过该命令,则数据将来自上次重启到现在的这段时间。

# vmstat
   procs                      memory      swap          io     system      cpu
 r  b  w   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id
 0  0  0 181604  17000  26296 201120    0    2     8    24  149     9 61  3 36

以下内容摘自 vmstat 的 man 手册。

字段描述
Procs
    r: 等待运行时间的进程数。
    b: 处于不可中断睡眠状态的进程数。
    w: 已交换出去但仍然可运行的进程数。  此
       字段是计算出来的,但 Linux 从不绝望地交换。

内存
    swpd: 已使用的虚拟内存量 (kB)。
    free: 空闲内存量 (kB)。
    buff: 用作缓冲区的内存量 (kB)。

交换
    si: 从磁盘交换进入的内存量 (kB/s)。
    so: 交换到磁盘的内存量 (kB/s)。

IO
    bi: 发送到块设备的块数 (blocks/s)。
    bo: 从块设备接收的块数 (blocks/s)。

系统
    in: 每秒中断数,包括时钟中断。
    cs: 每秒上下文切换数。

CPU
    这些是 CPU 总时间的百分比。
    us: 用户时间
    sy: 系统时间
    id: 空闲时间

7.1.5. lsof 命令

lsof 命令将打印出每个正在使用的文件的列表。由于 Linux 将所有内容都视为文件,因此此列表可能非常长。但是,此命令在诊断问题时可能很有用。例如,如果您希望卸载文件系统,但被告知它正在使用中。您可以使用此命令和 grep 来查找文件系统的名称,以查看谁在使用它。

或者,假设您想查看特定进程正在使用的所有文件。为此,您将使用 lsof -p -processid-

7.1.6. 查找更多实用程序

要了解有关可用命令行工具的更多信息,Chris Karakas 编写了一本参考指南,标题为 GNU/Linux 命令行工具摘要。它是了解有哪些工具以及如何完成许多任务的好资源。