首页 > 代码库 > Linux常用命令(6)-性能瓶颈分析(java)

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

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分钟的负载情况。
第二行: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的百分比
在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表示运行队列的大小,
b表示由于IO等待而block的线程数量,
in表示中断的数量,
cs表示上下文切换的数量,
us表示用户CPU时间,
sys表示系统CPU时间,
wa表示由于IO等待而是CPU处于idle状态的时间,
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

[map@ctb-test sectionLocus]$ iostat -d -k -t 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。

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