linux常用系统性能监控工具[转](2)-vmstat,mpstat,iostat
首页 > IT > Unix/Linux   作者:eehello  2014年7月29日 0:23 星期二  浏览:5053  字号:   评论:0 条
时间:2014-7-29 0:23   浏览:5053  评论:0 条 

vmstat

vmstat 是最早用于显示所有与内存和进程相关信息的命令,调用时,该命令会持续运行并发布其信息。它有两个参数:

# vmstat  

是两次运行之间的时间间隔,以秒为单位。 是 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 ...

该信息可以帮助您查找“热”磁盘,即进行很多读取或写入的磁盘。如果该磁盘的确“热”,则应确定“热”的原因;可能是该磁盘上定义的某个文件系统正在进行大量读取操作。如果是这种情况,则应考虑将该文件系统在多个磁盘之间进行条带化,以分发负载,从而最大程度地减小某个特定磁盘“热”的可能性。


 您阅读这篇文章共花了: 
二维码加载中...
本文作者:eehello      文章标题: linux常用系统性能监控工具[转](2)-vmstat,mpstat,iostat
本文地址:https://www.eehello.com/?post=109
版权声明:若无注明,本文皆为“点滴记忆---观雨亭”原创,转载请保留文章出处。

返回顶部| 首页| 手气不错| 留言板|后花园

Copyright © 2014-2023 点滴记忆---观雨亭