top基本使用:

top命令参考本篇文章

查看内存和CPU的top命令,别看输出一大堆,理解了其实很简单

top 命令运行图:

第一行:基本信息

第二行:任务信息

第三行:CPU使用情况

第四行:物理内存使用情况

buff/cache:

buffers 和 cache 都是内存中存放的数据,不同的是,buffers 存放的是准备写入磁盘的数据,而 cache 存放的是从磁盘中读取的数据

在Linux系统中,有一个守护进程(daemon)会定期把buffers中的数据写入的磁盘,也可以使用 sync 命令手动把buffers中的数据写入磁盘。使用buffers可以把分散的 I/O 操作集中起来,减少了磁盘寻道的时间和磁盘碎片。

cache是Linux把读取频率高的数据,放到内存中,减少I/O。Linux中cache没有固定大小,根据使用情况自动增加或删除。

第五行:交换区使用情况

Swap(内存交换区):

是硬盘上的一块空间。在内存不足的情况下,操作系统把内存中不用的数据存到硬盘的交换区,腾出内存来让别的程序运行。因此,开启swap会一定程度的引起 I/O 性能下降(阿里服务器默认不开)

第六行:进程详细信息

死循环

构造的代码如下:

@RestController
@RequestMapping("top")
public class ShowTopController {private Object lock1 = new Object();
 private Object lock2 = new Object();
@RequestMapping("test")public String test() {return "success";
 }@RequestMapping("loop")public String loop() {System.out.println("start");
 while (true) {}}@RequestMapping("deadlock")public String deadlock() {new Thread(() -> {synchronized (lock1) {try{TimeUnit.SECONDS.sleep(1);
 } catch (Exception e) {}synchronized (lock2) {System.out.println("thread1 over");
 }}}).start();
new Thread(() -> {synchronized (lock2) {try{TimeUnit.SECONDS.sleep(1);
 } catch (Exception e) {}synchronized (lock1) {System.out.println("thread2 over");
 }}}).start();
return "success";
 }}

这里只介绍一下用到的top参数

参数选项名称

含义

p

通过指定进程ID(PID)来仅仅监控某个进程的状态。可以指定多个,-pN1 -pN2 … (-p N1 -p N2…也可)或者 -pN1,N2,N3 …(-p N1,N2…也可)

H

显示所有线程的运行状态指标。如果没有该参数,会显示一个进程中所有线程的总和。在运行过程中,可以通过H命令进行交互控制

先手动制造CPU飙高的场景,多执行几次,小编这里执行3次

curl localhost:8080/top/loop

执行top

jstack命令工具可以得到线程堆栈信息,根据这些线程堆栈信息,我们可以去检查Java程序出现的问题

看到pid为23757的进程CPU占用较高,执行如下命令

jstack 23757 > loop.txt

看看pid为23757的进程中线程的具体情况

top -p 23757 -H

当然你也可以使用交互命令

top -p 23757

然后再输入H,效果和上面一样

可以看到PID为23772,23773和23774的线程占用CPU较高

这里可能有人有疑惑,为什么线程也有PID啊?其实线程进程都会有自己的ID,这个ID就叫做PID,PID是不特指进程ID,线程ID也可以叫做PID

将10进制的23772转为16进制,因为jstack中PID用的是16进制

printf "%x" 23772
输出5cdc

打开loop.txt文件,搜5cdc

可以看到线程一直在执行ShowTopController中的第23行,即

while (true) {}

好了定位到代码中的位置了,当然生产环境中肯定不会写一个死循环的,有可能在特殊场景下出现死循环,或执行一个方法特别慢,用这种方法很快就能找到代码位置。

死锁

接着访问

curl localhost:8080/top/loop

执行

jstack 23757 > loop.txt

打开loop.txt文件到最后

看到发现一个死锁,死锁代码的位置描述的很清楚,生产环境发生的死锁当然没有这么简单,所有学会用这些命令排查还是很有必要的

文章来源

转载于:https://www.cnblogs.com/luchangjiang/p/10468449.html

线上CPU飚高(死循环,死锁……)?帮你迅速定位代码位置相关推荐

  1. 线上cpu飙高,死锁查询

    线上 cpu 飚高如何排查 命令行: 第一步,top 先看看是哪个进程 找到 cpu占用最高的,如果是 java 然后用, 第二步:jstat 进程 id 得到当前进程下,所有运行的线程,然后找到占用 ...

  2. 你要偷偷学会排查线上 CPU 飙高的问题,然后惊艳所有人!

    作者 l Hollis 来源 l Hollis(ID:hollischuang) 前段时间我们新上了一个新的应用,因为流量一直不大,集群QPS大概只有5左右,写接口的rt在30ms左右. 因为最近接入 ...

  3. docker容器cpu高问题排查_干货详解:一文教你如何利用阿里开源工具,排查线上CPU居高问题...

    前言 在我们开发过程中,无法避免的会出现所谓的垃圾代码,导致服务器的CPU一直处于100%.但我们应用已经上线,导致服务器CPU居高,但又不知道哪边出现的问题,我们应该怎么去找出哪边的代码出现问题呢? ...

  4. 线上CPU飙高诊断定位

    1. 先准备一段java程序,后台运行 2. 使用 top命令查看cpu的进程使用情况 在这里看到了一个进程占据了99.3%的cpu利用率,这显然是出现了cpu飙升的情况,这会到期系统其他进程得不到c ...

  5. 记一次线上CPU过高的问题以及处理方案

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦.

  6. 简单的cpu飚高问题定位脚本

    老司机在定位和解决问题时都有着自己的一套方法论,总不能老踩一些重复的坑是吧.老司机一般多少都遇到过服务器cpu飚高的问题,定位问题的方法网上文章多如牛毛,现这里再总结一下,对于混部多个Java应用的服 ...

  7. Java 线上cpu占用过高分析

    转载于:https://blog.csdn.net/ch999999999999999999/article/details/113151519 感谢作者:ch999999999999999999 J ...

  8. [JVM]线上CPU负载持续飙高的问题解决

    [JVM]线上CPU负载持续飙高的问题解决 参考文章: (1)[JVM]线上CPU负载持续飙高的问题解决 (2)https://www.cnblogs.com/zhengwangzw/p/115465 ...

  9. 线上CPU负载过高处理

    一.背景 线上CPU报警 占用率过 90% 告警了一晚上 第二天才处理的. 二.处理 1.top 命令 使用 top 命令查看后,load average 也是超负荷的状态,用户态的CPU占比 确实很 ...

最新文章

  1. VBA word 文件类型html,vba设置word文档的格式
  2. ServiceLoader跟DriverManager使用总结
  3. 转发和重定向的区别是什么
  4. Mysql 会导致锁表的语法
  5. 二阶矩阵乘法C语言,c语言矩阵相乘
  6. java怎么实现tab切换_[Java教程]用javascript实现tab切换
  7. python如何请求curl_Python爬虫偷懒神器 —— 一键构造请求头!
  8. Ubuntu安装sqllite3并使用
  9. python logging打印终端_想知道Python如何在终端上打印表格吗?两行代码告诉你!
  10. 13、图灵机器人能力
  11. 浅谈机顶盒破解之修改开机画面 修改开机动画 修改系统app 去掉认证app
  12. 聚类算法小结(1)——K均值聚类算法
  13. 把mysql一个表的部分或全部数据复制追加到另一个表的方法
  14. 4种常见的嵌入式开发系统
  15. python自动获取北京时间_python将当前服务器的时区时间转为北京时间
  16. 2020年中国无缝钢管行业发展现状及竞争格局分析,天津钢管产量领先,居国内首位「图」
  17. 读书笔记app推荐——只为让你的生活更高效
  18. 教你怎么不添加付款方式订阅苹果arcade
  19. ios7新特性--4
  20. Linux下安装JDK教程,老爷爷看了都说会了!

热门文章

  1. 4 读写文件_块存储、文件存储、对象存储的区别
  2. mongo执行逻辑表达式_MongoDB 常用查询操作
  3. 最简单的c语言的编程题目,编程列入考题
  4. java 数据库转储_从源控制数据库驱动的应用程序所需的转储开始?
  5. centos 查找nginx_centos7肿么查看已经安装nginx
  6. 疯子的算法总结(四)贪心算法
  7. python 中的static-method (静态函数), classmethod(类函数 ), 成员函数
  8. visual c++ build tools的安装与使用
  9. 2019年那些匆忙入市的朋友现在都赚到钱了吗?
  10. 网贷申请技巧,提高90%通过率