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

top基本使用:

top命令参考本篇文章

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

top 命令运行图:

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

 

第一行:基本信息

 

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

 

 

第二行:任务信息

 

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

 

 

第三行:CPU使用情况

 

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

 

 

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

 

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

 

 

buff/cache:

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

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

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

第五行:交换区使用情况

 

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

 

 

Swap(内存交换区):

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

第六行:进程详细信息

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

 

 

死循环

构造的代码如下:

@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

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

 

 

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

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

jstack 23757 > loop.txt

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

top -p 23757 -H
线上CPU飚高(死循环,死锁……)?帮你迅速定位代码位置

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

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

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

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

while (true) {}

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

死锁

接着访问

curl localhost:8080/top/loop

执行

jstack 23757 > loop.txt

打开loop.txt文件到最后

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

 

 

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

 

文章来源

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper watch笔记

ZK其核心原理满足CP, 实现的是最终一致性, 它只保证顺序一致性. zookeeper 基于 zxid 以及阻塞队列的方式来实现请求的顺序一致性。如果一个client连接到一个最新的 follower 上,那么它 read 读取到了最新的数据,然后 client 由于网络原因重新连接到 zoo…

单机简单搭建一个kafka集群(没有进行内核参数和JVM的调优)

1.JDK安装 在我的部署单节点kafka的博客里有相关的方法。(https://www.cnblogs.com/ToBeExpert/p/9789486.html )zookeeper和kafka的压缩包下载地址也在单节点部署的这篇博客里。 1.zookeeper集群的搭建 将zookeeper.tar.gz解压为三个目录,例…

[翻译]三张卡片帮你记住TDD的基本原则

原文地址:http://blog.briandicroce.com/2008/03/14/three-index-cards-to-easily-remember-the-essence-of-test-driven-development/ 当我浏览ObjectMentor的博客的时候,其中一篇Tim Ottinger的“TDD on Three Index Cards”引起了我的注意。他回忆了他…

凉哥核心圈程序员必备十大图书推荐(一)

写在前面 凉哥核心圈程序员必备十大图书推荐(一),各位伙伴应该一目了然了哈,没错凉哥准备出一系列图书推荐的文章,其实很多朋友在私下问凉哥除了大学的课程外自己要不要读一些技术类的书籍呢,答案当时要的…

了解大数据的特点、来源与数据呈现方式

本次作业来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2639 1.浏览2019春节各种大数据分析报告,例如: 这世间,再无第二个国家有能力承载如此庞大的人流量。http://www.sohu.com/a/290025769_313993春节人口迁…

强大而优雅,API 研发管理 EOLINKER 新版正式发布!

EOLINKER 于2019年3月3日正式发布新版本!该版本大幅强化各个产品的功能、着重优化了全站的用户交互体验,并且EOLINKER AMS 产品正式更名为 EOLINKER API Studio ——API 工作室,旨在为您提供API文档管理、自动化测试以及开发协作等全方位服务…

MATLAB 与 Excel 接口

MATLAB 与 Excel 接口MATLAB 与 Excel 有两种接口方式:一种是通过 MATLAB 提供的 Excel 生成器,生成220 MATLAB 实用教程DLL 组件和 VBA 代码,实现 Excel 对 MATLAB 的调用;另一种是利用 MATLAB 提供的 Excellink 插件&#xff0c…

计算 1+2!+3!+4!+...20!=?

package algs.factorial;import java.math.BigInteger;/*** Author: areful* Date: 2019/3/6* 计算 sum(n!), n1,2, ... 20*/ public class NFactorial {public static void main(String[] args) {System.out.println(calcFactorial0(3));System.out.println(calcFactorial1(3)…

区块链基础语言(三)——Go语言开发工具

一、在Windows系统安装Goland 1.1 下载 官网地址&#xff1a;https://www.jetbrains.com/go/download/#sectionwindows 1.2 安装 a. 双击“goland-2018.1.5.exe”&#xff0c;单击“运行”&#xff0c;如图1所示&#xff1b; <图1> b. 如图2所示&#xff0c;单击“next”…

准备重新开始写了

工作很忙,而且前一段时间项目组由于方向和人员调整一直很动荡,所以就没有心情和时间来整理技术.准备重新开张了,好好写,争取每个月出一到两篇说得过去的文章.转载于:https://www.cnblogs.com/sun/archive/2008/06/12/1218220.html

Georgia and Bob POJ - 1704 阶梯Nim

$ \color{#0066ff}{ 题目描述 }$ Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, number the grids from left to right by 1, 2, 3, ..., and place N chessmen on different grids, as shown in the following figure for exampl…

Tomcat总结

Tomcat调优原理&#xff1a; 1、增加最大连接数&#xff08;增大值避免队列请求过多&#xff0c;导致响应缓慢&#xff09; 2、调整工作模式 Bio(BlockingI/O)&#xff1a;默认工作模式&#xff0c;阻塞式I/O操作&#xff0c;没有任何优化技术处理&#xff0c;性能比较低。Nio(…

JVM的监控工具之jstack

参考博客&#xff1a;https://www.jianshu.com/p/213710fb9e40 jstack&#xff08;Stack Trace for Java&#xff09;命令用于生成虚拟机当前时刻的线程快照&#xff08;一般称为threaddump或者javacore文件&#xff09;。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈…

liunx驱动----异步通知

查询&#xff1a;消耗资源 中断&#xff1a;read 一直要去读poll &#xff1a;指定起始时间异步通知signal 测试程序include <stdio.h> include <signal.h>void my_signal(int signum) {static unsigned int cnt;printf("signum %d, %d timer\n",signum…

Niginx 集群负载均衡策略

Niginx 集群负载均衡策略 所需物料 1.Nginx服务 步骤略 本人 nginx version: nginx/1.16.0 2.Java Servlet 测试项目 新建java web 项目&#xff0c;项目名称为&#xff1a;tt import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annot…

记号一次更换IBM X3650M4主板后RAID无法启动的解决

https://wenku.baidu.com/view/9d503ef367ec102de2bd89d7.html 强烈感谢上面分享文档的大侠&#xff01;&#xff01; 1、更换主板后&#xff0c;linux系统&#xff0c;无法加载引导。需要设置主板的启动项 2、选择boot manager&#xff0c;进到下面的画面 3、选择add boot opt…

WCF basicHttpBinding之Message Security Mode

原创地址&#xff1a;http://www.cnblogs.com/jfzhu/p/4067873.html 转载请注明出处 前面的文章《WCF Security基本概念》介绍了WCF的security mode&#xff0c;简单说Transport是transport级别上的加密&am…

云计算学习资料分享:type查看命令

type 查看命令类型&#xff0c;例如该命令是alias&#xff0c;还是内置命令&#xff0c;还是某个文件&#xff0c;还是关键字 哪种神仙&#xff1a;天上还是地上&#xff0c;还是水里游的 [roottianyun ~]# type ll ll is aliased to ls -l --colorauto [roottianyun ~]# type …

关于83版射雕英雄传

今天无意中看到网上一群人关于83版射雕的一些争论.或许一些现在的年轻人不喜欢83版射雕,说那太老土了,但想想那个时代的条件,能拍出这样的片子,是非常不错的,而且我觉得83版射雕也是最忠于原著的,跟后来的翻版比较,虽然从画面效果,人物服装方面存在差距,但这都是由于历史原因和…

电子书下载:Programming Microsoft LINQ in Microsoft .NET Framework 4

Book DescriptionDig into LINQ — and transform the way you work with data. With LINQ, you can query data from a variety of sources — including databases, objects, and XML files — directly from Microsoft Visual Basic or C#. Guided by data-access experts w…