TOP
top命令是Linux下常用的性能分析工具,能够实时的显示系统中个个进程的资源占用情况
如果要看单个线程的Top 可以使用 top -Hp pid
top输出如下
[root@server-1 data]# top
#这一行是任务队列信息
top - 06:38:39 up 13 min(系统运行时间), 1 user(当前登录用户数), load average: 0.01, 0.02, 0.00 (系统的平均负载,分别表示1分钟,5分钟,15分钟)
#进程统计信息
Tasks: 85 total(进程总数), 1 running(正在运行的进程数), 84 sleeping(休眠的进程数), 0 stopped(停止的进程数), 0 zombie(僵尸进程数)
#CUP信息
Cpu(s): 0.5%us(用户空间CUP占用率), 2.7%sy(内核空间CUP使用率), 0.0%ni, 96.4%id(空闲CPU占用率), 0.1%wa, 0.0%hi, 0.4%si, 0.0%st
Mem: 1004412k total(物理内存总量), 643432k used(已使用的物理内存), 360980k free(空闲物理内存), 18172k buffers(内核缓冲使用量)
Swap: 2031608k total(交换区总量), 0k used, 2031608k free, 97488k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1250 root 20 0 190m 8320 5024 S 2.0 0.8 0:04.38 vmtoolsd
1 root 20 0 19400 1568 1256 S 0.0 0.2 0:02.56 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.19 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
7 root 20 0 0 0 0 S 0.0 0.0 0:03.18 events/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
13 root 20 0 0 0 0 S 0.0 0.0 0:00.03 sync_supers
14 root 20 0 0 0 0 S 0.0 0.0 0:00.02 bdi-default
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/0
16 root 20 0 0 0 0 S 0.0 0.0 0:00.22 kblockd/0
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpid
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_notify
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_hotplug
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_aux
21 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ata_sff/0
22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksuspend_usbd
23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd
24 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kseriod
25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 md/0
PID : 进程ID
USER : 进程所有者的用户名
PR : 优先级
NI ; nice值,负值表示高优先级,正值表示低优先级
%CPU : 上次更新到现在的CUP时间占用百分比
TIME+:进程使用的CPU时间总计
%MEM:进程使用的物理内存百分比
监控IO使用 --- iostat命令
用来检测IO使用情况 使用yum install -y sysstat安装
通过此命令可以快速定位是否产生了大量的IO操作
[root@server-1 data]# iostat 1 3 (表示间隔1秒输出3此)
Linux 2.6.32-431.el6.x86_64 (server-1) 03/02/2019 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.37 0.00 1.83 0.04 0.00 97.76
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 4.10 206.40 39.31 452208 86124
tps:该设备每秒的传输次数
Blk_read/s:每秒从设备读取的数据量
Blk_wrtn/s:每秒从设备写入的数据量
Blk_read:读取的总数据量
Blk_wrtn:写入的总数据量
多功能诊断器--- pidstat
pidstat 不仅可以监视进程的性能情况狂,也可以监视线程的性能情况
1.cup使用率监控
编译并执行java
javac HoldCUPMain.java
java -cp . HoldCUPMain
public class HoldCUPMain {
public static class HoldCUPTask implements Runnable{
@Override
public void run() {
while(true){
double e = Math.random() * Math.random();
}
}
}
public static class LazyTask implements Runnable{
@Override
public void run() {
try{
while (true){
Thread.sleep(1000);
}
}catch (Exception e){
}
}
}
public static void main(String[] args){
new Thread(new HoldCUPTask()).start();
new Thread(new LazyTask()).start();
new Thread(new LazyTask()).start();
new Thread(new LazyTask()).start();
}
}
[root@server-1 ~]# jps
3504 HoldCUPMain
3529 Jps
[root@server-1 ~]# pidstat -p 3504 -u -t 1 3 [u表示对CUP使用率监控, -p后面接进程号 -t表示系统性能的监控细化到线程级别]
Linux 2.6.32-431.el6.x86_64 (server-1) 03/02/2019 _x86_64_ (1 CPU)
07:39:30 AM TGID TID %usr %system %guest %CPU CPU Command
07:39:31 AM 3504 - 100.00 7.14 0.00 100.00 0 java
#忽略了几行没用的输出
07:39:31 AM - 3571 100.00 7.14 0.00 100.00 0 |__java
07:39:31 AM - 3515 0.00 0.00 0.00 0.00 0 |__java
07:39:31 AM - 3516 0.00 0.00 0.00 0.00 0 |__java
07:39:31 AM - 3517 0.00 0.00 0.00 0.00 0 |__java
这里可以看出3571这个进程使用了CPU最高,我们可以进一步使用 jstack -l 3571来找到是哪一行导致的CUP升高
这里的0xe9f就是对应的3571
"Thread-0" #8 prio=5 os_prio=0 tid=0x0000000001542000 nid=0xe9f runnable [0x00007f0f99ac2000]
java.lang.Thread.State: RUNNABLE
at HoldCUPMain$HoldCUPTask.run(HoldCUPMain.java:11)
at java.lang.Thread.run(Thread.java:745)
2.监控IO的使用
[root@server-1 home]# pidstat -p 3733 -d -t 1 1 [-d 表示监控的IO]
Linux 2.6.32-431.el6.x86_64 (server-1) 03/02/2019 _x86_64_ (1 CPU)
#由于我这个程序不是IO操作的所以都是0
07:54:18 AM TGID TID kB_rd/s kB_wr/s kB_ccwr/s Command
07:54:19 AM 3733 - 0.00 0.00 0.00 java
07:54:19 AM - 3733 0.00 0.00 0.00 |__java
07:54:19 AM - 3734 0.00 0.00 0.00 |__java
07:54:19 AM - 3735 0.00 0.00 0.00 |__java
07:54:19 AM - 3736 0.00 0.00 0.00 |__java
07:54:19 AM - 3737 0.00 0.00 0.00 |__java
07:54:19 AM - 3738 0.00 0.00 0.00 |__java
07:54:19 AM - 3739 0.00 0.00 0.00 |__java
07:54:19 AM - 3740 0.00 0.00 0.00 |__java
07:54:19 AM - 3741 0.00 0.00 0.00 |__java
07:54:19 AM - 3742 0.00 0.00 0.00 |__java
07:54:19 AM - 3743 0.00 0.00 0.00 |__java
07:54:19 AM - 3744 0.00 0.00 0.00 |__java
07:54:19 AM - 3745 0.00 0.00 0.00 |__java
07:54:19 AM - 3746 0.00 0.00 0.00 |__java
查看java进程 --- jps
[root@server-1 ~]# jps -v -l [-v 输出jvm参数配置 -l输出主函数的完整路径]
2389 HoldCUPMain
2456 sun.tools.jps.Jps -Denv.class.path=/usr/java/jdk1.8.0_11/lib/ -Dapplication.home=/usr/java/jdk1.8.0_11 -Xms8m
查看虚拟机运行时信息 --- jstat命令
[root@server-1 ~]# jps -v -l
2389 HoldCUPMain
2501 sun.tools.jps.Jps -Denv.class.path=/usr/java/jdk1.8.0_11/lib/ -Dapplication.home=/usr/java/jdk1.8.0_11 -Xms8m
[root@server-1 ~]# jstat -gc 2389 1000 2 [一共输出2次间隔1000毫秒]
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
128.0 128.0 0.0 0.0 1024.0 465.3 15104.0 0.0 4480.0 674.0 384.0 66.6 0 0.000 0 0.000 0.000
128.0 128.0 0.0 0.0 1024.0 465.3 15104.0 0.0 4480.0 674.0 384.0 66.6 0 0.000 0 0.000 0.000
S0C: s0的大小(下面的单位都是KB)
S1C: s1的大小
S0U: s0已使用的大小
S1U: s1已使用的大小
EC: edgn区的大小
EU: edgn区的已使用空间
OC: 老年代大小
OU: 老年代已使用的空间
MC:永久代大小
MU:永久代已使用空间
YGC:新生代GC次数
YGCT:新生代GC耗时
FGC:FullGC次数
FGCT:FullGC耗时
GCT:GC总耗时
导出堆到文件 ---jmap命令
生成出来的hprof可以给VisualVM等工具进行分析
[root@server-1 xuzy]# jps
2688 Jps
2567 HoldCUPMain
[root@server-1 xuzy]# jmap -dump:format=b,file=/home/xuzy/javaTest/2567.hprof 2567
Dumping heap to /home/xuzy/javaTest/2567.hprof ...
Heap dump file created
JDK自带的堆分析工具 --- jhat命令
用来分析上面hprof文件,一般不使用,太麻烦。可以使用VisualVM分析
查看线程堆栈 -- jstack命令
也可以直接hprof用VisualVM分析
网友评论