【Java】 服务器cpu过高如何排查和解决?

文章目录

  • 前言
  • 一、常见能够引起CPU100%异常的情况都有哪些?
  • 二、服务器CPU使用率飙升异常,黄金4步排查法
  • 三、排查 CPU 故障的常用命令
  • 四、什么场景会造成 CPU 低而负载确很高呢?
  • 五、监控发现线上机器内存占用率居高不下,如何分析进行优化?

前言

对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考讨论提高。

线上系统突然运行缓慢,CPU飙升,甚至到100%,以及Full GC次数过多,接着就是各种报警:例如接口超时报警等。此时急需快速线上排查问题。

不管什么问题,既然是CPU飙升,肯定是查一下耗CPU的线程,然后看看GC。

一、常见能够引起CPU100%异常的情况都有哪些?

  1. Java 内存不够或者溢出导致GC overhead limit exceeded。

  2. 代码中互相竞争导致的死锁。

  3. 特别耗费计算资源的操作,比如正则匹配,Java中的正则匹配默认有回溯问题,复杂的正则匹配引起的CPU异常。

  4. 死循环引起的CPU高度密集计算。
    针对第1种,根据Oracle官方资料,GC overhead limit exceeded表示JVM一直在GC导致应用程序变慢,具体量化指标就是JVM执行垃圾回收花费超过98%的时间,但释放出的可用堆内存却少于2%,连续多次(一般5次)GC回收的内存都不足2%的情况下就会抛出此异常。

经过垃圾回收每次释放的内存都少于2%很容易又被新生对象填满,JVM快速进入下一次垃圾回收,无限循环,由此引起频繁的GC长期消耗我们服务器CPU资源,从而使CPU使用率达到100%

我们可以使用-XX:-UseGCOverheadLimit这个参数关闭GC overhead limit exceeded,但这样治标不治本,建议检查应用程序的内存使用是否合理以及是否需要增加堆内存。

二、服务器CPU使用率飙升异常,黄金4步排查法

  1. TOP命令找到占用CPU高的Java进程PID

    top

    在这里插入图片描述

  2. 根据进程ID找到占用CPU高的线程

    ps -mp pid -o THREAD,tid | sort -r

    在这里插入图片描述

  3. 将指定的线程ID输出为16进制格式

    printf “%x\n” tid
    在这里插入图片描述

  4. 根据16进制格式的线程ID查找线程堆栈信息

jstack pid |grep tid -A 50

在这里插入图片描述

获取到线程堆栈信息就好办了,以上即是采用单线程模拟一个复杂的正则匹配的堆栈示例图,可以看得出线程都在指向regex.Pattern,在生产多线程环境下这个复杂正则匹配会导致CPU利用率奇高。

三、排查 CPU 故障的常用命令

  • top:Linux 命令。可以实时查看各个进程的 CPU 使用情况。也可以查看最近一段时间的 CPU 使用情况。默认按 CPU 使用率排序。
  • ps:Linux 命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前 CPU 使用情况。属于当前状态的采样数据。
  • jstack:Java 提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
  • pstack:Linux 命令。可以查看某个进程的当前线程栈运行情况。

四、什么场景会造成 CPU 低而负载确很高呢?

负载总结为一句话就是:需要运行处理但又必须等待队列前的进程处理完成的进程个数。具体来说,也就是如下两种情况:

等待被授权予 CPU 运行权限的进程、等待磁盘 I/O 完成的进程。

CPU 低而负载高也就是说等待磁盘 I/O 完成的进程过多,就会导致队列长度过大,这样就体现到负载过大了,但实际是此时 CPU 被分配去执行别的任务或空闲,具体场景有如下几种:

  1. 数据库抖动,造成线程队列 hang 住,负载升高
  2. 磁盘读写请求过多就会导致大量 I/O 等待。CPU 的工作效率要高于磁盘,而进程在 CPU 上面运行需要访问磁盘文件,这个时候 CPU 会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候会切换到其他进程或者空闲,这个任务就会转换为不可中断睡眠状态。当这种读写请求过多就会导致不可中断睡眠状态的进程过多,从而导致负载高,CPU 低的情况。
  3. 外接硬盘故障,常见有挂了 NFS,但是 NFS server 故障比如系统挂载了外接硬盘如 NFS 共享存储,经常会有大量的读写请求去访问 NFS 存储的文件,如果这个时候 NFS Server 故障,那么就会导致进程读写请求一直获取不到资源,从而进程一直是不可中断状态,造成负载很高。

五、监控发现线上机器内存占用率居高不下,如何分析进行优化?

  1. 使用top -p pid针对所要查的 pid 查看该进程的 CPU 和内存以及负载情况。
  2. jmap -histo:live [pid],然后分析具体的对象数目和占用内存大小,从而定位代码。
  3. jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用 MAT 工具分析是否存在内存泄漏等等。

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

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

相关文章

网络性能测试诊断参考工具表

性能指标工具说明吞吐量(BPS)sar nethogs iftop分别可以查看网络接口、进程以及 IP 地址的网络吞吐量PPSsar /proc/net/dev查看网络接口的 PPS连接数netstat ss查看连接数延迟ping hping3通过 ICMP、TCP 等测试网络延迟连接跟踪数conntrack查看和管理连接…

django groupby踩坑

django groupby踩坑 前言坑 ~~参考~~ 前言 django的orm作为简单查询 使用简直是太爽了,所见即所得,但是groupby时候缺有一些坑点 坑 from django.db.models import Count from w.models import www # 在不加order by的时候 会默认按照id分组 print(TaskPort.obje…

webpack require.context

require.context((directory: String),(includeSubdirs: Boolean) /* 可选的,默认值是 true */,(filter: RegExp) /* 可选的,默认值是 /^\.\/.*$/,所有文件 */,(mode: String) /* 可选的, sync | eager | weak | lazy | lazy-onc…

RPA界面元素定位与操控技术详解-达观数据

RPA 入门介绍 什么是 RPA?RPA 是机器人流程自动化 Robotic Process Automation 的简写。在《智能RPA实战》中,我们这样定义:通过特定的、可模拟人类在计算机界面上进行操作的技术,按照规则自动执行相应的流程任务,代替…

【Ubuntu】完全卸载通过deb包安装的jenkins

要完全卸载通过Deb包安装的Jenkins,可以按照以下步骤操作: 停止Jenkins服务:首先,停止Jenkins服务,以确保它不再运行。 sudo systemctl stop jenkins禁用Jenkins服务:将Jenkins服务设置为在系统启动时不自动…

Linux QT通过NFS挂载到Linux开发板上

Linux QT通过NFS挂载到Linux开发板上 说明:这里使用的Linux开发板是正点原子的阿尔法开发板 创建NFS 环境 NFS简介 网络文件系统,英文 Network File System(NFS),是由 SUN 公司研制的 UNIX 表示层协议 (presentation layer protocol)&…

【面试】MySQL 中InnoDB与MyISAM的区别是什么?

文章目录 前言一、数据库存储引擎二、如何知道自己的数据库用的什么引擎呢?三、存储引擎原理四、B 树和 B 树五、MyISAM六、InnoDB七、InnoDB与MyISAM的区别总结 前言 许多同学都把 MySQL 作为自己的数据库,但是可能用过最多的就是 SQL 语句&#xff0c…

【图像分类】基于LIME的CNN 图像分类研究(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 💥1 概述 基于LIME(Local Interpretable Model-Agnostic Explanations)的CNN图像分类研究是一种用于解释CNN模型的方法。LIME是一…

redis作为缓存的选用及优缺点

Redis vs. Memcached: 持久化支持: Redis支持两种持久化方式(RDB和AOF),而Memcached不支持持久化。这意味着Redis可以在服务器重启后恢复数据,而Memcached在重启后数据会丢失。 数据结构: Redis的数据结构…

安装nvm 切换node版本

1. 安装 nvm curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash 验证nvm安装完成 command -v nvm 如果安装完成,就会显示如下 nvm 2. 查看 nvm 可以安装的 node 版本 查看可以安装的版本 nvm ls-remote 查看所有可以安装的…

SpringBoot启动时通过启动参数指定logback的位置

虽然springboot可以通过简单的配置使用日志系统,但是由于业务往往很复杂,对日志的多样性配置要求比较高,还是习惯于依赖于logback框架本身的配置文件。在spring boot中,使用logback配置的方式常用的有以下几种: 第一种…

【javaSE】 程序逻辑控制练习代码

目录 练习1 练习2 练习3 练习4 练习5 练习6 练习7 练习8 练习9 总结 练习1 根据年龄, 来打印出当前年龄的人是少年(低于18), 青年(19-28), 中年(29-55), 老年(56以上) import java.util.Scanner;public class Age {public static void main(String[] args) {Scanner…

node中间件-express框架

文章目录 前置 Express安装1. 基本使用2. 中间件2.1 中间件应用 3. 中间件的注册方式3.1 普通中间件的注册3.2 path匹配中间件3.3 method与路径匹配3.4 案列中间件匹配与执行方法 4. 中间件request数据解析4.1 解析request body中间件4.2 urlencoded解析 5. 第三方中间件5.1 mo…

echarts图表如何自定义鼠标悬浮样式

样式调整 // formatter: {a}: {b}<br />{c}: {d}: {e} formatter: function (params) {// <i style"display:inline-block;border-radius:50%;width:4px;height:4px;background-color: #0ECB81;"></i>// ${console.log(params[0])}return <d…

android studio JNI开发

一、JNI的作用&#xff1a; 1.使Java与本地其他类型语言&#xff08;C、C&#xff09;交互&#xff1b; 2.在Java代码调用C、C等语言的代码 或者 C、C调用Java代码。 由于JAVA具有跨平台的特点&#xff0c;所以JAVA与本地代码的交互能力弱&#xff0c;采用JNI特性可以增强JA…

【收藏】用Vue.js来构建你的Web3应用,就像开发 Web2 一样熟悉

作为一名涉足去中心化网络的前端 JavaScript 开发人员&#xff0c;您可能遇到过许多 Web3 开发解决方案。但是&#xff0c;这些解决方案通常侧重于钱包集成和交易执行&#xff0c;这就造成了学习曲线&#xff0c;偏离了熟悉的 Web2 开发体验。 但不用担心&#xff01;有一种解…

算法工程师-机器学习面试题总结(1)

一、机器学习相关 1.基本概念 1-1 损失函数是什么&#xff0c;如何定义合理的损失函数&#xff1f; 损失函数是在机器学习和优化算法中使用的一种衡量模型预测结果与真实值之间差异的函数。其目标是最小化模型的预测误差&#xff0c;从而提高模型的性能。 定义合理的损失函…

导读页——记忆之路

记忆方法千千种&#xff0c;本栏意在梳理其中道道来&#xff0c;旦有小得&#xff0c;肥肠幸耶。从不同角度分析学习记忆。 文章目录 按方法分按有无逻辑分有逻辑用思维导图 无逻辑用记忆宫殿理论模仿借鉴 按方法分 学习方法–找书&#xff0c;背书&#xff0c;利器 按有无逻…

Logback解析和实例

文章目录 1、概念2、相关依赖3、基于springboot的日志搭建3.1、yml或properties 配置3.2、 logback-spring.xml 详解3.2.1、appender 解析3.2.1.1、ConsoleAppender-控制台打印3.2.1.2、FileAppender-日志输出到文件3.2.1.3、RollingFileAppender-滚动记录并输出文件3.2.1.4、f…

8.3Java EE——基于XML的AOP实现

使用AOP代理对象的好处 因为Spring AOP中的代理对象由IoC容器自动生成,所以开发者无须过多关注代理对象生成的过程,只需选择连接点、创建切面、定义切点并在XML文件中添加配置信息即可。 Spring提供了一系列配置Spring AOP的XML元素。 配置Spring AOP的XML元素 元素 描述 &l…