转自:http://blog.csdn.net/chosen0ne/article/details/8200737

linux性能监控,就是要监控系统的各个子系统是否正常。linux主要的子系统包括:CPU、Memory、IO和Network,它们之间相互依赖,一个出问题可能会影响其他的。比如:网卡流量很大会导致更多的CPU开销,因为频繁的响应中断执行协议栈。

性能监控时,首先要确定应用的类型,然后对症下药,可以将应用分成:
        CPU密集型:CPU开销很高,比如大量的CPU运算、科学计算等。通常web server属于这类。
        IO密集型:大量的磁盘读写,高负荷的内存使用。IO密集型不会对CPU发起更多的请求,它占用CPU只是为了产生IO请求然后sleep。通常数据库属于这一类型。

1. CPU

1. 上下文切换

上下文切换(Context Switch)是多任务操作系统的基石,每个进程都有自己的执行环境就是进程的上下文,这些上下文就是当前进程使用的寄存器,比如PC、栈指针%esp、帧指针%ebp等。每个处理器核心在任意时刻只能执行一个进程或线程,当线程的时间片用尽或者线程阻塞(比如线程执行磁盘io或网络io时),进程调度器会根据一定的规则(比如选择运行时间加权之后最少的)挑选一个线程占有处理器。因为CPU的寄存器集合只有一份,所有必须要保存上一个进程使用的寄存器,同时恢复被调度的进程的寄存器状态。

上下文切换时有损耗的。一般地,当系统中线程过多或者io负载过高时,上下文切换会比较频繁,此时CPU时间过多的消耗在上下文切换。

2. 运行队列

内核中的进程调度器维护着运行队列(run queue),而每个阻塞源维护着自己的阻塞队列(wait queue,比如一个文件描述符,正在读写该文件的进程会被阻塞在其阻塞队列上)。任意一个进程要么处于可执行状态,要么阻塞状态。所有的可执行状态的进程都处于运行队列,如果当前系统CPU负载很高,那么运行队列的长度很大,进程调度器就不会及时响应系统请求。当运行队列越来越大时,进程或线程将花费更多的时间来获取CPU时间。

  1. > cat /proc/loadavg
  2. 0.02 0.05 0.05 1/279 23903

上述命令可以显示系统负载,分别是:过去1分钟、5分钟、15分钟的系统负载、当前正在执行的进程数/系统的所有进程数、最后执行的进程的pid。top命令也可以现在系统负载。

3. vmstat

vmstat提供一种低开销的方式统计系统性能数据。

  1. >  vmstat 1 1
  2. procs -----------memory------------------- ---swap-- -----io---- -system-- ----cpu----
  3. r  b   swpd   free     buff    cache        si   so    bi    bo     in   cs     us sy id wa
  4. 0  0      0   1540304  497972  1631008      0    0     0    45      0    0       2  0 97  1

与CPU相关的各个列的意思:
        r:当前运行队列中的进程的数目,就是那些处于可执行状态,但是得不到CPU的进程。
        b:当前处于阻塞状态,并等待IO请求完成的进程的数目。
        in:当前处理的中断数目。
        cs:当前系统发生的上下文切换次数。
        us:CPU在用户空间执行的时间的百分比。
        sy:CPU在内核空间执行的时间的百分比。
        id:CPU空闲时间的百分比。
        wa:由于所有可运行进程等待IO请求完成被阻塞导致的CPU空闲时间的百分比。

4. pidstat

        pidstat用于查看进程所属的线程的CPU的使用情况。
  1. > pidstat -p 2036 -t 1 1
  2. Linux 2.6.32-5-xen-amd64 (vzw51173.puppetclient.163.com)        2012年10月12日  _x86_64_        (4 CPU)
  3. 16时09分17秒      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
  4. 16时09分18秒      2036         -    0.00    2.00    0.00    2.00     3  python
  5. 16时09分18秒         -      2036    0.00    0.00    0.00    0.00     3  |__python
  6. 16时09分18秒         -      2041    0.00    0.00    0.00    0.00     3  |__python
  7. 16时09分18秒         -      5639    0.00    0.00    0.00    0.00     2  |__python
  8. 16时09分18秒         -      5650    0.00    1.00    0.00    1.00     1  |__python
  9. 平均时间:      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
  10. 平均时间:      2036         -    0.00    2.00    0.00    2.00     -  python
  11. 平均时间:         -      2036    0.00    0.00    0.00    0.00     -  |__python
  12. 平均时间:         -      2041    0.00    0.00    0.00    0.00     -  |__python
  13. 平均时间:         -      5639    0.00    0.00    0.00    0.00     -  |__python
  14. 平均时间:         -      5650    0.00    1.00    0.00    1.00     -  |__python

Linux中是不区分进程和线程的,线程就是可以共享资源的进程。TID就是线程的PID,这里可以查看各个线程的CPU使用情况。

5. 总结

        vmstat     ->     top     ->     pidstat
        通过vmstat查看整体CPU使用情况,top查看CPU占用高的几个进程,pidstat查看这几个进程对应的线程。
        监控CPU性能包括以下几个部分:
       a. 检查CPU的run queue,每个CPU的run queue最好不要超过3个进程。
       b. 确定CPU利用率在usr/sys = 65% / 35% ~ 70% / 30%之间。
       c. 当CPU的处理时间更多的是在system空间,说明已经超负荷。
       d. 当I/O增多时,CPU密集型的应用将受到影响。
       e. 当CPU的IOWait占用比较大的比例时,说明IO出现异常。

2. Memory

1. 虚拟内存

虚拟内存就是在硬盘上划出一部分区域做为内存使用,当系统可用的内存低于某个值时,内核就会将当前不再活跃的内存块写入磁盘,然后这块内存可以作为其他用途使用。当cpu需要访问被写入磁盘的数据时,再把它读入到内存中。上述操作对用户来说是透明的,磁盘的读写是很慢的,比内存要慢几千万倍(磁盘10ms,内存100-200ns),所以要尽量把数据放在内存中,程序才会运行的更快。硬盘中用作替代内存的部分就是虚拟内存,成为swap space。

2. 页高速缓存

Linux内核通过页高速缓存来加快磁盘操作。当系统存在大量的空闲内存时,内核会把空闲内存的一部分做为页高速缓存。当某个磁盘块被缓存之后,对于这个磁盘块的读写就相当于内存操作。读操作时直接读对应的page,写操作时将内容写入对应的page,然后将该page标记为脏页,会有后台线程flush(linux 2.6内核)完成将脏页同步回磁盘。flush在脏页比例大于某个阈值,或者修改超过一定时间之后进行写回。

  1. > ps axu | grep flush
  2. root       927  0.0  0.0      0     0 ?        S    May23   2:34 [flush-202:2]
  3. root     14413  0.0  0.0  10200   856 pts/2    S+   16:53   0:00 grep flush

3. vmstat

        vmstat可以查看系统的内存相关信息。
  1. > vmstat 1
  2. procs -----------memory------------- ----swap----- -----io---- -system-- ----cpu----
  3. r  b   swpd   free     buff      cache     si   so    bi    bo   in    cs   us  sy id wa
  4. 0  0   6004  38264  99552 3741240    0    0     0     4    0      0    0  0 100  0
  5. 0  0   6004  37364  99552 3741244    0    0     0     0  1565  906  0  0 99  0

内存相关列的意思:
        swpd:当前使用的虚拟内存的总额(KB),当空闲内存达到更低的阈值时,更多的页会被交换到磁盘。
        free:当前内存中的空闲空间的大小(KB)。
        buff:当前内存中用于read和write操作的缓冲区的大小(KB)。
        cache:页高速缓存大小(KB)。
        si:从swap写回内存的大小(KB)。
        so:写入swap的大小(KB)。
        bi:从文件系统或交换设备读的磁盘块的大小(KB)。读磁盘。
        bo:从内存写入文件系统或交换设备的大小(KB)。写磁盘。

4. pidstat

查看进程的缺页情况。

  1. > pidstat -r -p 31679 1 1
  2. Linux 2.6.32-5-xen-amd64 (debian-org)   2012年10月12日  _x86_64_        (4 CPU)
  3. 17时10分02秒       PID      minflt/s  majflt/s     VSZ    RSS    %MEM  Command
  4. 17时10分03秒     31679   1292.00      0.00    871348 107852   2.58   node
  5. 平均时间:           31679   1292.00      0.00    871348 107852   2.58  node

各个列含义:
        minflt/s:进程平均每s造成的minor fault,这些错误不会导致从磁盘加载内存页。
        majflt/s:进程平均每s造成的major fault,这些错误会导致从磁盘加载内存页。
        VSZ:进程使用的所有虚拟内存的大小(KB)。
        RSS:进程使用的物理内存大小(KB)。
        %MEM:占用物理内存百分比。

5. sar

        a. 查看页统计信息
  1. > sar -B
  2. Linux 2.6.32-5-xen-amd64 (debian-org)   2012年11月17日  _x86_64_        (4 CPU)
  3. 00时00分01秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
  4. 00时05分01秒      0.00    200.84      364.65      0.00    538.94      0.00      0.00      0.00      0.00
  5. 00时15分01秒      0.00    184.84      353.72      0.00    396.33      0.00      0.00      0.00      0.00
  6. ……
  7. 09时45分01秒      0.00   1822.52    1175.53      0.00   9406.76      0.00      0.00      0.00      0.00
  8. 09时55分01秒      0.00   3401.99    1556.25      0.00  10269.71      0.00      0.00      0.00      0.00
  9. 平均时间:            0.00    319.68       429.48      0.00   1036.33      0.00      0.00      0.00      0.00

各个列的含义:
        pgpgin/s:每s从磁盘换入的页的大小(KB)
        pgpgout/s:每s换出到磁盘的页的大小(KB)
        fault/s:每s发生的缺页错误的次数,包括minor fault和major fault。
        majflt/s:每s发生的major fault的次数,major fault会导致从磁盘载入内存页(即使用了swap分区)。
        pgfree/s:每s放入空闲列表中的页的个数。
        pgscank/s:每s被kswapd后台进程扫描的页的个数。
        pgscand/s:每s直接被扫描的页的个数。
        pgsteal/s:为了满足内存要求,每s从cache(pagecache和swapcache)回收的页的个数。
        %vmeff:等于pgsteal  /  pgscan,用于计算页回收(page reclaim)的效率。
        

        b. 查看内存使用信息
  1. > sar -r
  2. Linux 2.6.32-5-xen-amd64 (debian-org)   2012年11月17日  _x86_64_        (4 CPU)
  3. 00时00分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
  4. 00时05分01秒   1636744   2551244             60.92    498112   1626600    180708      4.31
  5. 00时15分01秒   1634724   2553264             60.97    498112   1626628    181304      4.33
  6. ……
  7. 09时55分01秒   1555940   2632048             62.85    498128   1624716    200876      4.80
  8. 10时05分01秒   1548416   2639572             63.03    498128   1624760    206364      4.93
  9. 10时15分01秒   1545200   2642788             63.10    498128   1624804    212948      5.08
  10. 10时15分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
  11. 10时25分01秒   1542332   2645656     63.17    498128   1624852    211524      5.05
  12. 平均时间:     1624618   2563370     61.21    498118   1626298    183528      4.38

各个列的含义:
        kbmemfree:可用的空闲内存(KB)。
        kbmemused:使用的内存,不包括内核自己使用的内存(KB)。
        %memused:使用的内存的比例。
        kbbuffers:被内核用做缓冲区的内存(KB)。
        kbcached:被内核用来缓存数据的内存(KB)。
        kbcommit:对于当前的工作量需要的内存(KB),确定RAM/Swap的大小以防止out of memory。
        %commit:当前的工作量需要的内存和所有内存(RAM+Swap)的百分比。

        上面两种sar的使用方式可以查看从0点到现在的每分钟的统计信息,可以通过sar -B interval times以固定间隔时间interval秒统计times次数据,比如:
  1. sar -B 1 5
  2. Linux 2.6.32-5-xen-amd64 (debian-org)   2012年11月17日  _x86_64_        (4 CPU)
  3. 18时53分20秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
  4. 18时53分21秒      0.00      0.00     40.00      0.00    355.00      0.00      0.00      0.00      0.00
  5. 18时53分22秒      0.00      0.00     42.00      0.00    362.00      0.00      0.00      0.00      0.00
  6. 18时53分23秒      0.00      0.00     32.00      0.00    355.00      0.00      0.00      0.00      0.00
  7. 18时53分24秒      0.00   6584.00    104.00      0.00    414.00      0.00      0.00      0.00      0.00
  8. 18时53分25秒      0.00     28.00     66.00      0.00    427.00      0.00      0.00      0.00      0.00
  9. 平均时间:        0.00   1322.40     56.80      0.00    382.60      0.00      0.00      0.00      0.00

5. 总结

        a. 当系统出现较少的page fault,说明页命中率很高,会获得较好的响应时间。
        b. 在没有写入swap和disk的情况下,空闲内存越小,表明页高速缓存利用率越高。
        c. 如果系统不断报告swap device繁忙,那么说明系统内存不足。

Linux性能监控的更多相关文章

  1. Linux 性能监控之CPU&内存&I/O监控Shell脚本2

    Linux 性能监控之CPU&内存&I/O监控Shell脚本2   by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...

  2. Linux 性能监控之CPU&内存&I/O监控Shell脚本1

    Linux 性能监控之CPU&内存&I/O监控Shell脚本1   by:授客 QQ:1033553122   #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`if ...

  3. linux性能监控 -CPU、Memory、IO、Network等指标的讲解

    [操作系统-linux]linux性能监控 -CPU.Memory.IO.Network等指标的讲解(转) 一.CPU 1.良好状态指标 CPU利用率:User Time <= 70%,Syst ...

  4. Linux性能监控与分析之--- CPU

    Linux性能监控与分析之--- CPU 望月成三人关注 2016.07.25 18:16:12字数 1,576阅读 2,837 CPU性能指标 用户进程使用CPU的比率 系统进程使用CPU的比率 W ...

  5. Linux 性能监控、测试、优化工具

    Linux 平台上的性能工具有很多,眼花缭乱,长期的摸索和经验发现最好用的还是那些久经考验的.简单的小工具.系统性能专家 Brendan D. Gregg 在最近的 LinuxCon NA 2014 ...

  6. 三张图看遍Linux 性能监控、测试、优化工具

    Linux 平台上的性能工具有很多,眼花缭乱,长期的摸索和经验发现最好用的还是那些久经考验的.简单的小工具.系统性能专家 Brendan D. Gregg 在最近的 LinuxCon NA 2014 ...

  7. Linux 性能监控的18个命令行工具

    对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐 认识到监控和保持系统启动并运行是多么的不容易.基于此原因,我 ...

  8. (太强大了) - Linux 性能监控、测试、优化工具

    转: http://www.vpsee.com/2014/09/linux-performance-tools/ Linux 平台上的性能工具有很多,眼花缭乱,长期的摸索和经验发现最好用的还是那些久经 ...

  9. [转载]Linux 性能监控、测试、优化工具

    Linux 平台上的性能工具有很多,眼花缭乱,长期的摸索和经验发现最好用的还是那些久经考验的.简单的小工具.系统性能专家 Brendan D. Gregg 在最近的 LinuxCon NA 2014 ...

随机推荐

  1. Objective-C(NSString、BOOL、多文件开发)

    NSString 表示oc当中的字符串类 %@是oc当中对象的格式符 printf不能打印oc当中的对象 通过stringWithFormat:这个类方法,打印格式化的字符串 例 int a = 10 ...

  2. oracle查锁表SQL

    SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#, l.os_user_name,s.mach ...

  3. 在vim中执行外部命令

    11.7.5  在Vim编辑器中执行Shell命令 有时需要在Vim编辑器中执行Shell命令,例如需要验证一个Shell命令是否正确,以便写入脚本中:需要在文件中引用某个Shell命令的输入等.本小 ...

  4. 识别低效率的SQL语句

    1.返回行与逻辑读的比率 CREATE TABLE t as select * from dba_objects; --CREATE INDEX idx ON t (object_id); ---例1 ...

  5. System.Web.Optimization找不到引用

    在程序包管理控制程序中录入:Install-Package Microsoft.AspNet.Web.Optimization,安装即可.

  6. 在完成一个异步任务后取消剩余任务(C#)

    完整实例 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System. ...

  7. NDK JNI 的关键点

    1.System.loadLibrary 的名字是在Android.mk里面设定的   LOCAL_MODULE    := httpdown,MODULE   后面跟的就是了 2.如何正确调用到关键 ...

  8. JobTracker启动流程源码级分析

    org.apache.hadoop.mapred.JobTracker类是个独立的进程,有自己的main函数.JobTracker是在网络环境中提交及运行MR任务的核心位置. main方法主要代码有两 ...

  9. C#保存登录用户名供其他页面调用

    一.保存登录用户名供其他页面调用 步骤: (1)项目自带的Program.cs,类方法里定义登录的用户名为全局变量loginid,这样整个项目都可以调用它 static class Program { ...

  10. ros使用RPLIDAR激光雷达

    1.首先下载RPLIDAR的驱动功能包 https://github.com/robopeak/rplidar_ros 2.然后解压放到~/catkin_ws/src目录下 3.执行catkin_ma ...