理解你应用的关键路径及关键路径消耗的资源,然后查看该资源的利用率
第一步:从系统层开始,主要包括以下命令:
vmstat,iostat,sar,top,netstat,sysctl
vmstat指令可以查看linux系统性能情况:系统内核线程,虚拟内存,磁盘io,陷阱和cpu活动的统计信息等,如下所示:
songjing@songjing ~ $ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 1127788 181008 1319048 0 0 9 12 20 293 2 1 97 1
其中,标示系统内核的两个参数r,b都为0表示系统运行队列中的进程数和等待队列中的进程数都为 0,而正常情况下r值<=5,b值一般为0
memory区记录了系统虚拟和真实内存的使用情况:spwd表示当前已用的交换内存大小,free参数是空闲ram的大小,buff参数表示缓存使用了的ram大小,cache是指文件系统缓存的内存大小;
接下来是交换区swap的使用情况:si和so,si表示从磁盘分页到内存的数量;so表示从内存分页到磁盘的数量
接下来是显示磁盘io的两个参数bi:表示从磁盘读入的块个数为9,bo表示写入磁盘的块个数12
in和cs用于表示系统内核进行进程管理的繁忙程度:in表示中断次数20,cs表示进程上下文切换次数为293次.
最好四个参数用于表示系统cpu运行指标:us表示用户使用cpu为2%,系统调用1%,和空闲97%,其中wa表示系统io等待耗费的cpu时间百分比
iostat指令需要安装工具:sudo apt-get install sysstat
如下:
songjing@songjing ~ $ iostat
Linux 2.6.38-8-generic-pae (songjing) 2011年07月30日_i686_
(4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.80 0.23 0.49 0.46 0.00 97.03
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 5.25 27.93 39.33 1276116 1796808
iostat主要表示io负载情况:
其中user表示应用程序在用户级占用的cpu时间,system表示在内核占用的cpu时间,iowait表示cpu空闲期间有未完成的io请求所占的时间百分比;idle表示cpu空闲期间没有未完成的io请求时所占时间百分比,tps表示一秒钟对磁盘的io请求次数;kB_read表示io设备sda读取到的kb总数, kB_wrtn表示写入的kb总数
top指令:
PID USER PR NI VIRT RES SHR S %CPU
%MEM TIME+ COMMAND
1192 root 20 0 290m 124m 85m S 3 3.2 9:03.25 Xorg
2528 songjing 20 0 332m 48m 25m S 3 1.2 20:10.23 chromium-browse
8048 songjing 20 0 177m 31m 18m S 2 0.8 0:02.66 /usr/bin/termin
3174 songjing 25 5 175m 46m 21m S 1 1.2 5:06.74 chromium-browse
2061 songjing 20 0 83628 52m 23m S 1 1.4 3:17.10 compiz
pid即为系统进程id,user表示当前进程是哪个用户运行的,PR表示当前进程的优先级别,NI表示优先级值,VIRT表示进程使用的虚拟内存总量,RES表示 进程使用的,未被换出的内存大小,SHR表示共享内存大小,S表示进程状态,CPU和MEM分别表示cpu占用百分比和物理内存占用百分比,Time+表示进程使用cpu的总量.top指令还有以下统计数据信息:
songjing@songjing ~ $ top
top - 23:56:06(系统当前时间) up 13:04(系统开机运行时间), 2 users(系统用户个数), load average: 1.03, 1.09, 1.07(系统1,5,15分钟内的任务队列平均值)
Tasks: 190 total(进程总数), 2 running, 181 sleeping, 4 stopped, 3 zombie
Cpu(s): 1.2%us(用户占用), 0.4%sy(内核占用), 0.2%ni(用户进程内改变过优先级的进程占用的cpu百分比), 97.5%id, 0.7%wa(io等待), 0.0%hi, 0.0%si, 0.0%st
Mem: 3976536k total, 2964420k used, 1012116k free, 189696k buffers
Swap: 2999292k total, 0k used, 2999292k free, 1378280k cached(已存在于内存中的交换区大小)
第二步:再看虚拟机:jmap,jstat gcutil,kill -3
jmap -histo pid
num #instances #bytes class name
----------------------------------------------
1: 68106 34656408 [I
2: 174493 21774680 [C
3: 104482 13261112 <constMethodKlass>
4: 31741 9985008 [B
5: 104482 9200544 <methodKlass>
6: 201899 8075960 java.util.concurrent.ConcurrentHashMap$EntryIterator
7: 151627 6542592 <symbolKlass>
8: 9218 5480720 <constantPoolKlass>
sudo:jmap -heap pid:
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1019215872 (972.0MB)
NewSize = 1048576 (1.0MB)
MaxNewSize = 4294901760 (4095.9375MB)
OldSize = 4194304 (4.0MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 16777216 (16.0MB)
MaxPermSize = 67108864 (64.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 177537024 (169.3125MB)
used = 44955216 (42.87263488769531MB)
free = 132581808 (126.43986511230469MB)
25.32160052429402% used
From Space:
capacity = 393216 (0.375MB)
used = 0 (0.0MB)
free = 393216 (0.375MB)
0.0% used
To Space:
capacity = 21364736 (20.375MB)
used = 0 (0.0MB)
free = 21364736 (20.375MB)
0.0% used
PS Old Generation
capacity = 73859072 (70.4375MB)
used = 73194816 (69.80401611328125MB)
free = 664256 (0.63348388671875MB)
99.10064399401065% used
PS Perm Generation
capacity = 67108864 (64.0MB)
used = 50392072 (48.05762481689453MB)
free = 16716792 (15.942375183105469MB)
75.0900387763977% used
jps -v 查看所有java进程
jconsole:
使用前需要在run.sh中加入
JAVA_OPTS="$JAVA_OPTS
-Dcom.sun.management.jmxremote.port=8950
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false"
启动命令:jconsole localhost:8950
jstat -gcutil 3180
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 3.67 59.92 72.88 19 0.266 7 1.987 2.253
jstack:程序hung的时候或者java程序崩溃时可以使用该工具查看具体出错的位置
最后看应用:jprofiler,瓶颈是会移动的,关注资源(cpu,mem,io,net),关注利用资源的(thread)
本文详细介绍了如何通过vmstat、iostat、top等命令监控Linux系统性能,包括内存、CPU、IO使用情况,并提供了jmap、jstat等工具用于Java应用的性能分析。此外,还阐述了如何通过jprofiler等工具定位应用瓶颈。

被折叠的 条评论
为什么被折叠?



