线上CPU飚高(死循环,死锁...)?帮你迅速定位代码位置 - 久赢国际平台注册网址

资讯中心 / News

当前位置: 久赢国际平台注册网址 > 产品解决方案 > 线上CPU飚高(死循环,死锁...)?帮你迅速定位代码位置

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

浏览次数: 日期:2019-04-29

 

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性能下降(阿里服务器默认不开)第六行:进程详细信息死循环构造的代码如下:这里只介绍一下用到的top参数先手动制造CPU飙高的场景,多执行几次,小编这里执行3次执行topjstack命令工具可以得到线程堆栈信息,根据这些线程堆栈信息,我们可以去检查Java程序出现的问题看到pid为23757的进程CPU占用较高,执行如下命令看看pid为23757的进程中线程的具体情况当然你也可以使用交互命令然后再输入H,效果和上面一样可以看到PID为23772,23773和23774的线程占用CPU较高这里可能有人有疑惑,为什么线程也有PID啊其实线程进程都会有自己的ID,这个ID就叫做PID,PID是不特指进程ID,线程ID也可以叫做PID将10进制的23772转为16进制,因为jstack中PID用的是16进制打开文件,搜5cdc可以看到线程一直在执行ShowTopController中的第23行,即好了定位到代码中的位置了,当然生产环境中肯定不会写一个死循环的,有可能在特殊场景下出现死循环,或执行一个方法特别慢,用这种方法很快就能找到代码位置。 死锁接着访问执行打开文件到最后。

产品解决方案

线上CPU飚高(死循环,死锁...)?帮你迅速定位代码位置 - 久赢国际平台注册网址