Linux常用命令(6)-性能瓶颈分析(java)

主要分析的对象
CPU
内存
磁盘IO
网络性能
IO 相关,IO 相关的应用通常用来处理大量数据,需要大量内存和存储,频繁 IO 操作读写数据,而对 CPU 的要求则较少,大部分时候 CPU 都在等待硬盘,比如,数据库服务器、文件服务器等。
CPU 相关,CPU 相关的应用需要使用大量 CPU,比如高并发的 web/mail 服务器、图像/视频处理、科学计算等都可被视作 CPU 相关的应用。

监测工具
我们只需要简单的工具就可以对 Linux 的性能进行监测,常用的工具:
工具    简单介绍
top    查看进程活动状态以及一些系统状况
vmstat    查看系统状态、硬件和系统信息等
iostat    查看CPU 负载,硬盘状况
sar    综合工具,查看系统状况
mpstat    查看多处理器状况
netstat    查看网络状况
iptraf    实时网络状况监测
tcpdump    抓取网络数据包,详细分析
tcptrace    数据包分析工具
netperf    网络带宽工具
dstat    综合工具,综合了 vmstat, iostat, ifstat, netstat 等多个信息

top:top命令监控CPU利用率,进程状态和内存利用率并且可以详细列出每一个进程占用了多少CPU和多少内存。

[map@ctb-test sectionLocus]$ top

top - 10:52:24 up 99 days, 21:31,  6 users,  load average: 1.67, 2.01, 1.83
Tasks: 665 total,   2 running, 663 sleeping,   0 stopped,   0 zombie
Cpu(s):  7.3%us,  2.4%sy,  0.0%ni, 84.8%id,  4.6%wa,  0.0%hi,  1.0%si,  0.0%st

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                             
20042 map       20   0 8681m 4.8g  10m S 165.4 30.7  59:46.66 java                                                                                                               
 3023 root      20   0  150m 5464  700 R 74.2  0.0  84883:39 redis-sentinel                                                                                                      
 8066 root      20   0     0    0    0 D  2.5  0.0  11:10.48 flush-8:16

第一行:10:52:24 up 99 days, 21:31 当前系统时间;6 users :当前有6个用户登录系统;load average: 1.67, 2.01, 1.83   后面的三个数分别是1分钟、5分钟、15分钟的负载情况。平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数。多核CPU的话,满负荷状态的数字为 "1.00 * CPU核数",即双核CPU为2.00,四核CPU为4.00。
在单核处理器中,平均负载值为1或者小于1的时候,系统处理进程会非常轻松,即负载很低。当达到3的时候,就会显得很忙,达到5或者8的时候就不能很好的处理进程了
第二行:Tasks: 665   任务(进程) 总共665个,其中2个运行,663个睡眠,stoped状态的有0个,zombie状态(僵尸)的有0个
第三行:cpu状态
6.7% us 用户空间占用CPU的百分比。
0.4% sy 内核空间占用CPU的百分比。
0.0% ni 改变过优先级的进程占用CPU的百分比
92.9% id 空闲CPU百分比
0.0% wa IO等待占用CPU的百分比
0.0% hi 硬中断(Hardware IRQ)占用CPU的百分比

0.0% si 软中断(Software Interrupts)占用CPU的百分比

load average值的含义
单核处理器
假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车。当车不多的时候,load <1;当车占满整个马路的时候 load=1;当马路都站满了,而且马路外还堆满了汽车的时候,load>1
 
多核处理器
我们经常会发现服务器Load > 1但是运行仍然不错,那是因为服务器是多核处理器(Multi-core)。
假设我们服务器CPU是2核,那么将意味我们拥有2条马路,我们的Load = 2时,所有马路都跑满车辆。
 
#查看CPU core 
grep 'model name' /proc/cpuinfo | wc -l

在top基本视图中,按键盘数字1,可监控每个逻辑CPU的状况:
top - 13:44:20 up 100 days, 23 min,  7 users,  load average: 3.32, 2.72, 2.25
Tasks: 664 total,   2 running, 662 sleeping,   0 stopped,   0 zombie
Cpu0  : 14.8%us, 38.5%sy,  0.0%ni, 21.9%id,  0.0%wa,  0.0%hi, 24.8%si,  0.0%st
Cpu1  :  1.0%us, 40.8%sy,  0.0%ni,  0.3%id, 57.8%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  1.3%us,  4.0%sy,  0.0%ni, 94.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  :  0.3%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu8  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu9  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu10 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu11 :  0.0%us,  5.3%sy,  0.0%ni, 94.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu12 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu13 :  0.0%us,  5.6%sy,  0.0%ni, 93.0%id,  1.3%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu14 :  0.7%us,  0.3%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu15 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu16 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu17 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu18 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu19 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu20 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu21 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu22 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu23 :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  16280412k total, 16117744k used,   162668k free,   324536k buffers
Swap: 32767992k total, 11516272k used, 21251720k free, 13336076k cached

[map@ctb-test sectionLocus]$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd     free   buff  cache    si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  1 12131504 163788 275616 8459504    0    0    29    23    0    0   8   2  90  0  0

r表示运行队列的大小,当r超过了CPU数目,就会出现CPU瓶颈了。
b表示由于IO等待而block的线程数量,当出现明 显较多的blocked的时候,就说明cpu产生了瓶颈
in表示中断的数量,
cs表示上下文切换的数量,
us表示用户CPU时间,
sys表示系统CPU时间,当us+sy的值接近100的时候,表示CPU正在接近满负荷工作。
wa表示由于IO等待而是CPU处于idle状态的时间,wa(等待IO)表示CPU因等待IO资源而被迫处于空闲状态,越小越好
id表示CPU处于idle状态的总时间。
dstat可以给出每一个设备产生的中断数:

1.对于每一个CPU来说运行队列不要超过3,例如,如果是双核CPU就不要超过6;
2.如果CPU在满负荷运行,应该符合下列分布,
a) User Time:65%~70%
b) System Time:30%~35%
c) Idle:0%~5%

mapstat:默认情况下,只会输出全部平均值
[map@ctb-test sectionLocus]$ mpstat 
Linux 2.6.32-431.1.2.0.1.el6.x86_64 (ctb-test)  09/16/2014      _x86_64_        (24 CPU)

10:53:53 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:53:53 AM  all    7.87    0.00    1.33    0.20    0.00    0.64    0.00    0.00   89.95
mpstat -P ALL

查看每一个CPU的情况
[map@ctb-test sectionLocus]$ mpstat -P ALL
Linux 2.6.32-431.1.2.0.1.el6.x86_64 (ctb-test)  09/16/2014      _x86_64_        (24 CPU)

10:53:26 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:53:26 AM  all    7.87    0.00    1.33    0.20    0.00    0.64    0.00    0.00   89.95
10:53:26 AM    0   16.66    0.00   31.15    0.96    0.06   17.06    0.00    0.00   34.11
10:53:26 AM    1    8.80    0.00    0.46    2.30    0.00    0.01    0.00    0.00   88.42
10:53:26 AM    2    7.59    0.00    0.30    0.13    0.00    0.00    0.00    0.00   91.98
10:53:26 AM    3    7.92    0.00    0.10    0.05    0.00    0.00    0.00    0.00   91.94
10:53:26 AM    4    7.29    0.00    0.25    0.08    0.00    0.00    0.00    0.00   92.38
10:53:26 AM    5    7.48    0.00    0.09    0.03    0.00    0.00    0.00    0.00   92.40
10:53:26 AM    6    7.00    0.00    0.12    0.05    0.00    0.00    0.00    0.00   92.83
10:53:26 AM    7    7.30    0.00    0.07    0.03    0.00    0.00    0.00    0.00   92.60
10:53:26 AM    8    6.82    0.00    0.09    0.04    0.00    0.00    0.00    0.00   93.05
10:53:26 AM    9    7.19    0.00    0.07    0.02    0.00    0.00    0.00    0.00   92.72
10:53:26 AM   10    6.68    0.00    0.09    0.04    0.00    0.00    0.00    0.00   93.19
10:53:26 AM   11    7.08    0.00    0.06    0.02    0.00    0.00    0.00    0.00   92.83
10:53:26 AM   12    7.09    0.00    1.20    0.67    0.00    0.00    0.00    0.00   91.03
10:53:26 AM   13    8.16    0.00    0.13    0.25    0.00    0.00    0.00    0.00   91.46
10:53:26 AM   14    7.78    0.00    0.10    0.06    0.00    0.00    0.00    0.00   92.06
10:53:26 AM   15    7.60    0.00    0.13    0.03    0.00    0.00    0.00    0.00   92.24
10:53:26 AM   16    7.56    0.00    0.09    0.04    0.00    0.00    0.00    0.00   92.31
10:53:26 AM   17    7.79    0.00    0.05    0.02    0.00    0.00    0.00    0.00   92.14
10:53:26 AM   18    7.56    0.00    0.06    0.03    0.00    0.00    0.00    0.00   92.35
10:53:26 AM   19    7.80    0.00    0.05    0.01    0.00    0.00    0.00    0.00   92.14
10:53:26 AM   20    7.50    0.00    0.05    0.03    0.00    0.00    0.00    0.00   92.41
10:53:26 AM   21    7.81    0.00    0.05    0.01    0.00    0.00    0.00    0.00   92.13
10:53:26 AM   22    7.50    0.00    0.05    0.02    0.00    0.00    0.00    0.00   92.42
10:53:26 AM   23    7.80    0.00    0.05    0.01    0.00    0.00    0.00    0.00   92.13

通过使用ps命令,可以很清楚的看出到底是哪一条进程在吃CPU
[map@ctb-test sectionLocus]$ ps -eo pcpu,pid,user,args | sort -k 1 -r | head -16
%CPU   PID USER     COMMAND
 6.2 17319 map      sshd: map@notty  
59.0  3023 root     ./src/redis-sentinel *:26379      
 1.6 17320 map      /usr/libexec/openssh/sftp-server

内存
free  -b,k,m,g
[map@ctb-test section]$ free
             total       used       free     shared    buffers     cached
Mem:      16280412   16114224     166188          0     305212    8181816
-/+ buffers/cache:    7627196    8653216
Swap:     32767992   12064588   20703404

total:物理内存的总大小
used:已经使用的物理内存大小
free:空闲的物理内存大小
shared:多个进程共享的内存大小
buffers/cached:磁盘缓存的大小
第二行Mem:代表物理内存使用情况
第三行(-/+ buffers/cached):代表磁盘缓存使用状态
第四行:Swap表示交换空间内存使用状态
free命令输出的内存状态,可以通过两个角度来查看:一个是从内核的角度来看,一个是从应用层的角度来看的。

IO 监控
top 的%wa指CPU等待磁盘写入完成的时间。莫非是磁盘忙,怎样证明是磁盘在忙?
df -h  查看硬盘的分区信息
[map@ctb-test sectionLocus]$ df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-Lv_root  244G  164G   68G  71% /
tmpfs                         7.8G     0  7.8G   0% /dev/shm
/dev/sda1                     485M   54M  406M  12% /boot
/dev/sdb1                     1.8T  1.1T  687G  61% /map

 

iostat

iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。

参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。

[map@ctb-test sectionLocus]$ iostat -d  -k  2
Linux 2.6.32-431.1.2.0.1.el6.x86_64 (ctb-test)  09/16/2014      _x86_64_        (24 CPU)

09/16/2014 11:35:05 AM
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdb              26.34       679.38       486.98 5865509664 4204394924
sda               8.41        12.06        51.23  104118766  442327556
dm-0             11.68         6.29        45.14   54302885  389705884
dm-1              2.97         5.77         6.09   49812588   52621612

tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;

 

kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

 

[map@ctb-test sectionLocus]$ iostat -d -k -x 2

03/03/2015 02:03:26 PM
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     1.50    0.00   14.00     0.00    62.00     8.86     0.69   48.93   3.89   5.45
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdb             146.00   316.00  100.00  291.00   812.00  2030.00    14.54   284.88  359.65   2.56 100.00
dm-0              0.00     0.00    0.00   15.50     0.00    62.00     8.00     0.75   48.32   3.52   5.45
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
rKB/s:The number of read requests that were issued to the device per second;
wKB/s:The number of write requests that were issued to the device per second;
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。    
await:  每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
         这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,         系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

netstat
netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的
      netstat命令的功能是显示网络连接、路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作。
      该命令的一般格式为:
      netstat [选项]
       命令中各选项的含义如下:
      -a 显示所有socket,包括正在监听的。
      -c 每隔1秒就重新显示一遍,直到用户中断它。
      -i 显示所有网络接口的信息,格式同“ifconfig -e”。
      -n 以网络IP地址代替名称,显示出网络连接情形。
      -r 显示核心路由表,格式同“route -e”。
      -t 显示TCP协议的连接情况。
      -u 显示UDP协议的连接情况。
      -v 显示正在进行的工作。
[h_chenliling@vm6-sj1-pro-had-32-107 ~]$ netstat -anp |grep 3306
(No info could be read for "-p": geteuid()=15048 but you should be root.)
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      -                  
tcp        0      0 10.60.32.107:4310       10.60.32.171:3306       ESTABLISHED -                  
tcp        1      0 10.60.32.107:34938      10.60.32.171:3306       CLOSE_WAIT  -                  
tcp        0      0 10.60.32.107:23550      10.60.32.171:3306       ESTABLISHED -                  
tcp        0      0 10.60.32.107:35140      10.60.32.171:3306       ESTABLISHED -                  
tcp        1      0 10.60.32.107:34954      10.60.32.171:3306       CLOSE_WAIT  -                  
tcp        1      0 10.60.32.107:35466      10.60.32.171:3306       CLOSE_WAIT  -                  
unix  2      [ ]         DGRAM                    2168330685 -                   
unix  3      [ ]         STREAM     CONNECTED     2551323306 -        

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值