注: 部分概念介绍来源于网络

一、查看CPU使用率
1. top 命令
[root@sss ~]# top
top - 16:54:38 up 7 days,  5:13,  3 users,  load average: 0.00, 0.01, 0.05
Tasks:  77 total,   2 running,  75 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1882232 total,   813020 free,   330164 used,   739048 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1386608 avail Mem 

  PID USER  PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND 
17215 root   0 -20  127504  12176   9560 S  0.7  0.6  21:46.45 AliYunDun 
 2770 root  20   0  573932  17232   6088 S  0.3  0.9   1:11.38 tuned  
    1 root  20   0   43548   3844   2588 S  0.0  0.2   0:06.54 systemd
    
top命令可以看到总体的系统运行状态和cpu的使用率 。
%us:表示用户空间程序的cpu使用率(没有通过nice调度)
%sy:表示系统空间的cpu使用率,主要是内核程序,内核空间占用CPU百分比
%ni:表示用户空间且通过nice调度过的程序的cpu使用率。用户进程空间内改变过优先级的进程占用CPU百分比
%id:空闲cpu
%wa:cpu运行时在等待io的时间
%hi:cpu处理硬中断的数量
%si:cpu处理软中断的数量
%st:被虚拟机偷走的cpu
注:99.0 id,表示空闲CPU,即CPU未使用率,100%-99.0%=1%,即系统的cpu使用率为1%。

二、查看内存使用率
1、top命令
[root@sss ~]# top
top - 16:54:38 up 7 days,  5:13,  3 users,  load average: 0.00, 0.01, 0.05
Tasks:  77 total,   2 running,  75 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1882232 total,   813020 free,   330164 used,   739048 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1386608 avail Mem 

  PID USER  PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND 
17215 root   0 -20  127504  12176   9560 S  0.7  0.6  21:46.45 AliYunDun 
 2770 root  20   0  573932  17232   6088 S  0.3  0.9   1:11.38 tuned  
    1 root  20   0   43548   3844   2588 S  0.0  0.2   0:06.54 systemd

查看第四行: KiB Mem
内存使用率: used/ total

2、free命令
free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存(buffer)。共享内存将被忽略
命令参数:
-b  以Byte为单位显示内存使用情况。 
-k  以KB为单位显示内存使用情况。 
-m  以MB为单位显示内存使用情况。
-g   以GB为单位显示内存使用情况。 
-o  不显示缓冲区调节列。 
-s<间隔秒数>  持续观察内存使用状况。 
-t  显示内存总和列。 
-V  显示版本信息。 

[root@sss ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1882232      331760      811004         592      739468     1384944
Swap:             0           0           0

total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buff/cache:磁盘缓存的大小。
第三行是交换分区SWAP的,也就是我们通常所说的虚拟内存。当可用内存少于额定值的时候,就会进行交换

如何看额定值:
cat /proc/meminfo 
[root@sss ~]# cat /proc/meminfo
MemTotal:        1882232 kB
MemFree:          811244 kB
MemAvailable:    1385300 kB
Buffers:           81268 kB
Cached:           602500 kB
事实上,少量地使用swap是不是影响到系统性能的。

那buffers和cached都是缓存,两者有什么区别呢?
1.为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。
2.磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。
3.Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,因为Buffer Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。
4.Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。
5.简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。
6.所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.
7.如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。

三、查看磁盘使用率
1、df命令
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
D:/lkh/Cygwin   133G   44G   89G  33% /
C:              106G   70G   37G  66% /cygdrive/c

磁盘和内存的区别与联系:
(磁盘--也叫硬盘--或是U盘--或是移动硬盘)
1、硬盘与内存都是存储器,一个是内部,一个是外部。
2、硬盘与内存的区别是很大的,这里只谈最主要的三点:
  1)内存是计算机的工作场所,硬盘用来存放暂时不用的信息;
  2)内存是半导体材料制作,硬盘是磁性材料制作;
  3)内存中的信息会随掉电而丢失,硬盘中的信息可以长久保存。
3、内存与硬盘的联系也非常密切:
  1)硬盘上的信息永远是暂时不用的,要用请装入内存!
  2)CPU与硬盘不发生直接的数据交换,CPU只是通过控制信号指挥硬盘工作,硬盘上的信息只有在装入内存后才能被处理。
4、计算机的启动过程就是一个从硬盘上把最常用信息装入内存的过程。
5、硬盘则决定你的电脑可以装下多少东西,内存则决定你的电脑开机后一次最多可以运行多少程序(如手机运行内存)。

四、查看io使用率
五种方法
  top命令、vmstat命令、iostat命令、iotop命令、pt-ioprofile命令
1、top命令
top - 11:41:22 up 51 min, 2 users, load average: 0.01, 0.04, 0.01
Tasks: 130 total, 1 running, 129 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.2%id, 0.4%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4151760k total, 2284628k used, 1867132k free, 47892k buffers
Swap: 4192956k total, 0k used, 4192956k free, 2145020k cached
分析:查看0.4%wa这里,IO等待所占用的CPU时间的百分比,高过30%时IO压力高
具体的解释如下:
    Tasks: 130 total 进程总数
    1 running 正在运行的进程数
    129 sleeping 睡眠的进程数
    0 stopped 停止的进程数
    0 zombie 僵尸进程数
    
2、vmstat命令
命令:vmstat 2 5(每两秒执行一次,执行5次)
[root@izuf633l0ge76tv5mzalpmz ~]# vmstat 2 12
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 835920  80296 642904    0    0     1     1   14   69  0  0 100  0  0
 0  0      0 835920  80296 642936    0    0     0     0  216  304  1  1 99  0  0
vmstat参数解释:
  Procs:进程
      r: 在运行队列中等待的进程数
        b: 在等待io的进程数
  Memory:内存
      swpd: 现时可用的交换内存,单位:KB
      free: 空闲的内存,单位KB
      buff: 缓冲去中的内存数(单位:KB)。
        cache:被用来做为高速缓存的内存数(单位:KB)
  Swap:交换页面
      si: 从磁盘交换到内存的交换页数量,单位:KB/秒
      so: 从内存交换到磁盘的交换页数量,单位:KB/秒
  IO:块设备
      bi: 发送到块设备的块数,单位:块/秒
      bo: 从块设备接收到的块数,单位:块/秒
  System:系统
      in: 每秒的中断数,包括时钟中断
      cs: 每秒的环境(上下文)切换次数
  CPU(按 CPU 的总使用百分比来显示)
      us: 用户进程使用的时间
      sy: 系统进程使用的时间
      id: 中央处理器的空闲时间
常见诊断:
1、假如 r 经常大于4 ,且 id 经常小于40,表示中央处理器的负荷很重。
2、假如 bi,bo 长期不等于0,表示物理内存容量太小。
每个参数的具体意思如下:
r:
表示运行队列(就是说多少个进程真的分配到CPU),
我测试的服务器目前CPU比较空闲,没什么程序在跑,
当这个值超过了CPU数目,就会出现CPU瓶颈 了。
这个也和top的负载有关系,
一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。
top的负载类似每秒的运行队 列。
如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b:表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd:
虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,
如果不是程序内存泄露的原因,
那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free:空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff:Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache:
cache直接用来记忆我们打开的文件,给文件做缓冲,
我本机大概占用300多M
(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,
是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si:
每秒从磁盘读入虚拟内存的大小,如果这个值大于0,
表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
我的机器内存充裕,一切正常。
so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi:
块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,
默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,
但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,
磁盘写入速度差不多140M每秒
bo:
块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。
bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in:每秒CPU的中断次数,包括时间中断
cs:
每秒上下文切换次数,
例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,
这个值要越小越好,太大了,要考虑调低线程或者进程的 数目,
例如在apache和nginx这种web服务器中,
我们一般做性能测试时会进行几千并发甚至几万并发的测试,
选择web服务器的进程可以由进程或 者线程的峰值一直下调,压测,
直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。
系统调用也是,每次调用系统函数,我们的代码就会进入内核 空间,导致上下文切换,
这个是很耗资源,也要尽量避免频繁调用系统函数。
上下文切换次数过多表示你的CPU大部分浪费在上下文切换,
导致CPU干正经事的 时间少了,CPU没有充分利用,是不可取的。
us:
用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,
可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy:系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id:
空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,
us是用户CPU使用率,sy是系统CPU使用率。
wt:等待IO CPU时间。

3、iostat 使用
安装命令: yum install sysstat 
iostat用于输出CPU和磁盘I/O相关的统计信息,单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息
使用iostat -d -k 2 查看IO情况:
-k:已kb为单位显示读写信息
-m:已mb为单位显示读写信息

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          11.28    0.00    2.26    0.75    0.00   85.71

Device:   rrqm/s wrqm/s  r/s  w/s    rkB/s  wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util
vda     0.00  0.00   0.00  0.00    0.00  0.00  0.00   0.00    0.00  0.00   0.00  0.00   0.00
vdb     0.00  0.00   2.00  0.00    8.00  0.00  8.00   0.04     19.00  19.00  0.00  19.00   3.80
scd0     0.00  0.00   0.00  0.00    0.00  0.00  0.00   0.00    0.00  0.00   0.00  0.00   0.00

%user    CPU在用户态执行进程的时间百分比。
%nice    CPU在用户态模式下,用于nice操作,所占用CPU总时间的百分比
%system    CPU处在内核态执行进程的时间百分比
%iowait    CPU用于等待I/O操作占用CPU总时间的百分比
%steal    管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比
%idle    CPU空闲时间百分比
1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈 
2. 若 %idle 的值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量 
3. 若 %idle 的值持续低于1,则系统的CPU处理能力相对较低,表明系统中最需要解决的资源是 CPU

使用iostat -x 5 查看IO情况:
-x:更详细的io设备统计信息
选项       说明
rrqm/s       每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s       每秒对该设备的写请求被合并次数
r/s           每秒完成的读次数
w/s           每秒完成的写次数
rkB/s       每秒读数据量(kB为单位)
wkB/s       每秒写数据量(kB为单位)
avgrq-sz   平均每次IO操作的数据量(扇区数为单位)
avgqu-sz   平均等待处理的IO请求队列长度
await       平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了
svctm       平均每次IO请求的处理时间(毫秒为单位)如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
%util       采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了
平时我们主要关注这三个参数:await  svctm $util

4、iotop命令
安装命令:yum install iotop
查看哪个线程耗IO比较高、按 o 只显示有磁盘 IO 活动的进程。
iotop -oP
各个参数说明:
  -o, --only只显示正在产生I/O的进程或线程。除了传参,可以在运行过程中按o生效。
  -b, --batch非交互模式,一般用来记录日志。
  -n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用。
  -d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1。
  -p PID, --pid=PID指定监测的进程/线程。
  -u USER, --user=USER指定监测某个用户产生的I/O。
  -P, --processes仅显示进程,默认iotop显示所有线程。
  -a, --accumulated显示累积的I/O,而不是带宽。
  -k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用。
  -t, --time 加上时间戳,非交互非模式。
  -q, --quiet 禁止头几行,非交互模式。有三种指定方式。
  -q 只在第一次监测时显示列名
  -qq 永远不显示列名。
  -qqq 永远不显示I/O汇总。
交互按键:
  和top命令类似,iotop也支持以下几个交互按键。
  left和right方向键:改变排序。  
  r:反向排序。
  o:切换至选项--only。
  p:切换至--processes选项。
  a:切换至--accumulated选项。
  q:退出。
  i:改变线程的优先级。

5、pt-ioprofile命令
安装步骤:
1、安装依赖包:yum install -y perl perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl-Digest-MD5 perl-ExtUtils-MakeMaker
2、下载:wget https://www.percona.com/downloads/percona-toolkit/3.0.13/binary/redhat/7/x86_64/percona-toolkit-3.0.13-1.el7.x86_64.rpm
3、安装rpm包:rpm -ivh percona-toolkit-3.0.13-1.el7.x86_64.rpm
使用方法:
pt-ioprofile --profile-pid=1236 --cell=sizes
pt-ioprofile的原理是对某个pid附加一个strace进程进行IO分析。
对于定位问题更有用的是通过IO的吞吐量来进行定位。使用参数 --cell=sizes,该参数将结果已 B/s 的方式展示出来
从上图可以看出IO负载的主要来源是jetty。
并且压力主要集中在读取上。