TOP
实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。常用来查看系统整机性能。
- 第一行:任务队列信息,同 uptime 命令的执行结果,分别表示系统时间:14:36:54;运行时长5:07min;登录用户数2;平均负载(load average)::每1、5、15分钟系统的平均负载值load average: 0.00, 0.01, 0.05。
- 第二行:总进程数113,正在运行1,休眠112,停止0,僵尸进程0
- 第三行:cpu状态信息,用户空间占用CPU的百分比,内核空间占用CPU的百分比,改变过优先级的进程占用CPU的百分比,空闲CPU百分比, IO等待占用CPU的百分比,硬中断占用CPU的百分比,软中断占用CPU的百分比。按1可查看CPU每个核芯的信息。
- 第四行:内存状况,总内存、未使用、已使用、缓存,可用内存=free + buffer + cached
- 第五行:swap交换分区信息,对于内存监控,如果used数值在不断变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
平均负载
- 系统负载:系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。
- 平均负载:是一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟。
Load < 0.7时:系统很闲,要考虑多部署一些服务
0.7 < Load < 1时:系统状态不错,CPU可以轻松应对
Load == 1时:系统马上要处理不多来了,赶紧找一下原因
Load > 5时:CPU已经非常繁忙了,进入CPU的进程都要无法很快的运行。
三个Load值要先看哪一个?
结合具体情况具体分析:
1)1分钟Load>5,5分钟Load<1,15分钟Load<1:短期内繁忙,中长期空闲,初步判断是一个“抖动”,或者是“拥塞前兆”
2)1分钟Load>5,5分钟Load>1,15分钟Load<1:短期内繁忙,中期内紧张,很可能是一个“拥塞的开始”
3)1分钟Load>5,5分钟Load>5,15分钟Load>5:短中长期都繁忙,系统“正在拥塞”
4)1分钟Load<1,5分钟Load>1,15分钟Load>5:短期内空闲,中长期繁忙,不用紧张,系统“拥塞正在好转”
jstack
主要是用来查看某个java进程内的线程堆栈信息
命令
jstack [-l] <pid>
(to connect to running process) 连接活动线程
jstack -F [-m] [-l] <pid>
(to connect to a hung process) 连接阻塞线程
jstack [-m] [-l] <executable> <core>
(to connect to a core file) 连接dump的文件
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server) 连接远程服务器
CPU高
public class Demo {
private static final Lock lock = new ReentrantLock();
private static final ExecutorService THREAD_POOL_EXECUTOR = Executors.newFixedThreadPool(2);
public static void main(String[] args) {
THREAD_POOL_EXECUTOR.execute(() -> {
test();
});
THREAD_POOL_EXECUTOR.execute(() -> {
test();
});
}
public static void test() {
lock.lock();
int i = 0;
while (true) {
i++;
}
}
}
- top:查看占用CPU较高的java进程。
- top -H -p pid:查看pid对应进程下占用CPU高的线程。
- printf “%x\n” pid:将十进制的线程pid转换为十六进制。
- jstack [进程PID] | grep [16进制的线程pid] -A 30
pool-1-thread-1这个线程状态为RUNNABLE,一直在执行 Demo.test(Demo.java:32)的方法,这样就定位到了对应的代码。
- 线程状态
1.RUNNABLE,线程处于执行中
2.BLOCKED,线程被阻塞
3.WAITING,线程正在等待
线程等待获取锁。