zoukankan      html  css  js  c++  java
  • Linux性能监控

    Linux性能监控的目的是找到系统的瓶颈,并且调节系统来设法消除这些瓶颈。我们在监控性能的时候重点在于监视一下子系统: 1.CPU 2.MEMORY 3.IO 4.NETWORK

    但这些系统都是彼此依赖,不能单独只看其中一个。当一个系统负载过重时往往会引起其它子系统的问题,比如说:       ->大量的读入内存的IO请求(page-in IO)会用完内存队列;        ->大量的网络流量会造成CPU的过载;        ->CPU的高使用率可能正在处理空闲内存队列;        ->大量的磁盘读写会消耗CPU和IO资源。

    我们测试的系统,总的来说可分为二类: 第一,IO Bound,这类系统会大量消耗内存和底层的存储系统,它并不消耗过多的CPU和网络资源(除非系统是网络的)。IO bound系统消耗CPU资源用来接受IO请求,然后会进入休眠状态。数据库通常被认为是IO bound系统。 第二,CPU Bound,这类系统需要消耗大量的CPU资源。他们往往进行大量的数学计算。高吞吐量的Web server,Mail Server通常被认为是CPU Bound系统。

    在性能测试中首先要做的是建立基线(Baseline),这样后续的调整才会有一个参考标准。值得注意的是,在测试基线的时候,一定要保证系统工作在正常的状态下。

    CPU

    常用的监视工具有:mpstat,vmstat,top。

    1.mpstat

    mpstat是 Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不 但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。下面只介绍 mpstat与CPU相关的参数,mpstat的语法如下:

                                            mpstat [-P {cpu|ALL}] [internal [count]]

    参数的含义如下:

    参数解释
    -P {cpu | ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
    internal 相邻的两次采样的间隔时间
    count 采样的次数,count只能和delay一起使用

    当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。与CPU有关的输出的含义如下:

    参数解释从/proc/stat获得数据
    CPU 处理器ID
    user 在internal时间段里,用户态的CPU时间(%),不包含 nice值为负进程 usr/total*100
    nice 在internal时间段里,nice值为负进程的CPU时间(%) nice/total*100
    system 在internal时间段里,核心时间(%) system/total*100
    iowait 在internal时间段里,硬盘IO等待时间(%) iowait/total*100
    irq 在internal时间段里,软中断时间(%) irq/total*100
    soft 在internal时间段里,软中断时间(%) softirq/total*100
    idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 (%) idle/total*100
    intr/s 在internal时间段里,每秒CPU接收的中断的次数 intr/total*100

    CPU总的工作时间:total_cur = user + system + nice + idle + iowait + irq + softirq

    total_pre = pre_user + pre_system + pre_nice + pre_idle + pre_iowait + pre_irq + pre_softirq

    user = user_cur – user_pre

    total = total_cur - total_pre

    其中_cur 表示当前值,_pre表示interval时间前的值。上表中的所有值可取到两位小数点。

    范例1 average mode (粗略信息)

    当mpstat不带参数时,输出为从系统启动以来的平均值。

    [work@jx-testing-ps1933.jx.baidu.com ~]$ mpstat Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com)       07/30/2008 10:06:32 AM  CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s 10:06:32 AM  all          0.71    0.00          0.19       0.01    0.00    0.04   99.05    271.64

    范例2 每2秒产生了4个处理器的统计数据报告

    下面的命令可以每2秒产生了4个处理器的统计数据报告,一共产生三个interval 的信息,然后再给出这三个interval的平均信息。默认时,输出是按照CPU 号排序。第一个行给出了从系统引导以来的所有活跃数据。接下来每行对应一个处理器的活跃状态。

    [work@jx-testing-ps1933.jx.baidu.com ~]$ mpstat -P ALL 2 3 Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com)       07/30/2008
    10:11:04 AM  CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s 10:11:06 AM     all     0.00       0.00      0.00       0.00      0.00     0.00   100.00   1013.13 10:11:06 AM       0    0.00       0.00      0.00       0.00      0.00     0.00   100.00    253.54 10:11:06 AM       1    0.00       0.00      0.00       0.00      0.00     0.00   100.00    252.53 10:11:06 AM       2    0.00       0.00      0.00       0.00      0.00     0.00   100.00    254.55 10:11:06 AM       3    0.00       0.00      0.00       0.00      0.00     0.00   100.00    252.53
    10:11:06 AM  CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s 10:11:08 AM     all      0.00      0.00      0.00       0.00      0.00    0.00    100.00   1015.15 10:11:08 AM       0      0.00      0.00      0.00       0.00      0.00    0.00    100.00    252.53 10:11:08 AM       1      0.00      0.00      0.00       0.00      0.00    0.00    100.00    253.03 10:11:08 AM       2      0.00      0.00      0.00       0.00      0.00    0.00     99.49    257.58 10:11:08 AM       3      0.00      0.00      0.00       0.00      0.00    0.00    100.00    252.53
    10:11:08 AM  CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s 10:11:10 AM     all      0.00      0.00       0.00       0.00      0.00    0.00  100.00   1016.16 10:11:10 AM       0      0.00      0.00      0.00       0.00      0.00    0.00  100.00    252.53 10:11:10 AM       1      0.00      0.00      0.00       0.00      0.00    0.00  100.00    252.53 10:11:10 AM       2      0.00      0.00      0.00       0.00      0.00    0.00  100.00    258.08 10:11:10 AM       3      0.00      0.00      0.00       0.00      0.00    0.00  100.00    252.53
    Average:     CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s Average:        all       0.00      0.00      0.00       0.00      0.00    0.00  100.00   1014.81 Average:          0       0.00      0.00      0.00       0.00     0.00    0.00  100.00    252.86 Average:          1       0.00      0.00      0.00       0.00     0.00    0.00  100.00    252.69 Average:          2       0.00      0.00      0.00       0.00     0.00    0.00   99.83    256.73 Average:          3       0.00      0.00      0.00      0.00      0.00    0.00  100.00    252.53

    2.vmstat

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写, 是实时系统监控工具。该命令通过使用knlist子程序和/dev/kmen伪设备驱动器访问这些数据,输出信息直接打印在屏幕。vmstat反馈的与CPU相关的信息包括: (1)多少任务在运行 (2)CPU使用的情况 (3)CPU收到多少中断 (4)发生多少上下文切换

    下面只介绍 Vmstat与CPU相关的参数

    vmstat的语法如下:

      vmstat [delay [count]]

    参数的含义如下:

    参数解释
    delay 相邻的两次采样的间隔时间
    count 采样的次数,count只能和delay一起使用

    当没有参数时,vmstat则显示系统启动以后所有信息的平均值。有delay时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个delay时间段的平均信息。当系统有多个CPU时,输出为所有CPU的平均值。

    参数解释从/proc/stat获得数据
    r 在internal时间段里,运行队列里等待CPU的任务(任务)的个数,即不包含vmstat进程 procs_running-1
    b 在internal时间段里,被资源阻塞的任务数(I/0,页面调度,等等.)通常情况下是接近0的 procs_blocked
    us 在internal时间段里,用户态的CPU时间(%),包含 nice值为负进程 (user+nice)/total*100
    sy 在internal时间段里,核心态的CPU时间(%) (system+irq+softirq)/total*100
    id 在internal时间段里,cpu空闲的时间,不包括等待i/o的时间(%) idle/total*100
    wa 在internal时间段里,等待i/o的时间(%) iowait/total*100
    in 在internal时间段里,每秒发生中断的次数 intr/interval
    cs 在internal时间段里,每秒上下文切换的次数,即每秒内核任务交换的次数 ctxt/interval

    total_cur = user + system + nice + idle + iowait + irq + softirq

    total_pre = pre_user + pre_system + pre_nice + pre_idle + pre_iowait + pre_irq + pre_softirq

    total = total_cur - total_pre

    3.iostat

    iostat [-t] [-c] [interval [count]]

    参数的含义如下:

    参数解释
    T 表示输出采用的时间
    C 表示只显示CPU的信息
    Internal 相邻的两次采样的间隔时间
    count 采样的次数,count只能和delay一起使用

    当没有参数时,iostat则显示系统启动以后所有信息的平均值。与CPU有关的输出的含义

    参数解释从/proc/stat获得
    CPU 处理器ID
    user 在internal时间段里,用户态的CPU时间(%) ,不包含 nice值为负进程 usr/total*100
    nice 在internal时间段里,nice值为负进程的CPU时间(%) nice/total*100
    sys 在internal时间段里,核心时间(%) (system+irq+softirq)/total*100
    iowait 在internal时间段里,硬盘IO等待时间(%) iowait/total*100
    idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 (%) idle/total*100

    total_cur = user + system + nice + idle + iowait + irq + softirq

    total_pre = pre_user + pre_system + pre_nice + pre_idle + pre_iowait + pre_irq + pre_softirq

    total = total_cur - total_pre

    有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。

    示例1

    [work@jx-testing-ps1933.jx.baidu.com ~]$ iostat -c 1 Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com)       07/30/2008
    avg-cpu:  %user   %nice    %sys %iowait   %idle                   0.71    0.00       0.22    0.01     99.05
    avg-cpu:  %user   %nice    %sys %iowait   %idle                   0.00    0.00       0.00    0.00    100.00
    avg-cpu:  %user   %nice    %sys %iowait   %idle                  0.00    0.00        0.00    0.00    100.00

    4.sar

    sar是System Activity Reporter(系统活跃情况报告)的缩写。顾名思义,sar工具将对系统当前的状态进行采样,然后通过计算数据和比例来表达系统的当前运行状态。它的 特点是可以连续对系统采样,获得大量的采样数据;采样数据和分析的结果都可以存入文件,所需的负载很小。这些是检查历史数据和一些近来的系统事件。sar 用于检查的性能数据类似于vmstat, mpstat和 iostat的显示。 sar的数据是一段时间保存的内容,因此可以察看过去的信息。 lastcomm可以现在系统最近被执行的命令。这些可以用在系统审计中。sar可以在*BSD和Linux中找到,它给用户在系统审计中更多的选项来收 集信息。

    在反馈CPU整体信息方面,sar 反馈的与CPU相关的信息包括: (1)多少任务在运行 (2)CPU使用的情况 (3)CPU收到多少中断 (4)发生多少上下文切换

    sar的语法如下:

    sar [-options] [interval [count]]

    其中,internal是两次采样的间隔时间;count是指采样的次数;与CPU相关的options有:

    参数的含义如下:

    参数解释
    -c 表示输出采用的时间
    -e hh:mm:ss 表示只显示CPU的信息
    -i {irq | SUM | ALL | XALL} 相邻的两次采样的间隔时间
    -P {cpu | ALL}
    -q 显示在采样的时刻,可运行队列的任务的个数,以及系统平均负载
    -u CPU 使用的情况,报告了cpu的用户态,系统态,等待I/O和空闲时间上的百分比。
    -w 每秒上下文交换率
    -o filename 将结果放在文件里
    -f filename 表示从file文件中取出数据,如果没有指定-f file,则从标准数据文件

    范例

    首先在后台运行一个创建2GB文件的任务,然后输入:“sar -c -q -w 3 2”,表示每3秒采样一次,采样两次,可以看到系统有58个任务,但是在10时47分01秒时有一个任务在运行,在下一次采样10时47分04秒时,没有任务在运行。

    [work@jx-testing-ps1933.jx.baidu.com ~]$ dd if=/dev/zero of=./1.img bs=2048 count=1000000&     [1] 22332 [work@jx-testing-ps1933.jx.baidu.com ~]$ sar -c -q -w -I SUM 3 2                           Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com)       07/30/2008 1000000+0 records in 1000000+0 records out
    10:46:58 AM    proc/s 10:47:01 AM      0.00
    10:46:58 AM   cswch/s 10:47:01 AM    166.44
    10:46:58 AM      INTR    intr/s 10:47:01 AM       sum   1172.15
    10:46:58 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15 10:47:01 AM         1        58      0.04      0.01      0.00
    10:47:01 AM    proc/s 10:47:04 AM      0.00
    10:47:01 AM   cswch/s 10:47:04 AM     57.91
    10:47:01 AM      INTR    intr/s 10:47:04 AM       sum   1142.09
    10:47:01 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15 10:47:04 AM         0        58      0.11      0.03      0.01
    Average:       proc/s Average:         0.00
    Average:      cswch/s Average:       112.27
    Average:         INTR    intr/s Average:          sum   1157.14
    Average:      runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15 Average:            0        58      0.07      0.02      0.01

    与CPU有关的输出的含义

    参数解释从/proc/stat和/proc/loadavg获得数据
    proc/s 在internal时间段里,每秒上下文切换率 processes/total*100
    cswch 在internal时间段里,每秒上下文切换率 ctxt/total*100
    intr/s 在internal时间段里,每秒CPU接收的中断的次数 idle/total*100
    runq-sz 采样时,运行队列中任务的个数,不包括vmstat 进程。 procs_running-1
    plist-sz 采样时,系统中活跃的任务的个数 nr_threads
    ldavg-1 采样的前一秒钟系统的负载(%) lavg_1
    ldavg-5 采样的5秒钟系统的负载(%) lavg_5
    ldavg-15 采样的前15秒钟系统的负载(%) lavg_15

    下面输入命令“sar 3 2”,表示每隔3秒显示CPU的状态,共显示2次。此时创建2GB文件的任务还在后台进行。

    [work@jx-testing-ps1933.jx.baidu.com ~]$ sar 3 2 Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com)       07/30/2008 1000000+0 records in 1000000+0 records out
    10:59:22 AM       CPU     %user     %nice   %system   %iowait     %idle 10:59:25 AM           all      0.76        0.00        18.01       29.46       51.77 10:59:28 AM           all      0.00        0.00         1.69       19.81        78.50 Average:                 all      0.38        0.00         9.86       24.64        65.12

    与CPU有关的输出的含义

    参数解释从/proc/stat获得数据
    CPU 处理器ID
    user 在internal时间段里,用户态的CPU时间(%) ,不包含 nice值为负进程 usr/total*100
    nice 在internal时间段里,nice值为负进程的CPU时间(%) nice/total*100
    sys 在internal时间段里,核心时间(%) (system+irq+softirq)/total*100
    iowait 在internal时间段里,硬盘IO等待时间(%) iowait/total*100
    idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 (%) irq/total*100

    MEMORY

    首先说说虚拟内存和物理内存:

    虚拟内存就是采用硬盘来对物理内存进行扩展,将暂时不用的内存页写到硬盘上而腾出更多的物理内存让有需要的进程来用。当这些内存页需要用的时候在从 硬盘读回内存。这一切对于用户来说是透明的。通常在Linux系统说,虚拟内存就是swap分区。在X86系统上虚拟内存被分为大小为4K的页。

    每一个进程启动时都会向系统申请虚拟内存(VSZ),内核同意或者拒就请求。当程序真正用到内存时,系统就它映射到物理内存。RSS表示程序所占的物理内存的大小。用ps命令我们可以看到进程占用的VSZ和RSS。

    [work@jx-testing-ps1933.jx.baidu.com ~]$ ps -aux USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND root         1  0.0  0.0  4752  544 ?        S     2007   0:01 init [3]                                  root         2  0.0  0.0     0    0 ?        S     2007   0:22 [migration/0] root         3  0.0  0.0     0    0 ?        SN    2007   0:00 [ksoftirqd/0] root         4  0.0  0.0     0    0 ?        S     2007   0:20 [migration/1] root         5  0.0  0.0     0    0 ?        SN    2007   0:00 [ksoftirqd/1] root         6  0.0  0.0     0    0 ?        S     2007   0:18 [migration/2] root         7  0.0  0.0     0    0 ?        SN    2007   0:00 [ksoftirqd/2] root         8  0.0  0.0     0    0 ?        S     2007   0:12 [migration/3] root         9  0.0  0.0     0    0 ?        SN    2007   0:00 [ksoftirqd/3]

    在命令行使用“Free”命令可以监控内存使用情况

    [work@tc-testing-ps5006.tc.baidu.com ~]$ free              total       used       free     shared    buffers     cached Mem:       8165816    8145048      20768          0      22920    5840236 -/+ buffers/cache:    2281892    5883924 Swap:      1024056       2316    1021740

    输出的含义

    参数解释
    Mem 物理内存
    total 不显示核心使用的物理内存(通常大约1MB)
    used 被使用的内存总额(第二行不计缓冲)
    free 全部没使用的内存
    Shared 多个进程共享的内存总额
    Buffers 显示磁盘缓存的当前大小
    Swap 对对换空间,显示的信息类似上面。如果这行为全0,那么没使用对换空间

    在缺省的状态下,free命令以千字节(也就是1024字节为单位)来显示内存使用情况。可以使用—h参数以字节为单位显示内存使用情况,或者可以使用—m参数以兆字节为单位显示内存使用情况。还可以通过—s参数使用命令来不间断地监视内存使用情况。

    使甩vmstat命令监视虚拟内存使用情况

    [work@jx-testing-ps1933.jx.baidu.com ~]$ ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 4752 544 ? S 2007 0:01 init [3]  root 2 0.0 0.0 0 0 ? S 2007 0:22 [migration/0] root 3 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/0] root 4 0.0 0.0 0 0 ? S 2007 0:20 [migration/1] root 5 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/1] root 6 0.0 0.0 0 0 ? S 2007 0:18 [migration/2] root 7 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/2] root 8 0.0 0.0 0 0 ? S 2007 0:12 [migration/3] root 9 0.0 0.0 0 0 ? SN 2007 0:00 [ksoftirqd/3]

    与内存和IO相关的参数含义

    参数解释
    swpd 现时可用的交换内存(单位KB)
    free 空闲的内存(单位KB)
    buff 缓冲去中的内存数(单位:KB)
    cache 被用来做为高速缓存的内存数(单位:KB)
    si 从磁盘交换到内存的交换页数量,单位:KB/秒
    so 从内存交换到磁盘的交换页数量,单位:KB/秒
    bi 发送到块设备的块数,单位:块/秒
    bo 从块设备接收到的块数,单位:块/秒

    IO

    监控IO的常用命令为iostat

    [work@jx-testing-ps1933.jx.baidu.com ~]$ iostat -x Linux 2.6.9-52bs (jx-testing-ps1933.jx.baidu.com)       07/30/2008
    avg-cpu:  %user   %nice    %sys %iowait   %idle            0.71    0.00    0.22    0.01   99.05
    Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util sda             0.01   0.26  0.40  1.01   50.25  152.31    25.12    76.15   144.46     0.02       12.24   0.65   0.09

    io相关的参数含义

    参数解释
    rrqm/s 每秒进行 merge 的读操作数目
    wrqm/s 每秒进行 merge 的写操作数目
    r/s 每秒完成的读 I/O 设备次数
    w/s 每秒完成的写 I/O 设备次数
    rsec/s 每秒读扇区数
    wsec/s 每秒写扇区数
    rkB/s 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节
    wkB/s 每秒写K字节数。是 wsect/s 的一半
    avgrq-sz 平均每次设备I/O操作的数据大小 (扇区)
    avgqu-sz 平均I/O队列长度
    await 平均每次设备I/O操作的等待时间 (毫秒)
    svctm 平均每次设备I/O操作的服务时间 (毫秒)
    %util 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的

    NETWORK

    网络是所有子系统中最难监控的了。首先是由于网络是抽象的,更重要的是许多影响网络的因素并不在我们的控制范围之内。这些因素包括,延迟、冲突、阻塞等等。

    由于网络监控中,需要查看许多设备的状态和参数,需要root权限才可以,所以就不在这里进行介绍了。

    转自:http://www.cnblogs.com/argb/p/3448647.html

  • 相关阅读:
    Centos常用命令之:文件与目录管理
    Centos常用命令之:ls和cd
    Centos6.9连接工具设置
    CentOS6.9安装
    mysql-5.7.18-winx64 免安装版配置
    Struts1开山篇
    参考用bat文件
    QT界面开发-c++ 如何在Qt中将QVariant转换为QString,反之亦然?【转载】
    QT界面开发-QAxObject 解析 excel 时报错error LNK2019: 无法解析的外部符号
    QT界面开发-QAxObject 读写excel(COM组件)
  • 原文地址:https://www.cnblogs.com/jasonteststudy/p/4008279.html
Copyright © 2011-2022 走看看