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

    一、Linux系统性能监控

    • uptime
    [root@iZwz963wlhi02sxk6nk1j5Z ~]# uptime
     10:31:09 up 41 days, 22:42,  1 user,  load average: 3.37, 2.76, 2.70

      这几个参数分别表示:
        ①. 10:31:09 up 41 days(当前时间,系统开机41天)
        ②. 22:42(系统的启动时间)
        ③. 1 user(系统的连接数,这个是一个终端增加一个,而不是一个用户一个)
        ④. load average: 3.37, 2.76, 2.70(系统一分钟平均负载,5分钟平均负载,十五分钟平均负载,它表示运行系统队列中的平均进程数,数值越大表示负载越重)

    • top
    top - 10:55:15 up 41 days, 23:06,  1 user,  load average: 3.72, 2.63, 2.56
    Tasks:  68 total,   1 running,  67 sleeping,   0 stopped,   0 zombie
    %Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  1883724 total,    87576 free,   433912 used,  1362236 buff/cache
    KiB Swap:        0 total,        0 free,        0 used.  1196012 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND 
    18850 root      20   0   44752   2424    196 S 99.0  0.1   1586:36 qW3xT.2 
     1289 root      20   0 2074504  71516   8808 S  0.7  3.8 265:34.21 java  
    18725 root      20   0  371584  94888   4500 S  0.7  5.0   3:27.05 ddgs.3013
    11971 root      20   0  131004  11500   9128 S  0.3  0.6 138:30.16 AliYunDun

      这几个参数分别表示:
        ①. 第一行表示的为uptime命令执行的结果。
        ②. Tasks:68 total,1 running,67 sleeping,0 stopped,0 zombie(进程情况:总进程为68个,运行的进程为1个,67个进程为休眠状态,僵死的进程为0个,终止的进程为0个)
        ③. %Cpu(s):100.0 us,0.0 sy,0.0 ni,0.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st(CPU状态,us用户占用为100%,sy系统占用为0,ni优先占用为0,id闲置占用为0,wa等待输入输出占用为0如果此项过高表示系统磁盘io过高,hi硬中断(Hardware IRQ)占用CPU的百分比为0,si软中断(Software Interrupts)占用CPU的百分比为0,st用于有虚拟cpu的情况,用来指示被虚拟机偷掉的cpu时间)
        ④. KiB Mem: 1883724 total,87576 free,433912 used,1362236 buff/cache(内存,total总的物理内存,used使用物理内存大小,free空闲物理内存,buff/cache用于内核缓存的内存大小)
        ⑤. KiB Swap:0 total,0 free,0 used. 1196012 avail Mem (total总的交换空间大小,used已经使用交换空间大小,free空间交换空间大小,cached缓冲的交换空间大小。buff和cached区别:buffers指的是块设备的读写缓冲区,cached指的是文件系统本身的页面缓存。他们都是Linux系统底层的机制,为了加速对磁盘的访问。)
        ⑥. PID(进程号),USER(运行用户),PR(优先级,它其实就是进程调度器分配给进程的时间片长度,单位是时钟个数,那么一个时钟需要多长时间呢?这
    跟CPU的主频以及操作系统平台有关,比如linux上一般为10ms,那么PR值为15则表示这个进程的时间片为150ms),NI(任务nice值),VIRT(进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES),RES(物理内存用量),SHR(共享内存用量),S(该进程的状态。其中S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态;Z代表僵死状态;T代表停止或跟踪状态), %CPU(该进程自最近一次刷新以来所占用的CPU时间和总时间的百分比),%MEM(该进程占用的物理内存占总内存的百分比),TIME+(累计cpu占用时间),COMMAND(该进程的命令名称)

    • vmstat 统计cpu,内存,swap,io等情况(可以在后面加2个int的参数 vmstat 1 3 表示 1秒统计一次,一个统计3次)
    [root@iZwz963wlhi02sxk6nk1j5Z ~]# vmstat 1 3
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     4  0      0  86592 143772 1219112    0    0     0     4   10    7  3  0 96  0  0
     3  0      0  86576 143772 1219112    0    0     0     0 1273  446 99  1  0  0  0
     1  0      0  86436 143772 1219112    0    0     0     0 1290  523 100  0  0  0  0 

      这几个参数分别表示:
        ①. procs
          r:置于运行队列中的内核线程数目(就是说多少个进程真的分配到CPU),我测试的服务器为阿里云的轻量级服务器目前CPU比较忙,值已经大于cpu数量,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
          b:置于等待队列(等待资源、等待输入/输出)的内核线程数目,也就是阻塞的进程。
        ②. memory
          swpd:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
          free:空闲的物理内存的大小,此时我的剩余内存为85M左右,因为我的机器内存总共为2G,所以剩余内存比较少。
          buff: Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用140多M
          cache:用来记忆我们打开的文件,给文件做缓冲,我本机大概占用差不多1G(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
        ③. swap
          si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
          so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
        ④. io
          bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte.
          bo:块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
        ⑤. system
          in:每秒CPU的中断次数,包括时间中断
          cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
        ⑥. cpu
          us: 用户CPU时间.
          sy: 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
          id: 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
          wa:CPU 空闲时间,在此期间系统有未完成的磁盘/NFS I/O 请求。
          st:从虚拟机中偷走的百分比(如果正在使用虚拟机话,有此列,虚拟机想运行但是系统管理程序转而运行其的对象的时间,如果虚拟机不希望运行任何对象,但是系统管理员运行了其他对象,这不算被偷走的cpu时间)

    • pidstat [选项] [<时间间隔>] [<次数>](细致观察进程,非自带需要安装 sudo apt-get install sysstat)
    [root@iZwz963wlhi02sxk6nk1j5Z ~]# pidstat -help
    Usage: pidstat [ options ] [ <interval> [ <count> ] ]
    Options are:
    [ -d ] [ -h ] [ -I ] [ -l ] [ -r ] [ -s ] [ -t ] [ -U [ <username> ] ] [ -u ]
    [ -V ] [ -w ] [ -C <command> ] [ -p { <pid> [,...] | SELF | ALL } ]
    [ -T { TASK | CHILD | ALL } ]

      下面是pidstat的用法:
        -d:显示各个进程的IO使用情况.
        -h:在一行上显示了所有活动,这样其他程序可以容易解析。
        -I:在SMP环境,表示任务的CPU使用率/内核数量。
        -l:显示命令名和所有参数。
        -r:显示各个进程的内存使用统计
        -s:堆栈的使用
        -t:显示选择任务的线程的统计信息外的额外信息
        -U [ ]:可按照用户名,显示各个进程的cpu使用统计
        -u:默认的参数,显示各个进程的cpu使用统计
        -V:版本号
        -w:显示每个进程的上下文切换情况
        -C :只显示那些包含字符串(可是正则表达式)comm的命令的名字
        -p { [,…] | SELF | ALL }:指定进程号
        -T { TASK | CHILD | ALL }:这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。

    • pidstat -u -p ALL(与pidstat效果一样,默认查询所有进程的使用情况)
    [root@iZwz963wlhi02sxk6nk1j5Z ~]# pidstat
    Linux 3.10.0-514.26.2.el7.x86_64 (iZwz963wlhi02sxk6nk1j5Z)     10/15/2018  _x86_64_    (1 CPU)
    05:45:12 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
    05:45:12 PM     0         1    0.00    0.00    0.00    0.00     0  systemd
    05:45:12 PM     0         3    0.00    0.00    0.00    0.00     0  ksoftirqd/0
    05:45:12 PM     0         9    0.00    0.01    0.00    0.01     0  rcu_sched
    05:45:12 PM     0        10    0.00    0.00    0.00    0.00     0  watchdog/0 

      各个参数的含义:

        ①. Linux 3.10.0-514.26.2.el7.x86_64 (iZwz963wlhi02sxk6nk1j5Z) 10/15/2018 x86_64(1 CPU):系统版本 日期 位数 cpu个数
        ②. 05:45:12 PM 时间
        ③. UID 用户ID
        ④. PID 进程ID
        ⑤. %usr 进程在用户空间占用cpu的百分比
        ⑥. %system 进程在内核空间占用cpu的百分比
        ⑦. %guest 进程在虚拟机占用cpu的百分比
        ⑧. %CPU 进程占用cpu的百分比
        ⑨. CPU 处理进程的cpu编号
        ⑩. Command 当前进程对应的命令

    • pidstat -r (显示各个进程的内存使用统计)
    Linux 3.10.0-514.26.2.el7.x86_64 (iZwz963wlhi02sxk6nk1j5Z)     10/15/2018     _x86_64_    (1 CPU)
    06:03:16 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
    06:03:16 PM     0         1      0.06      0.00  125132   3656   0.19  systemd
    06:03:16 PM     0       325      0.08      0.00   36816   2440   0.13  systemd-journal
    06:03:16 PM     0       344      0.00      0.00   43768   2040   0.11  systemd-udevd
    06:03:16 PM   998       429      0.00      0.00  527616  13048   0.69  polkitd

      各个参数含义:
        ①. 06:03:16 PM 时间
        ②. UID 用户ID
        ③. PID 进程ID
        ④. minflt/s 任务每秒发生的次要错误,不需要从磁盘中加载页
        ⑤. majflt/s 任务每秒发生的主要错误,需要从磁盘中加载页
        ⑥. VSZ 虚拟地址大小,虚拟内存的使用KB
        ⑦. RSS 常驻集合大小,非交换区物理内存使用KB
        ⑧. %MEM 该进程使用内存的百分比
        ⑨. Command 当前进程对应的命令

    • pidstat -d(显示各个进程的IO使用情况)
    [root@iZwz963wlhi02sxk6nk1j5Z ~]# pidstat -d
    Linux 3.10.0-514.26.2.el7.x86_64 (iZwz963wlhi02sxk6nk1j5Z)     10/15/2018     _x86_64_    (1 CPU)
    06:17:46 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
    06:17:46 PM     0         1      0.10      0.76      0.03  systemd
    06:17:46 PM     0        27      0.00      0.00      0.00  khugepaged
    06:17:46 PM     0       257      0.00      0.57      0.00  jbd2/vda1-8
    06:17:46 PM     0       325      0.00      0.00      0.00  systemd-journal
    06:17:46 PM     0       344      0.00      0.00      0.00  systemd-udevd
      各个参数含义:
        ①. 06:03:16 PM 时间
        ②. UID 用户ID
        ③. PID 进程ID
        ④. kB_rd/s 每秒从磁盘读取的KB
        ⑤. kB_wr/s 每秒写入磁盘KB
        ⑥. kB_ccwr/s 任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
        ⑦. Command 当前进程对应的命令
    • pidstat -w -p ALL
    [root@iZwz963wlhi02sxk6nk1j5Z soundCodeRead]# pidstat -w -p ALL
    Linux 3.10.0-514.26.2.el7.x86_64 (iZwz963wlhi02sxk6nk1j5Z)     10/16/2018     _x86_64_    (1 CPU)
    09:48:35 AM   UID       PID   cswch/s nvcswch/s  Command
    09:48:35 AM     0         1      0.04      0.00  systemd
    09:48:35 AM     0         2      0.00      0.00  kthreadd
    09:48:35 AM     0         3      1.44      0.00  ksoftirqd/0
    09:48:35 AM     0         5      0.00      0.00  kworker/0:0H

      各个参数含义:
        ①. 06:03:16 PM 时间
        ②. UID 用户ID
        ③. PID 进程ID
        ④. cswch/s 每秒主动任务上下文切换数量
        ⑤. nvcswch/s 每秒被动任务上下文切换数量
        ⑥. Command 当前进程对应的命令

    • pidstat -T ALL
    [root@iZwz963wlhi02sxk6nk1j5Z ~]# pidstat -T ALL
    Linux 3.10.0-514.26.2.el7.x86_64 (iZwz963wlhi02sxk6nk1j5Z)     10/16/2018     _x86_64_    (1 CPU)
    
    05:26:26 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
    05:26:26 PM     0         1    0.00    0.00    0.00    0.00     0  systemd
    05:26:26 PM     0         3    0.00    0.00    0.00    0.00     0  ksoftirqd/0
    05:26:26 PM     0         9    0.00    0.01    0.00    0.01     0  rcu_sched
    05:26:26 PM     0        10    0.00    0.00    0.00    0.00     0  watchdog/0
    
    05:26:26 PM   UID       PID    usr-ms system-ms  guest-ms  Command
    05:26:26 PM     0         1 176587710    189400         0  systemd
    05:26:26 PM     0         3         0     23740         0  ksoftirqd/0
    05:26:26 PM     0         9         0    535150         0  rcu_sched
    05:26:26 PM     0        10         0     15000         0  watchdog/0

       各个参数的含义:
        ①. 上面第一个表格中的数据为进程的数据与直接输入pidstat的一致。
        ②. usr-ms:任务和子线程在用户级别使用的毫秒数。
        ③. system-ms:任务和子线程在系统级别使用的毫秒数。
        ④. guest-ms:任务和子线程在虚拟机(running a virtual processor)使用的毫秒数。

    二、windows 性能监控

    • 任务管理器

        绝大多数人都知道任务管理器可以杀死进程,杀死应用,但是很多人也只是会这些,对于系统性能监控就不懂了,任务管理器是windows自带的性能监控工具,他可以全局监控计算机整体的性能,也可以单体监控某个进程的性能。
      ①. 计算机整体性能

     

       ②. 进程详细信息

     

      这里还可以右键列选择要监控的项。

    • Perfmon

      windows自带的性能监控工具,在命令行中直接输入Perfmon就可以打开。

      我们在windows中启动一个java项目,我们在其中怎么找到这些线程呢?

      右键添加计数器

      找到后将之添加进去,我们查效果,起初是相对稳定的。

      在本地发起一些请求,就会发生一些变化。

      而且我们也可以直接查看报告。

      从这里我们可以找到一些占用cpu过高的线程,从而通过线程id去找是具体程序中的哪个线程。上图中的 % Processor Time 是所有进程线程使用处理器执行指令所花的时间百分比。而ID Thread 则是线程号。我在这里值列举了两个参数,如果大家感兴趣可以参考 (Perfmon - Windows 自带系统监控工具)。

    • Process Explorer

      Process Explorer也是一个性能监控的工具,但是不是windows自带的工具,需要自己下载。(下载地址

       Process Explorer 有个优点就是可以将一个进程按照树形结构进行展示,上图为我自己的eclipse中运行的java项目的进程。双击进程也可以查看进程中线程的信息。

      我们从上图可以看出线程 12800 对cpu占用最高。

       上述为 Process Explorer 的简单应用,如果有兴趣可以查看( Process Explorer常用操作介绍).

    参考文章:

    TOP命令各个参数代表意义详解

    Linux vmstat命令实战详解

    pidstat 命令详解

    Perfmon - Windows 自带系统监控工具

     Process Explorer常用操作介绍

     

     

     

    -------------------- END ---------------------

    
    

    最后附上作者的微信公众号地址和博客地址 

    
    

    公众号:wuyouxin_gzh

    
    

    
    

     

    
    

    Herrt灬凌夜:https://www.cnblogs.com/wuyx/

     

  • 相关阅读:
    Build Path
    线程生命周期
    eclipse添加myBatis插件
    Spring web flow的意义
    部署Spring web项目遇到的问题及解决方案
    启动Eclipse时发生An internal error occurred during: "Initializing Java Tooling"错误
    Non-parseable POM 解决方法
    Dynamic Web Module 3.1 requires Java 1.7 or newer. 错误解决方案
    Java compiler level does not match the version of the installed Java project facet.解决方法
    Type cvc-complex-type.2.4.a: Invalid content was found starting with element 'build'.错误的解决方法
  • 原文地址:https://www.cnblogs.com/wuyx/p/9790580.html
Copyright © 2011-2022 走看看