建站不啰嗦,上手跟我做(十六)查看 cpu 占用

找到最耗 CPU 的进程

使用工具:top
方法:

  • 执行 top -c ,显示进程运行信息列表
  • 键入 P (大写 p),进程按照 CPU 使用率排序
[root@localhost ~]# top -c

图示:
图片.png
如上图,最耗 CPU 的进程 PID 为 7283

找到最耗 CPU 的线程

工具:top
方法:

  • top -Hp 7283 ,显示一个进程的线程运行信息列表
  • 键入 P (大写 p),线程按照 CPU 使用率排序
[root@localhost ~]# top -Hp 7283

图示:
图片.png

将线程 PID 转化为 16 进制

工具:printf
方法:printf “%x” 7299

[root@localhost ~]# printf “%x” 7299
“1c83”

图片.png

查看堆栈,找到线程在做什么

工具:pstack/jstack/grep
方法:

[root@localhost ~]# jstack 7283  | grep '0x1c83' -C5 --color
  • 打印进程堆栈
  • 通过线程 id,过滤得到线程堆栈

图示:
图片.png

分析

由上图我们可以看到是 TestApplication 类中的 lambdaSmain 在消耗 cpu 对应的资源,我们找到对应的类看看这里在执行什么操作

package test.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@SpringBootApplication
public class TestApplication {
	public static void main(String[] args) {
		SpringApplication.run(TestApplication.class, args);
		final ExecutorService executorService = Executors.newScheduledThreadPool(10);
		executorService.execute(()->{
			for(int i=0;i<100;i++){
				Long longNumber=0L;
				while(longNumber<Long.MAX_VALUE){
					longNumber++;
				}
				while(longNumber>Long.MIN_VALUE){
					longNumber--;
				}
			}
		});
	}

}

这里是为了测试 cpu 写的一个耗资源操作,操作量的确很大。
图示:
图片.png
对照上图我们可以发现在 linux 中已经写的很明确了。
TestApplication 第 18 行 lambdaSmain 中在做操作。
上一篇 建站不啰嗦,上手跟我做(十五)查看磁盘 IO
目录
下一篇 建站不啰嗦,上手跟我做(十七)Kafka 集群部署