Linux下的性能监控工具
1.显示系统整体资源使用情况-top命令
2.监控内存和CPU-vmstat命令
vmstat 1 3
示例1--使用vmstat查看java程序占用内存情况
package chapter6;
import java.util.Random;
//去package名放入linux中运行
public class HoldLockMain {
public static Object[] lock = new Object[10];
public static Random r = new Random();
static{
for (int i = 0; i < lock.length; i++) {
lock[i] = new Object();
}
}
public static class HoldLockTask implements Runnable{
private int i;
public HoldLockTask(int i) {
super();
this.i = i;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(true){
synchronized (lock[i]) {
if(i%2==0)
lock[i].wait(r.nextInt(10));
else
lock[i].notifyAll();
}
}
}catch(Exception e){
}
}
}
public static void main(String[] args) {
for (int i = 0; i < lock.length*2; i++) {
new Thread(new HoldLockTask(i/2)).start();
}
}
}
3.监控IO使用-iostat
示例2--使用io监控
package chapter6;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class HostIOMian {
public static class HoldIOTask implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try{
FileOutputStream fos = new FileOutputStream(new File("temp"));
for(int i=0;i<10000;i++)
fos.write(i);
fos.close();
FileInputStream fis = new FileInputStream(new File("temp"));
while(fis.read()!=-1);
}catch(Exception e){
}
}
}
}
public static class LazyTask implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(true){
Thread.sleep(1000);
}
}catch(Exception e){
}
}
}
public static void main(String[] args) {
new Thread(new HoldIOTask()).start();
new Thread(new LazyTask()).start();
new Thread(new LazyTask()).start();
new Thread(new LazyTask()).start();
}
}
[root@localhost bin]# jps
3889 Jps
3874 HostIOMian
[root@localhost bin]# pidstat -p 3874 -d -t 1 3
Linux 2.6.32-696.el6.x86_64 (localhost.localdomain) 06/13/2018 _x86_64_ (1 CPU)
09:02:25 PM TGID TID kB_rd/s kB_wr/s kB_ccwr/s Command
09:02:26 PM 3874 - 0.00 867.33 217.82 java
09:02:26 PM - 3874 0.00 0.00 0.00 |__java
09:02:26 PM - 3875 0.00 0.00 0.00 |__java
09:02:26 PM - 3876 0.00 0.00 0.00 |__java
09:02:26 PM - 3877 0.00 0.00 0.00 |__java
09:02:26 PM - 3878 0.00 0.00 0.00 |__java
09:02:26 PM - 3879 0.00 0.00 0.00 |__java
09:02:26 PM - 3880 0.00 0.00 0.00 |__java
09:02:26 PM - 3881 0.00 0.00 0.00 |__java
09:02:26 PM - 3882 0.00 0.00 0.00 |__java
09:02:26 PM - 3883 0.00 867.33 217.82 |__java
09:02:26 PM - 3884 0.00 0.00 0.00 |__java
09:02:26 PM - 3885 0.00 0.00 0.00 |__java
09:02:26 PM - 3886 0.00 0.00 0.00 |__java
09:02:26 PM TGID TID kB_rd/s kB_wr/s kB_ccwr/s Command
09:02:27 PM 3874 - 0.00 848.48 210.10 java
09:02:27 PM - 3874 0.00 0.00 0.00 |__java
09:02:27 PM - 3875 0.00 0.00 0.00 |__java
09:02:27 PM - 3876 0.00 0.00 0.00 |__java
09:02:27 PM - 3877 0.00 0.00 0.00 |__java
09:02:27 PM - 3878 0.00 0.00 0.00 |__java
09:02:27 PM - 3879 0.00 0.00 0.00 |__java
09:02:27 PM - 3880 0.00 0.00 0.00 |__java
09:02:27 PM - 3881 0.00 0.00 0.00 |__java
09:02:27 PM - 3882 0.00 0.00 0.00 |__java
09:02:27 PM - 3883 0.00 848.48 210.10 |__java
09:02:27 PM - 3884 0.00 0.00 0.00 |__java
09:02:27 PM - 3885 0.00 0.00 0.00 |__java
09:02:27 PM - 3886 0.00 0.00 0.00 |__java
09:02:27 PM TGID TID kB_rd/s kB_wr/s kB_ccwr/s Command
09:02:28 PM 3874 - 0.00 791.58 202.11 java
09:02:28 PM - 3874 0.00 0.00 0.00 |__java
09:02:28 PM - 3875 0.00 0.00 0.00 |__java
09:02:28 PM - 3876 0.00 0.00 0.00 |__java
09:02:28 PM - 3877 0.00 0.00 0.00 |__java
09:02:28 PM - 3878 0.00 0.00 0.00 |__java
09:02:28 PM - 3879 0.00 0.00 0.00 |__java
09:02:28 PM - 3880 0.00 0.00 0.00 |__java
09:02:28 PM - 3881 0.00 0.00 0.00 |__java
09:02:28 PM - 3882 0.00 0.00 0.00 |__java
09:02:28 PM - 3883 0.00 791.58 202.11 |__java
09:02:28 PM - 3884 0.00 0.00 0.00 |__java
09:02:28 PM - 3885 0.00 0.00 0.00 |__java
09:02:28 PM - 3886 0.00 0.00 0.00 |__java
Average: TGID TID kB_rd/s kB_wr/s kB_ccwr/s Command
Average: 3874 - 0.00 836.61 210.17 java
Average: - 3874 0.00 0.00 0.00 |__java
Average: - 3875 0.00 0.00 0.00 |__java
Average: - 3876 0.00 0.00 0.00 |__java
Average: - 3877 0.00 0.00 0.00 |__java
Average: - 3878 0.00 0.00 0.00 |__java
Average: - 3879 0.00 0.00 0.00 |__java
Average: - 3880 0.00 0.00 0.00 |__java
Average: - 3881 0.00 0.00 0.00 |__java
Average: - 3882 0.00 0.00 0.00 |__java
Average: - 3883 0.00 836.61 210.17 |__java
Average: - 3884 0.00 0.00 0.00 |__java
Average: - 3885 0.00 0.00 0.00 |__java
Average: - 3886 0.00 0.00 0.00 |__java
[root@localhost bin]# pidstat -r -p 3874 1 5//内存监控
Linux 2.6.32-696.el6.x86_64 (localhost.localdomain) 06/13/2018 _x86_64_ (1 CPU)
09:02:48 PM PID minflt/s majflt/s VSZ RSS %MEM Command
09:02:49 PM 3874 0.00 0.00 377968 14896 1.47 java
09:02:50 PM 3874 0.00 0.00 377968 14896 1.47 java
09:02:51 PM 3874 0.00 0.00 377968 14896 1.47 java
09:02:52 PM 3874 0.00 0.00 377968 14896 1.47 java
09:02:53 PM 3874 0.00 0.00 377968 14896 1.47 java
Average: 3874 0.00 0.00 377968 14896 1.47 java
4.多功能诊断器-pidstat
1.安装sysstat工具
示例3--使用pisstat查看进程信息
package chapter6;
public class HoldCPUMain {
public static class HoldCPUTask implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
double a = Math.random()*Math.random();
}
}
}
public static class LazyTask implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(true){
Thread.sleep(1000);
}
}catch(Exception e){
}
}
}
public static void main(String[] args) {
new Thread(new HoldCPUTask()).start();
new Thread(new LazyTask()).start();
new Thread(new LazyTask()).start();
new Thread(new LazyTask()).start();
}
}
使用-p参数进一步查看进程信息:
[root@localhost bin]# pidstat -p 3591 1 3 -u -t
Linux 2.6.32-696.el6.x86_64 (localhost.localdomain) 06/13/2018 _x86_64_ (1 CPU)
08:44:56 PM TGID TID %usr %system %guest %CPU CPU Command
08:44:57 PM 3591 - 100.00 0.00 0.00 100.00 0 java
08:44:57 PM - 3591 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3592 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3593 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3594 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3595 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3596 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3597 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3598 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3599 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3600 100.00 0.00 0.00 100.00 0 |__java
08:44:57 PM - 3601 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3602 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM - 3603 0.00 0.00 0.00 0.00 0 |__java
08:44:57 PM TGID TID %usr %system %guest %CPU CPU Command
08:44:58 PM 3591 - 99.00 0.00 0.00 99.00 0 java
08:44:58 PM - 3591 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3592 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3593 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3594 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3595 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3596 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3597 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3598 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3599 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3600 99.00 0.00 0.00 99.00 0 |__java
08:44:58 PM - 3601 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3602 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM - 3603 0.00 0.00 0.00 0.00 0 |__java
08:44:58 PM TGID TID %usr %system %guest %CPU CPU Command
08:44:59 PM 3591 - 97.03 0.00 0.00 97.03 0 java
08:44:59 PM - 3591 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3592 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3593 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3594 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3595 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3596 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3597 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3598 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3599 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3600 97.03 0.00 0.00 97.03 0 |__java
08:44:59 PM - 3601 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3602 0.00 0.00 0.00 0.00 0 |__java
08:44:59 PM - 3603 0.00 0.00 0.00 0.00 0 |__java
Average: TGID TID %usr %system %guest %CPU CPU Command
Average: 3591 - 98.67 0.00 0.00 98.67 - java
Average: - 3591 0.00 0.00 0.00 0.00 - |__java
Average: - 3592 0.00 0.00 0.00 0.00 - |__java
Average: - 3593 0.00 0.00 0.00 0.00 - |__java
Average: - 3594 0.00 0.00 0.00 0.00 - |__java
Average: - 3595 0.00 0.00 0.00 0.00 - |__java
Average: - 3596 0.00 0.00 0.00 0.00 - |__java
Average: - 3597 0.00 0.00 0.00 0.00 - |__java
Average: - 3598 0.00 0.00 0.00 0.00 - |__java
Average: - 3599 0.00 0.00 0.00 0.00 - |__java
Average: - 3600 98.67 0.00 0.00 98.67 - |__java
Average: - 3601 0.00 0.00 0.00 0.00 - |__java
Average: - 3602 0.00 0.00 0.00 0.00 - |__java
Average: - 3603 0.00 0.00 0.00 0.00 - |__java
使用jstack查看java应用程序所有线程信息:
可以看到两者的进程id相同(e10==3600)
2.Windows下性能监控工具
1.perform性能监控工具
示例4--使用perfmon
1.运行HoldCPUMain类。
2.在运行中输入“perfmon”打开性能监视器。
3.右击折线图添加计数器,选择Threads,搜索java,选中所有搜索的实例添加到计数器中
5.更换显示模式,以报表查看
可以看到,线程id为12892的线程占用很高的cpu。
使用jstack查看应用线程得
可以看到线程id相同(0x325c==12892)
2.process explorer进程管理工具
示例5--使用process explorer查看应用进程
1.下载processexplorer。
2.运行HoldLockMain,在processexplorer中进行查看
右击应用程序的进程,查看线程信息:
使用jstack查看线程信息
可以看到两者查看的线程信息相同
3.命令行工具--pslist
示例6--使用pslist查看应用线程
1.下载pslist工具,在命令行打开
2.运行HoldCPUTask程序
3.使用pslist java查看应用进程:
4.使用pslist java -d查看线程信息
5.使用jstack查看线程信息:
两者查看的线程信息相同。