系统性能排查

pwd:用于显示当前工作目录

uptime: 可以快速查看机器的负载情况

$ uptime
23:51:26 up 21:31,  1 user,  load average: 30.02, 26.43, 19.02
 
#第一个数值: 代表着1分钟的平均负载
#第二个数值:代表着5分钟的平均负载
#第三个数值:代表着15分钟的平均负载
 
#如果1分钟的平均负载很高,15分钟的很低 ==>系统正在执行高负载命令,大量消耗CPU,进一步排查CPU资源都消耗在了哪里
#如果15分钟平均负载很高,1分钟平均负载较低, 则有可能是CPU资源紧张时刻已经过去

dmesg 命令可以快速查看系统启动过程中的内核日志信息,包括:系统设备信息、启动和操作过程中系统记录的任何错误和问题

     - 【dmesg | more】: 打印出来的内容会很多,可以利用more来分页查看
     - 【dmesg | tail 】: 打印最后十行的日志
$ dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, 
file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. 
 Check SNMP counters.

vmstat 1

  vmstat命令,每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。后面跟的参数1,表示每秒输出一次统计信息,表头提示每一列的含义,这几介绍一些和性能调优相关的列:

procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
34  0    0 200889792  73708 591828    0    0     0     5    6   10 96  1  3  0  0
32  0    0 200889920  73708 591860    0    0     0   592 13284 4282 98  1  1  0  0
32  0    0 200890112  73708 591860    0    0     0     0 9501 2154 99  1  0  0  0
32  0    0 200889568  73712 591856    0    0     0    48 11900 2459 99  0  0  0  0
32  0    0 200890208  73712 591860    0    0     0     0 15898 4840 98  1  1  0  0

  r: 等待在CPU资源的进程数。数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的 CPU资源已经饱和

  b :列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等

   free:系统可用内存数(以千字节为单位),如果剩余内存不足,也会导致系统性能问题

     si, so:交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足

   us, sy, id, wa, st:这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait) 和被偷走的时间(stolen,一般被其他虚拟机消耗)。

   上述这些CPU时间,可以让我们很快了解CPU是否出于繁忙状态。一般情况下,如果用户时间和系统时间相加非常大,CPU出于忙于执行指令如果IO等待时间很长,那么系统的瓶颈可能在磁盘IO。

  示例命令的输出可以看见,大量CPU时间消耗在用户态,就是用户应用程序消耗CPU时间。这不一定是性能问题,需要结合r队列,一起分析。

      memory 
  swpd   切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常 
  free     当前的空闲页面列表中内存数量(k表示) 
  buff     作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。 
  cache 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好

   swap 
  si   由内存进入内存交换区数量。 
  so  由内存交换区进入内存数量。

  IO 
  bi    从块设备读入数据的总量(读磁盘)(每秒kb)。 
  bo   块设备写入数据的总量(写磁盘)(每秒kb) 
      这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析

  system  显示采集间隔内发生的中断数 

  in          列表示在某一时间间隔中观测到的每秒设备中断数。 
  cs         
列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。

  cpu       表示cpu的使用状态 
       us         列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。 

      sy         列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。 
  wa        列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。 
  id         列显示了cpu处在空闲状态的时间百分比

  mpstat -P ALL 1

 命令可显示CPU的个数,以及每一个CPU被占用的状况,
 如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。
$ mpstat -P ALL 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU)
07:38:49 PM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice  %idle
07:38:50 PM  all  98.47   0.00   0.75    0.00   0.00   0.00    0.00    0.00    0.00   0.78
07:38:50 PM    0  96.04   0.00   2.97    0.00   0.00   0.00    0.00    0.00    0.00   0.99

  pidstat 1

输出进程的CPU占用率{会持续输出,并不会覆盖之前的数据}
从这个命令中可以通过计算某个进程占用CPU的时间来推断占用多少个CPU资源
$ pidstat 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)
07:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:03 PM     0         9    0.00    0.94    0.00    0.94     1  rcuos/0
07:41:03 PM     0      4214    5.66    5.66    0.00   11.32    15  mesos-slave
07:41:03 PM     0      4354    0.94    0.94    0.00    1.89     8  java
07:41:03 PM     0      6521 1596.23    1.89    0.00 1598.11    27  java

  iostat -xz 1

  输入iostat -x 1 10命令,表示开始监控输入输出状态,-x表示显示所有参数信息,1表示每隔1秒监控一次,10表示共监控10次。

    【r/s, w/s, rkB/s, wkB/s】: 表示每秒读写次数和每秒读写数据量(KB)==》 这个值表示读写量,读写量过大,会引起性能问题 

    【await】: IO操作的平均等待时间,{单位:ms},此处代表应用程序和磁盘交互时,需要消耗的时间(包括IO等待和实际操作的耗时),这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障

    【avgqu-sz】: 向设备发出的请求平均量,如果此数值大于1,可能是硬件设备已经饱和(部分前端设备支持并行写入)

    【%util】:设备利用率,这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。

$ iostat -xz 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU)
avg-cpu:  %user  %nice %system %iowait  %steal   %idle
          73.96   0.00   3.73    0.03    0.06    22.21
Device:   rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s  avgrq-sz  avgqu-sz  await  r_await  w_await  svctm  %util
xvda       0.00     0.23    0.21  0.18   4.52      2.08    34.37     0.00    9.98    13.80    5.42     2.44   0.09
xvdb       0.01     0.00    1.02  8.94   127.97   598.53   145.79    0.00    0.43    1.78    0

  free -m

$ free -m
             total       used       free     shared    buffers     cached
Mem:        245998      24545     221453         83         59        541
Swap:            0          0          0

 free 命令可以查看系统内存的使用情况,-m参数表示按照兆字节展示。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。

 如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中提现),降低系统性能 

$ sar -n DEV 1
sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和
$ sar -n DEV 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015     _x86_64_    (32 CPU)
12:16:48 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
12:16:49 AM      eth0  18763.00   5032.00  20686.42    478.30      0.00      0.00      0.00      0.00
12:16:49 AM        lo     14.00     14.00      1.36      1.36      0.00      0.00      0.00      0.00

top :命令可以动态查看当前系统的资源情况,以及占用资源的命令列表

     

posted on 2018-11-02 22:37  溪水静幽  阅读(287)  评论(0)    收藏  举报