DBA:Linux
| ||||||||||||||||||||||
|
高级 Linux 命令精通指南,第 3 部分:资源管理
作者:Arup Nanda
2009 年 1 月发表
在此部分中,了解用于监视物理组件的高级 Linux 命令
Linux 系统由若干主要物理组件组成,如 CPU、内存、网卡和存储设备。要有效地管理 Linux 环境,您应该能够以合理的精度测量这些资源的各种指标 — 每个组件处理多少资源、是否存在瓶颈等。
在本系列的其他部分中,您已经学习了处于宏级别的用于测量指标的一些命令。但在此部分中,您将了解专门用于监视物理组件的高级 Linux 命令。具体而言,您将了解以下类别的命令:
组件 | 命令 |
内存 | free、vmstat、mpstat、iostat、sar |
CPU | vmstat、mpstat、iostat、sar |
I/O | vmstat、mpstat、iostat、sar |
进程 | ipcs、ipcrm |
正如您所见,某些命令出现在多个类别中。这是由于这些命令可以执行很多任务。某些命令比较适合于某些组件,例如 iostat 适合 I/O,但是您应该了解它们工作的差别并使用您更熟悉的命令。
在多数情况下,单个命令可能对于了解实际发生的情况没什么用。要获取所需的信息,您应该了解多个命令。
free
一个常见的问题是“我的应用程序和各种服务器、用户和系统进程正在使用多少内存?”或者“现在有多少内存可用?”如果正在运行的进程使用的内存大于可用 RAM,则需要将这些进程移到交换区。因此,一个补充问题是“正在使用多少交换区空间?”
free 命令将回答所有这些问题。而且,一个非常有用的选项 –m 可以显示可用内存(以 MB 为单位):
# free -m total used free shared buffers cached Mem: 1772 1654 117 0 18 618 -/+ buffers/cache: 1017 754 Swap: 1983 1065 918
以上输出显示系统具有 1,772 MB 的 RAM,已使用 1,654 MB,还有 117 MB 内存可用。第二行显示在物理内存中缓冲区和缓存大小的更改。第三行显示交换区利用情况。
要以 KB 或 GB 为单位显示以上内容,请将 -m 选项分别替换为 -k 或 -g。使用 –b 选项将以字节为单位。
# free -b total used free shared buffers cached Mem: 1858129920 1724039168 134090752 0 18640896 643194880 -/+ buffers/cache: 1062203392 795926528 Swap: 2080366592 1116721152 963645440
–t 选项在输出底部显示总数(物理内存和交换区的总和):
# free -m -t total used free shared buffers cached Mem: 1772 1644 127 0 16 613 -/+ buffers/cache: 1014 757 Swap: 1983 1065 918 Total: 3756 2709 1046
尽管 free 不显示百分比,但是我们可以提取并格式化输出的特定部分,将已使用的内存仅显示为总数的百分比:
# free -m | grep Mem | awk '{print ($3 / $2)*100}' 98.7077
这在具体数据非常重要的 shell 脚本中非常方便。例如,您可能希望在可用内存的百分比低于特定阈值时触发一个警报。
同样,要发现已使用交换区空间的百分比,您可以发出:
free -m | grep -i Swap | awk '{print ($3 / $2)*100}'
可以使用 free 查看应用程序施加的内存负载。例如,启动备份应用程序之前检查可用内存,启动之后立即检查可用内存。两者之差就是备份应用程序消耗的内存。
针对 Oracle 用户的用法
那么,您如何使用该命令管理运行 Oracle 环境的 Linux 服务器呢?性能问题的一个最常见原因是内存不足,从而导致系统临时将内存区域“交换”到磁盘中。某种程度的交换可能是必然的,但是交换过多则表示可用内存不足。
而现在,您可以使用 free 获得可用内存信息,紧接着使用 sar 命令(稍后介绍)检查内存和交换区消耗的历史趋势。如果交换区的使用是暂时的,则可能出现一次高峰,但是如果明确要经过一段时间,则应注意。持续的内存过载可能有几个明显且可能的疑点:
- 较大的 SGA 高于可用内存
- 在 PGA 上分配了大量内存
- 某些进程出现泄露内存的错误
对于第一种情况,应确保 SGA 低于可用内存。根据经验,对 SGA 使用大约物理内存的 40%,当然,应根据具体情况定义该参数。对于第二种情况,应尝试减少查询中的大量缓冲区分配。对于第三种情况,应使用 ps 命令(在本系列的之前部分中介绍过)确定可能泄露内存的具体进程。
ipcs
当某个进程运行时,它会夺取“共享内存”。该进程可能拥有一个或很多个共享内存段。进程之间彼此(“进程间通信”或 IPC)发送消息并使用信号。要显示有关共享内存段、IPC 消息队列以及信号的信息,可以使用一个命令:ipcs。
–m 选项非常受欢迎;它显示共享内存段。
# ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0xc4145514 2031618 oracle 660 4096 0 0x00000000 3670019 oracle 660 8388608 108 0x00000000 327684 oracle 600 196608 2 dest 0x00000000 360453 oracle 600 196608 2 dest 0x00000000 393222 oracle 600 196608 2 dest 0x00000000 425991 oracle 600 196608 2 dest 0x00000000 3702792 oracle 660 926941184 108 0x00000000 491529 oracle 600 196608 2 dest 0x49d1a288 3735562 oracle 660 140509184 108 0x00000000 557067 oracle 600 196608 2 dest 0x00000000 1081356 oracle 600 196608 2 dest 0x00000000 983053 oracle 600 196608 2 dest 0x00000000 1835023 oracle 600 196608 2 dest
该输出表明服务器正在运行 Oracle 软件,显示了各种共享内存段。每个共享内存段由显示在“shmid”列下面的共享内存 ID 唯一标识。(稍后,您将看到如何使用该列值。)显然,“owner”显示内存段的所有者,“perms”列显示权限(与 unix 权限相同),“bytes”显示字节大小。
-u 选项显示一个非常快速的摘要:
# ipcs -mu ------ Shared Memory Status -------- segments allocated 25 pages allocated 264305 pages resident 101682 pages swapped 100667 Swap performance: 0 attempts 0 successes
–l 选项显示限定值(相对于当前值):
# ipcs -ml ------ Shared Memory Limits -------- max number of segments = 4096 max seg size (kbytes) = 907290 max total shared memory (kbytes) = 13115392 min seg size (bytes) = 1
如果您看到当前值处于或接近限定值,则应该考虑提高限定值。
可以使用 shmid 值获取具体共享内存段的详细图片。–i 选项可以完成该操作。下面是查看 shmid 3702792 详细信息的方法:
# ipcs -m -i 3702792 Shared memory Segment shmid=3702792 uid=500 gid=502 cuid=500 cgid=502 mode=0660 access_perms=0660 bytes=926941184 lpid=12225 cpid=27169 nattch=113 att_time=Fri Dec 19 23:34:10 2008 det_time=Fri Dec 19 23:34:10 2008 change_time=Sun Dec 7 05:03:10 2008
稍后,本文将采用一个示例向您介绍如何解释以上输出。
-s 显示系统中的信号:
# ipcs -s ------ Semaphore Arrays -------- key semid owner perms nsems 0x313f2eb8 1146880 oracle 660 104 0x0b776504 2326529 oracle 660 154 … and so on …
它显示一些有价值的数据。它显示 ID 为 1146880 的信号数组具有 104 个信号,另一个数组具有 154 个信号。如果您增加信号,则总值必须低于内核参数 (semmax) 定义的上限。安装 Oracle 数据库软件时,预安装的检查程序将检查 semmax 的设置。之后,当系统达到稳定状态时,您可以检查实际的利用情况,然后相应地调整内核值。
针对 Oracle 用户的用法
如何查看 Oracle 数据库实例使用的共享内存段?为此,请使用 oradebug 命令。首先以 sysdba 身份连接到数据库:
# sqlplus / as sysdba
在 SQL 中,使用 oradebug 命令,如下所示:
SQL> oradebug setmypid Statement processed. SQL> oradebug ipc Information written to trace file.
要查找跟踪文件的名称,执行以下命令:
SQL> oradebug TRACEFILE_NAME /opt/oracle/diag/rdbms/odba112/ODBA112/trace/ODBA112_ora_22544.trc
现在,如果打开该跟踪文件,将会看到共享内存 ID。下面是该文件的节选:
Area #0 `Fixed Size' containing Subareas 0-0 Total size 000000000014613c Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 0 0 17235970 0x00000020000000 0x00000020000000 Subarea size Segment size 0000000000147000 000000002c600000 Area #1 `Variable Size' containing Subareas 4-4 Total size 000000002bc00000 Minimum Subarea size 00400000 Area Subarea Shmid Stable Addr Actual Addr 1 4 17235970 0x00000020800000 0x00000020800000 Subarea size Segment size 000000002bc00000 000000002c600000 Area #2 `Redo Buffers' containing Subareas 1-1 Total size 0000000000522000 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 2 1 17235970 0x00000020147000 0x00000020147000 Subarea size Segment size 0000000000522000 000000002c600000 ... and so on ...
共享内存 id 以红色粗体显示。可以使用该共享内存 ID 来获取共享内存的详细信息:
# ipcs -m -i 17235970
另一个有用的观察是 lpid 的值 — 最后一个接触共享内存段的进程的进程 ID。要展示该属性的值,使用 SQL*Plus 从另一个会话连接到该实例。
# sqlplus / as sysdba
在该会话中,查找服务器进程的 PID:
SQL> select spid from v$process 2 where addr = (select paddr from v$session 3 where sid = 4 (select sid from v$mystat where rownum < 2) 5 ); SPID ------------------------ 13224
现在,针对同一共享内存段再次执行 ipcs 命令:
# ipcs -m -i 17235970 Shared memory Segment shmid=17235970 uid=500 gid=502 cuid=500 cgid=502 mode=0660 access_perms=0660 bytes=140509184 lpid=13224 cpid=27169 nattch=113 att_time=Fri Dec 19 23:38:09 2008 det_time=Fri Dec 19 23:38:09 2008 change_time=Sun Dec 7 05:03:10 2008
注意,lpid 的值已经从原来的值 12225 更改为 13224。lpid 显示最后一个接触共享内存段的进程的 PID。
该命令自身的价值不大。下一个命令 ipcrm 允许您基于输出采取操作,正如您将在下一部分所见。
ipcrm
既然您已经标识了共享内存和其他 IPC 指标,那么使用它们做什么呢?之前您看到过一些用法,如标识 Oracle 使用的共享内存、确保为共享内存设置了内核参数等等。另一个常见的应用是删除共享内存、IPC 消息队列或信号数组。
要删除某个共享内存段,注意 ipcs 命令输出中它的 shmid。然后使用 –m 选项删除该段。要删除 ID 为 3735562 的段,使用:
# ipcrm –m 3735562
这将删除该共享内存。还可以使用该命令删除信号和 IPC 消息队列(使用 –s 和 –q 参数)。
针对 Oracle 用户的用法
有时当您关闭数据库实例时,Linux 内核可能未完全清除共享内存段。留下的共享内存没有什么用处,但它会占用系统资源,从而使可用于其他进程的内存更少。这种情况下,可以检查 “oracle”用户所拥有的任何延迟共享内存段,然后删除它们,如果有这样的段,使用 ipcrm 命令。
vmstat
vmstat 是最早用于显示所有与内存和进程相关信息的命令,调用时,该命令会持续运行并发布其信息。它有两个参数:
# vmstat <interval> <count>
<interval> 是两次运行之间的时间间隔,以秒为单位。<count> 是 vmstat 重复的次数。下面是当我们希望 vmstat 每隔 5 秒运行一次并在第 10 次运行后停止时的示例。每 5 秒之后都会输出一行并显示此时的统计信息。
# vmstat 5 10
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 1087032 132500 15260 622488 89 19 9 3 0 0 4 10 82 5 0 0 1087032 132500 15284 622464 0 0 230 151 1095 858 1 0 98 1 0 0 1087032 132484 15300 622448 0 0 317 79 1088 905 1 0 98 0 … shows up to 10 times.
该输出显示有关系统资源的大量信息。我们来详细介绍它们:
procs | 显示进程数 |
r | 等待运行的进程。系统上的负载越多,等待运行 CPU 周期的进程数量越多。 |
b | 不可中断睡眠的进程,也称为“被阻塞”的进程。这些进程最有可能等待 I/O,但也可能等待其他事情。 |
有时,还存在另外一列,该列位于标题“w”下,显示可以运行但已经交换到交换区域中的进程数。
“b”下的数值应接近于 0。如果“w”下的数值很高,可能需要更多内存。
下表显示了内存指标:
swpd | 虚拟内存或交换内存的数量(以 KB 为单位) |
free | 可用物理内存的数量(以 KB 为单位) |
buff | 用作缓冲区的内存数量(以 KB 为单位) |
cache | 用作缓存的物理内存数量(以 KB 为单位) |
缓冲区内存用来存储文件元数据(如 i-nodes)以及原始块设备中的数据。缓存内存用于文件数据本身。
下表显示了交换活动:
si | 将内存从磁盘交换回物理 RAM 的速率(以 KB/秒为单位) |
so | 将内存从物理 RAM 交换到磁盘的速率(以 KB/秒为单位) |
下表显示了 I/O 活动:
bi | 系统向块设备发送数据的速率(以块/秒为单位) |
bo | 系统从块设备中读取数据的速率(以块/秒为单位) |
下表显示了系统相关活动:
in | 系统每秒接收到的中断数 |
cs | 在进程空间中切换上下文的速率(以数量/秒为单位) |
最后这张表可能用得最多 — 有关 CPU 负载的信息:
us | 显示花费在用户进程中的 CPU 百分比。Oracle 进程属于这一类。 |
sy | 系统进程(如所有根进程)使用的 CPU 百分比 |
id | 可用 CPU 百分比 |
wa | 花费在“等待 I/O”上的百分比 |
让我们看一看如何解释这些值。输出的第一行是自从系统重新启动以来所有指标的平均值。因此,忽略该行,因为它并不显示当前状态。其他行显示实时指标。
理想情况下,等待或阻塞的进程数量(位于“procs”标题下)应该为 0 或接近于 0。如果数值较高,则表示系统没有足够的资源(如 CPU、内存或 I/O)。诊断性能问题时该信息非常有用。
“swap”下的数据表明交换是否过多。如果交换过多,则表明物理内存可能不足。应该减少内存需求或增加物理 RAM。
“io”下的数据表示往返于磁盘的数据流。这表明正在进行的磁盘活动量,这并不一定表明存在问题。如果您看到“proc”和“b”列(正在阻塞的进程)下有较大的数值和较高的 I/O,则可能出现了严重的 I/O 争用问题。
“cpu”标题下是最有用的信息。“id”列显示空闲 CPU。如果用 100 减去该数值,则会得到繁忙 CPU 的百分比。还记得本系列的另一个部分中描述的 top 命令吗?该命令还显示 CPU 的空闲百分比数值。区别是:top 显示每个 CPU 的空闲百分比,而 vmstat 显示所有 CPU 的空闲百分比。
vmstat 命令还显示 CPU 使用情况的划分:Linux 系统使用多少、用户进程使用多少以及等待 I/O 使用多少。通过该划分,您可以确定 CPU 消耗的组成。如果系统 CPU 负载较高,能表明正在运行某个根进程(如备份)吗?
一段时间内的系统负载应该一致。如果系统显示较高的数值,请使用 top 命令确定占有 CPU 的系统进程。
针对 Oracle 用户的用法
Oracle 进程(后台进程和服务器进程)和用户进程(sqlplus、apache 等)位于“us”下。如果该数值较高,则使用 top 来确定进程。如果“wa”列显示较高的数值,则表明 I/O 系统无法跟上读取或写入的数量。有时这可能是因为在数据库中进行大量更新,从而导致日志切换以及后续的大量存档进程。但是,如果它持续显示一个较大的数值,则表明可能存在 I/O 瓶颈。
Oracle 数据库中的 I/O 瓶颈可能会造成严重的问题。与性能问题不同,慢速 I/O 可能导致控制文件写入速度缓慢,这会导致等待获取控制文件的进程加入队列。如果等待超过 900 秒且等待者是关键进程(如 LGWR),则会关闭数据库实例。
如果您看到很多交换,可能是 SGA 的太大,以至于物理内存容纳不下。应该减小 SGA 大小或增加物理内存。
mpstat
另一个用于获取 CPU 相关统计信息的有用的命令是 mpstat。下面是一个示例输出:
# mpstat -P ALL 5 2 Linux 2.6.9-67.ELsmp (oraclerac1) 12/20/2008 10:42:38 PM CPU %user %nice %system %iowait %irq %soft %idle intr/s 10:42:43 PM all 6.89 0.00 44.76 0.10 0.10 0.10 48.05 1121.60 10:42:43 PM 0 9.20 0.00 49.00 0.00 0.00 0.20 41.60 413.00 10:42:43 PM 1 4.60 0.00 40.60 0.00 0.20 0.20 54.60 708.40 10:42:43 PM CPU %user %nice %system %iowait %irq %soft %idle intr/s 10:42:48 PM all 7.60 0.00 45.30 0.30 0.00 0.10 46.70 1195.01 10:42:48 PM 0 4.19 0.00 2.20 0.40 0.00 0.00 93.21 1034.53 10:42:48 PM 1 10.78 0.00 88.22 0.40 0.00 0.00 0.20 160.48 Average: CPU %user %nice %system %iowait %irq %soft %idle intr/s Average: all 7.25 0.00 45.03 0.20 0.05 0.10 47.38 1158.34 Average: 0 6.69 0.00 25.57 0.20 0.00 0.10 67.43 724.08 Average: 1 7.69 0.00 64.44 0.20 0.10 0.10 27.37 434.17
它显示了系统中 CPU 的各种统计信息。–P ALL 选项指示该命令显示所有 CPU 的统计信息,而不只是特定 CPU 的统计信息。参数 5 2 指示该命令每隔 5 秒运行一次,共运行 2 次。以上输出首先显示了所有 CPU 的合计指标,然后显示了每个 CPU 各自的指标。最后,在结尾处显示所有 CPU 的平均值。
让我们看一看这些列值的含义:
%user | 表示处理用户进程所使用 CPU 的百分比。用户进程是用于应用程序(如 Oracle 数据库)的非内核进程。在本示例输出中,用户 CPU 百分比非常低。 |
|
|
%nice | 表示使用 nice 命令对进程进行降级时 CPU 的百分比。在之前的部分中已经对 nice 命令进行了介绍。简单来说,nice 命令更改进程的优先级。 |
|
|
%system | 表示内核进程使用的 CPU 百分比 |
|
|
%iowait | 表示等待进行 I/O 所使用的 CPU 时间百分比 |
|
|
%irq | 表示用于处理系统中断的 CPU 百分比 |
|
|
%soft | 表示用于软件中断的 CPU 百分比 |
|
|
%idle | 显示 CPU 的空闲时间 |
|
|
%intr/s | 显示每秒 CPU 接收的中断总数 |
当您拥有前面所述的 vmstat 时,您可能想知道 mpstat 命令的作用。差别很大:mpstat 可以显示每个处理器的统计,而 vmstat 显示所有处理器的统计。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题。
针对 Oracle 用户的用法
与 vmstat 相似,mpstat 命令还产生与 CPU 有关的统计信息,因此所有与 CPU 问题有关的讨论也都适用于 mpstat。当您看到较低的 %idle 数字时,您知道出现了 CPU 不足的问题。当您看到较高的 %iowait 数字时,您知道在当前负载下 I/O 子系统出现了某些问题。该信息对于解决 Oracle 数据库性能问题非常方便。
iostat
性能评估的一个主要部分就是磁盘性能。iostat 命令提供了存储接口的性能指标。
# iostat Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 avg-cpu: %user %nice %sys %iowait %idle 15.71 0.00 1.07 3.30 79.91 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn cciss/c0d0 4.85 34.82 130.69 307949274 1155708619 cciss/c0d0p1 0.08 0.21 0.00 1897036 3659 cciss/c0d0p2 18.11 34.61 130.69 306051650 1155700792 cciss/c0d1 0.96 13.32 19.75 117780303 174676304 cciss/c0d1p1 2.67 13.32 19.75 117780007 174676288 sda 0.00 0.00 0.00 184 0 sdb 1.03 5.94 18.84 52490104 166623534 sdc 0.00 0.00 0.00 184 0 sdd 1.74 38.19 11.49 337697496 101649200 sde 0.00 0.00 0.00 184 0 sdf 1.51 34.90 6.80 308638992 60159368 sdg 0.00 0.00 0.00 184 0 ... and so on ...
输出的开始部分显示了可用 CPU 和 I/O 等待时间等指标,与您在 mpstat 命令中看到的相同。
输出的下一部分显示对系统上每个磁盘设备非常重要的指标。让我们看一看这些列的含义:
Device | 设备名称 |
tps | 每秒的传输数量,例如,每秒的 I/O 操作数。注:这只是 I/O 操作的数量;每个操作可能非常大,也可能非常小。 |
Blk_read/s | 每秒从该设备读取的块数。通常,块的大小为 512 字节。这是一个磁盘利用率较好的值。 |
Blk_wrtn/s | 每秒写入该设备的块数 |
Blk_read | 到目前为止从该设备读取的块数。注意,这并不是正在发生的情况。很多块已经从该设备读取。可能现在什么也没有读取。观察一段时间,看是否有变化。 |
Blk_wrtn | 写入该设备的块数。 |
在一个拥有很多设备的系统中,输出可能需要通过屏幕多次滚动 — 这使得某些内容较难检查,尤其当您查找特定设备时更是如此。可以通过将该设备作为参数传递只获得特定设备的指标。
# iostat sdaj Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 avg-cpu: %user %nice %sys %iowait %idle 15.71 0.00 1.07 3.30 79.91 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sdaj 1.58 31.93 10.65 282355456 94172401
开始部分显示的 CPU 指标可能没什么用处。要取消在输出开始部分显示的与 CPU 有关的统计信息,使用 -d 选项。
可以将可选参数放在结尾处,让 iostat 以固定的时间间隔显示设备统计信息。要每隔 5 秒获取一次该设备的统计信息,共 10 次,执行以下命令:
# iostat -d sdaj 5 10 You can display the stats in kilobytes instead of just bytes using the -k option: # iostat -k -d sdaj Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sdaj 1.58 15.96 5.32 141176880 47085232
尽管以上输出可能非常有帮助,但很多信息并不容易显示。例如,磁盘问题的一个主要原因是磁盘服务时间,即,磁盘将数据送达请求该数据的进程的时间。要获得该级别的指标,我们需要使用 -x 选项获得磁盘的“扩展”统计信息。
# iostat -x sdaj Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 avg-cpu: %user %nice %sys %iowait %idle 15.71 0.00 1.07 3.30 79.91 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sdaj 0.00 0.00 1.07 0.51 31.93 10.65 15.96 5.32 27.01 0.01 6.26 6.00 0.95
让我们看一看这些列的含义:
Device | 设备名称 |
rrqm/s | 每秒合并的读请求数。磁盘请求排成队列。只要可能,内核就会尝试将多个请求合并成一个请求。该指标测量读取传输的合并请求数。 |
wrqm/s | 与读取类似,这是合并的写请求数。 |
r/s | 每秒向该设备发出的读请求数 |
w/s | 同样,它是每秒向该设备发出的写请求数 |
rsec/s | 每秒从该设备读取的扇区数 |
wsec/s | 每秒写入该设备的扇区数 |
rkB/s | 每秒从该设备读取的数据,以 KB/秒为单位 |
wkB/s | 写入该设备的数据,以 kb/s 为单位 |
avgrq-sz | 读请求的平均大小(扇区数) |
avgqu-sz | 该设备的请求队列的平均长度 |
await | 设备发出 I/O 请求经过的平均时间,以毫秒为单位。这是服务时间与队列中的等待时间的总和。 |
svctm | 设备的平均服务时间,以毫秒为单位 |
%util | 设备的带宽利用率。如果该值接近于 100%,则表明该设备已饱和。 |
它包含大量信息,如何有效地使用这些信息是一个挑战。下一部分介绍如何使用输出。
用法
可以使用这些命令的组合从输出中获取一些有意义的信息。记住,在从进程获取请求时磁盘速度可能很慢。磁盘中的数据到达队列所花费的时间称为服务时间。如果您想找出服务时间最长的磁盘,执行以下命令:
# iostat -x | sort -nrk13 sdat 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 18.80 0.00 64.06 64.05 0.00 sdv 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17.16 0.00 18.03 17.64 0.00 sdak 0.00 0.00 0.00 0.14 0.00 1.11 0.00 0.55 8.02 0.00 17.00 17.00 0.24 sdm 0.00 0.00 0.00 0.19 0.01 1.52 0.01 0.76 8.06 0.00 16.78 16.78 0.32 ... and so on ...
这表明磁盘 sdat 的服务时间最长(64.05 毫秒)。为什么时间这么长呢?可能性很多,但最可能的原因有三个:
- 该磁盘获取了大量请求,以至于平均服务时间长。
- 该磁盘利用已移到可能的最大带宽。
- 该磁盘原本速度就很慢。
查看输出,我们看到读取数/秒和写入数/秒为 0.00(几乎没有发生任何事件),因此我们可以排除第一种可能性。利用率也为 0.00%(最后一列),因此我们可以排除第二种可能性。这就剩下了第三种可能性。但得出该磁盘原本速度慢的结论之前,我们需要更加仔细地观察该磁盘。我们可以只检查该磁盘,每隔 5 秒 检查一次,共 10 次。
# iostat -x sdat 5 10
如果输出显示相同的平均服务时间、读取速率和利用率,则可以断定最有可能是第三种情况。如果这些数值发生了变化,我们可以获取更详细的线索来了解该设备服务时间较长的原因。
同样,可以对读取速率列进行排序,以显示处于恒定读取速率下的磁盘。
# iostat -x | sort -nrk6 sdj 0.00 0.00 1.86 0.61 56.78 12.80 28.39 6.40 28.22 0.03 10.69 9.99 2.46 sdah 0.00 0.00 1.66 0.52 50.54 10.94 25.27 5.47 28.17 0.02 10.69 10.00 2.18 sdd 0.00 0.00 1.26 0.48 38.18 11.49 19.09 5.75 28.48 0.01 3.57 3.52 0.61 ... and so on ...
该信息可以帮助您查找“热”磁盘,即进行很多读取或写入的磁盘。如果该磁盘的确“热”,则应确定“热”的原因;可能是该磁盘上定义的某个文件系统正在进行大量读取操作。如果是这种情况,则应考虑将该文件系统在多个磁盘之间进行条带化,以分发负载,从而最大程度地减小某个特定磁盘“热”的可能性。
sar
通过前面的讨论,我们发现:获取实时指标并不是唯一重要的事情;历史趋势也同等重要。
此外,考虑这样一种情况:有人多次报告某个性能问题,但当您进行调查时发现一切都回归正常。如果没有当时的任何具体数据,则很难诊断过去出现的性能问题。最后,您将希望检查过去几天的性能数据,以决定某些设置或进行调整。
sar 实用程序实现了这个目标。sar 代表 System Activity Recorder,它在一个特殊的位置(/var/log/sa 目录)记录 Linux 系统的主要组件(CPU、内存、磁盘、网络等)的指标。每天的数据记录在一个名为 sa<nn> 的文件中,其中 <nn> 是每月中的第 nn 天(两位数字)。例如,文件 sa27 包含该月第 27 日的数据。可以通过 sar 命令查询该数据。
使用 sar 的最简单方法是不带任何参数或选项。示例如下:
# sar Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 12:00:01 AM CPU %user %nice %system %iowait %idle 12:10:01 AM all 14.99 0.00 1.27 2.85 80.89 12:20:01 AM all 14.97 0.00 1.20 2.70 81.13 12:30:01 AM all 15.80 0.00 1.39 3.00 79.81 12:40:01 AM all 10.26 0.00 1.25 3.55 84.93 ... and so on ...
输出显示在 10 分钟的间隔内收集的与 CPU 有关的指标。这些列的含义如下:
CPU | CPU 标识符;“all”表示所有 CPU |
%user | 用户进程使用的 CPU 百分比。Oracle 进程属于这一类。 |
%nice | 在 nice 优先级下执行的 CPU 利用率百分比 |
%system | 执行系统进程的 CPU 百分比 |
%iowait | 等待进行 I/O 操作的 CPU 百分比 |
%idle | 等待工作的 CPU 空闲百分比 |
从以上输出,您可能以为系统已经得到了很好的平衡;但实际上是严重利用不足(从较高的空闲百分比可以看出)。进一步查看输出,我们看到以下内容:
... continued from above ... 03:00:01 AM CPU %user %nice %system %iowait %idle 03:10:01 AM all 44.99 0.00 1.27 2.85 40.89 03:20:01 AM all 44.97 0.00 1.20 2.70 41.13 03:30:01 AM all 45.80 0.00 1.39 3.00 39.81 03:40:01 AM all 40.26 0.00 1.25 3.55 44.93 ... and so on ...
这告诉我们另外一回事:在 3:00 和 3:40 之间某些用户进程加载了该系统。可能是在执行开销比较大的查询,也可能是正在运行某个 RMAN 作业,从而消耗了这么多 CPU。这就是 sar 命令非常有用之处,该命令重放记录的数据,显示从某个特定时间起而不是现在的数据。这样您就完全实现了在该部分开头所述的三个目标:获取历史数据、查找使用模式以及了解趋势。
如果您想查看特定日期的 sar 数据,只需使用下面所示的 -f 选项打开具有该文件名的 sar(打开第 26 日的数据)
# sar -f /var/log/sa/sa26
与 vmstat 或 mpstat 一样,该命令还可以显示实时数据。要每隔 5 秒获取一次数据,共 10 次,请使用:
# sar 5 10
Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 01:39:16 PM CPU %user %nice %system %iowait %idle 01:39:21 PM all 20.32 0.00 0.18 1.00 78.50 01:39:26 PM all 23.28 0.00 0.20 0.45 76.08 01:39:31 PM all 29.45 0.00 0.27 1.45 68.83 01:39:36 PM all 16.32 0.00 0.20 1.55 81.93 … and so on 10 times …
您注意到 CPU 下的“all”值了吗?它意味着是所有 CPU 的总计统计信息。这比较适合单处理器系统,但在多处理器系统中,您可能希望获取各个 CPU 的统计信息以及总计统计信息。-P ALL 选项可以实现该目标。
#sar -P ALL 2 2 Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 01:45:12 PM CPU %user %nice %system %iowait %idle 01:45:14 PM all 22.31 0.00 10.19 0.69 66.81 01:45:14 PM 0 8.00 0.00 24.00 0.00 68.00 01:45:14 PM 1 99.00 0.00 1.00 0.00 0.00 01:45:14 PM 2 6.03 0.00 18.59 0.50 74.87 01:45:14 PM 3 3.50 0.00 8.50 0.00 88.00 01:45:14 PM 4 4.50 0.00 14.00 0.00 81.50 01:45:14 PM 5 54.50 0.00 6.00 0.00 39.50 01:45:14 PM 6 2.96 0.00 7.39 2.96 86.70 01:45:14 PM 7 0.50 0.00 2.00 2.00 95.50 01:45:14 PM CPU %user %nice %system %iowait %idle 01:45:16 PM all 18.98 0.00 7.05 0.19 73.78 01:45:16 PM 0 1.00 0.00 31.00 0.00 68.00 01:45:16 PM 1 37.00 0.00 5.50 0.00 57.50 01:45:16 PM 2 13.50 0.00 19.00 0.00 67.50 01:45:16 PM 3 0.00 0.00 0.00 0.00 100.00 01:45:16 PM 4 0.00 0.00 0.50 0.00 99.50 01:45:16 PM 5 99.00 0.00 1.00 0.00 0.00 01:45:16 PM 6 0.50 0.00 0.00 0.00 99.50 01:45:16 PM 7 0.00 0.00 0.00 1.49 98.51 Average: CPU %user %nice %system %iowait %idle Average: all 20.64 0.00 8.62 0.44 70.30 Average: 0 4.50 0.00 27.50 0.00 68.00 Average: 1 68.00 0.00 3.25 0.00 28.75 Average: 2 9.77 0.00 18.80 0.25 71.18 Average: 3 1.75 0.00 4.25 0.00 94.00 Average: 4 2.25 0.00 7.25 0.00 90.50 Average: 5 76.81 0.00 3.49 0.00 19.70 Average: 6 1.74 0.00 3.73 1.49 93.03 Average: 7 0.25 0.00 1.00 1.75 97.01
这表示 CPU 标识符(以 0 开头)以及每个 CPU 的统计信息。在输出的结尾处,您将看到每个 CPU 的平均运行情况。
命令 sar 不仅用于获取与 CPU 有关的统计信息。对于获取与内存有关的统计信息也非常有用。-r 选项显示大量利用内存的情况。
# sar -r Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 12:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad 12:10:01 AM 712264 32178920 97.83 2923884 25430452 16681300 95908 0.57 380 12:20:01 AM 659088 32232096 98.00 2923884 25430968 16681300 95908 0.57 380 12:30:01 AM 651416 32239768 98.02 2923920 25431448 16681300 95908 0.57 380 12:40:01 AM 651840 32239344 98.02 2923920 25430416 16681300 95908 0.57 380 12:50:01 AM 700696 32190488 97.87 2923920 25430416 16681300 95908 0.57 380
让我们看一看每个列的含义:
kbmemfree | 此时可用内存的数量,以 KB 为单位 |
kbmemused | 此时已使用的内存数量,以 KB 为单位 |
%memused | 已使用内存的百分比 |
kbbuffers | 用作缓冲区的内存百分比 |
kbcached | 用作缓存的内存百分比 |
kbswpfree | 此时可用交换区空间的大小,以 KB 为单位 |
kbswpused | 此时已使用的交换空间大小,以 KB 为单位 |
%swpused | 此时已使用交换区的百分比 |
kbswpcad | 此时缓存的交换区大小,以 KB 为单位 |
在输出的结尾处,您将看到该时间段内的平均数字。
还可以获取与特定内存有关的统计信息。-B 选项显示与分页有关的活动。
# sar -B Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 12:00:01 AM pgpgin/s pgpgout/s fault/s majflt/s 12:10:01 AM 134.43 256.63 8716.33 0.00 12:20:01 AM 122.05 181.48 8652.17 0.00 12:30:01 AM 129.05 253.53 8347.93 0.00 ... and so on ...
该列显示当时 而不是现在的指标。
pgpgin/s | 每秒从磁盘分到内存中的页面数 |
pgpgout/s | 每秒从内存分到磁盘的页面数 |
fault/s | 每秒的页面故障数 |
majflt/s | 每秒的主要页面故障数 |
要获得与交换有关活动的类似输出,可以使用 -W 选项。
# sar -W Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 12:00:01 AM pswpin/s pswpout/s 12:10:01 AM 0.00 0.00 12:20:01 AM 0.00 0.00 12:30:01 AM 0.00 0.00 12:40:01 AM 0.00 0.00 ... and so on ...
尽管这些列可能无需加以说明,下面还是提供了每列的说明:
pswpin/s | 每秒从磁盘交换回内存的内存页数 |
pswpout/s | 每秒从内存交换到磁盘的内存页数 |
如果您看到交换很多,则表示可能有内存不足问题。这不是定论,而是出现问题的可能性比较大。
要获得磁盘设备的统计,请使用 -d 选项:
# sar -d Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008 12:00:01 AM DEV tps rd_sec/s wr_sec/s 12:10:01 AM dev1-0 0.00 0.00 0.00 12:10:01 AM dev1-1 5.12 0.00 219.61 12:10:01 AM dev1-2 3.04 42.47 22.20 12:10:01 AM dev1-3 0.18 1.68 1.41 12:10:01 AM dev1-4 1.67 18.94 15.19 ... and so on ... Average: dev8-48 4.48 100.64 22.15 Average: dev8-64 0.00 0.00 0.00 Average: dev8-80 2.00 47.82 5.37 Average: dev8-96 0.00 0.00 0.00 Average: dev8-112 2.22 49.22 12.08
下面是对各列的说明。同样,它们也表示当时的指标。
tps | 每秒进行的传输数。传输数就是 I/O 操作数。注:这只是操作数量,每个操作可能很大,也可能很小。因此,单独这个并不能说明全部问题。 |
rd_sec/s | 每秒从磁盘读取的扇区数 |
wr_sec/s | 每秒写入磁盘的扇区数 |
要获得历史网络统计信息,使用 -n 选项:
# sar -n DEV | more Linux 2.6.9-42.0.3.ELlargesmp (prolin3) 12/27/2008 12:00:01 AM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s 12:10:01 AM lo 4.54 4.54 782.08 782.08 0.00 0.00 0.00 12:10:01 AM eth0 2.70 0.00 243.24 0.00 0.00 0.00 0.99 12:10:01 AM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:10:01 AM eth2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:10:01 AM eth3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:10:01 AM eth4 143.79 141.14 73032.72 38273.59 0.00 0.00 0.99 12:10:01 AM eth5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:10:01 AM eth6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:10:01 AM eth7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:10:01 AM bond0 146.49 141.14 73275.96 38273.59 0.00 0.00 1.98 … and so on … Average: bond0 128.73 121.81 85529.98 27838.44 0.00 0.00 1.98 Average: eth8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: eth9 3.52 6.74 251.63 10179.83 0.00 0.00 0.00 Average: sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
总而言之,使用 sar 命令的这些选项可以获得组件的指标:
使用该选项 … | … 获得有关以下组件的统计信息: |
-P | 特定 CPU |
-d | 磁盘 |
-r | 内存 |
-B | 分页 |
-W | 交换 |
-n | 网络 |
是否希望在一个输出中获得所有可用的统计信息?不必使用所有这些选项调用 sar,您可以改用 -A 选项,该选项显示存储在 sar 文件中的所有统计信息。
结论
总之,使用这些有限的命令集,可以处理与 Linux 环境中的资源管理有关的大多数任务。建议在您的环境中练习这些方法,以使您自己熟悉这些命令以及此处所述的选项。
在接下来的部分中,您将了解如何监视和管理网络。还将了解帮助您管理 Linux 环境的各种命令:发现谁已经登录、设置 shell 配置文件、使用 cpio 和 tar 进行备份等等。
深入阅读
Arup Nanda (arup@proligence.com) 担任专职 Oracle DBA 已逾 12 年,他拥有 Oracle 数据库技术各个领域的经验,2003 年被 Oracle 杂志授予“年度 DBA”称号。Arup 经常在 Oracle 相关的活动中发表演讲并为 Oracle 相关刊物撰写文章,他还是一位 Oracle ACE 总监。他与其他人合作编写了四本书,其中包括《RMAN Recipes for Oracle Database 11g:A Problem Solution Approach》。
原文:http://www.oracle.com/technology/global/cn/pub/articles/advanced-linux-commands/part3.html