系统性能监控

一、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/

 

原文地址:https://www.cnblogs.com/wuyx/p/9790580.html