java接口经常变动前端怎么办_Java进程故障排查(CPU资源占用高,接口响应超时,功能接口停滞等)...

故障分析

# 导致系统不可用情况(频率较大):

1)代码中某个位置读取数据量较大,导致系统内存耗尽,进而出现Full GC次数过多,系统缓慢;

2)代码中有比较消耗CPU的操作,导致CPU过高,系统运行缓慢;

# 导致某功能运行缓慢(不至于导致系统不可用):

3)代码某个位置有阻塞性的操作,导致调用整体比较耗时,但出现比较随机;

4)某线程由于某种原因进入WAITTING状态,此时该功能整体不可用,但无法复现;

5)由于锁使用不当,导致多个线程进入死锁状态,导致系统整体比较缓慢。

# 说明

对于后三种情况而言,是具有一定阻塞性操作,CPU和系统内存使用情况都不高,但功能却很慢,所以通过查看资源使用情况是无法查看出具体问题的!

应急处理

###对于线上系统突然产生的运行缓慢问题,如果导致线上系统不可用。首先要做的是导出jstack和内存信息,重启服务器,尽快保证系统的高可用。

### 导出jstack信息

为避免重复赘述,此操作将在后面的”排查步骤”章节中体现!

### 导出内存堆栈信息

# 查看要导出的Java项目的pid

# jps -l

or

# ps -ef |grep java

# 导出内存堆栈信息

jmap -dump:live,format=b,file=heap8 # heap8是自定义的文件名

# 运行导出的堆栈文件

# ls

heap8

# hostname -I

10.2.2.162

# jhat -port 9998 heap8

# 浏览器访问http://10.2.2.162:9998/

ba42b25667598d20cd3f3250a2391bb7.png

排查步骤

# 环境说明

因平台做了线上推广,导致管理平台门户网页进统计页面请求超时,随进服务器操作系统查看负载信息,load average超过了4,负载较大,PID为7163的进程cpu资源占用较高。

452545884b7d97bd281f95dfff311a3f.png

# 定位故障

# 处理思路:

找出CPU占用率高的线程,再通过线程栈信息找出该线程当时正在运行的问题代码段。

# 操作如下:

# 查看高占用的”进程”中占用高的”线程”

# top -Hbp 7163 | awk ‘/java/ && $9>50’

efa381a6bf770ff59ec9b1ddfdaa8976.png

# 将16298的线程ID转换为16进制的线程ID

# printf “%x\n” 16298

3faa

# 通过jvm的jstack查看进程信息并保存以供研发后续分析

# jstack 7163 | grep “3faa” -C 20 > 7163.log

# 重点说明

通过排查步骤,可得排查问题需要掌握的信息如下:

1)资源占用高对应的进程a的PID;

2)进程a对应的资源占用高且最频繁的线程b的ID;

3)将线程b的ID转换为16进制的ID。

数据库问题引发的资源占用过高

## 通过”排查步骤”章节可基本定位问题,后续请见下文!

确认问题及处理

# jstack $pid | grep “3faa” -C 20 # 3faa指的是高占用进程中的高占用的线程对应的16进制id;

62dfffebb8ba358ba7a2d9c927755d53.png

# 查看到是数据库的问题,排查思路:先打印所有在跑的数据库线程,检查后发现并跟进情况找到问题表;

# 打印MySQL现有进程信息文件

# mysql -uroot -p -e “show full processlist” > mysql_full_process.log

# 过滤出查询最多的表

grep Query mysql_full_process.log

# 统计查询最多的表的数据量

> use databases_name;

> select count(1) from table_name;

# 结合MySQL日志信息,可判断问题是查询时间过长导致,排查后发现表未创建索引;

> show create table table_name\G

# 询问研发,确认数据不重要,检查字段由时间字段,根据时间确认只保留一个月的数据;

> delete from table_name where xxxx_time < ‘2019-07-01 00:00:00’ or xxxx_time is null;

# 创建索引

> alter table table_name add index (device_uuid);

# 确认索引是否创建

> show create table table_name;

总结

处理后进程的CPU占用降至正常水平,本次排查主要用到了jvm进程查看及dump进程详细信息的操作,确认是由数据库问题导致的原因,并对数据库进行了清理并创建了索引。

在处理问题后,又查询了一下数据库相关问题的优化,通常的优化方法还是添加索引。该方法添加参数具体如下:

innodb_buffer_pool_size=4G

Full GC次数过多

## 通过”排查步骤”章节可基本定位问题,后续请见下文!

确认问题及处理

# 特征说明

对于Full GC较多的情况,有以下特征:

1)进程的多个线程的CPU使用率都超过100%,通过jstack命令可看到大部分是垃圾回收线程;

2)通过jstat查看GC情况,可看到Full GC次数非常多,并数值在不断增加。

# 3faa指的是高占用进程中的高占用的线程对应的16进制id;

# jstack $pid | grep “3faa” -C 20

c20f000f6f8c037d0b82cc8515ba42ff.png

说明:VM Thread指垃圾回收的线程。故基本可确定,当前系统缓慢的原因主要是垃圾回收过于频繁,导致GC停顿时间较长。

# 查看GC情况(1000指间隔1000ms,4指查询次数)

# jstat -gcutil $pid 1000 4

9624f276547917d4c30eda8150505e52.png

说明:FGC指Full GC数量,其值一直在增加,图中显现高达6783,进一步证实是由于内存溢出导致的系统缓慢。

# 因笔者是运维,故确认了问题后,Dump内存日志后交由研发解决代码层面问题!

总结

# 对于Full GC次数过大,主要有以下两种原因:

1)代码中一次性获取大量对象,导致内存溢出(可用Eclipse的Mat工具排查);

2)内存占用不高,但Full GC数值较大,可能是显示的System.gc()调用GC次数过多,可通过添加 -XX:+DisableExplicitGC 来禁用JVM 对显示 GC 的响应。

服务不定期出现接口响应缓慢

情况说明

某个接口访问经常需要3~4s甚至更长时间才能返回。一般而言,其消耗的CPU和内存资源不多,通过上述方式排查问题无法行通。

由于接口耗时较长问题不定时出现,导致通过jstack命令得到线程访问的堆栈信息,根据其信息也不一定能定位到导致耗时操作的线程(概率事件)。

定位思路

在排除网络因素后,通过压测工具对问题接口不断加大访问力度。当该接口中有某个位置是比较耗时的,由于访问的频率高,将导致大多数的线程都阻塞于该阻塞点。

通过分析多个线程日志,能得到相同的TIMED_WAITING堆栈日志,基本上就可定位到该接口中较耗时的代码的位置。

# 示例

# 代码中有比较耗时的阻塞操作,通过压测工具得到的线程堆栈日志,如下:

6a67322df53b22dc164d29555345c707.png

说明:由图可得,多个线程都阻塞在了UserController的第18行,说明此时一个阻塞点,也是导致该接口较缓慢的原因。

大总结

# 总体性的分析思路

当Java应用出现问题时,处理步骤如下:

通过 top 命令定位异常进程pid,再 top -Hp 命令定位出CPU资源占用较高的线程的id,并将其线程id转换为十六进制的表现形式,再通过 jstack | grep 命令查看日志信息,定位具体问题。

# 此处根据日志信息分析,可分为两种情况,如下:

# A情况

A.a)若用户线程正常,则通过该线程的堆栈信息查看比较消耗CPU的具体代码区域;

A.b)若是VM Thread,则通过 jstat -gcutil 命令查看当前GC状态,然后通过 jmap -dump:live,format=b,file= 导出当前系统内存数据,用Eclipse的Mat工具进行分析,进而针对比较消耗内存的代码区进行相关优化。

# B情况

若通过top命令查看到CPU和内存使用率不高,则可考虑以下三种情况。

B.a)若是不定时出现接口耗时过长,则可通过压测方式增大阻塞点出现的概率,从而通过jstack命令查看堆栈信息,找到阻塞点;

B.b)若是某功能访问时突然出现停滞(异常)状况,重启后又正常了,同时也无法复现。此时可通过多次导出jstack日志的方式,对比并定位出较长时间处于等待状态的用户线程,再从中筛选出问题线程;

B.c)若通过jstack命令查看到死锁状态,则可检查产生死锁的线程的具体阻塞点,进而相应处理。

作者:卡子火

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

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

相关文章

使用java实现面向对象编程第二章_java面向对象编程——第二章 java基础语法

第二章java基础语法1、java关键字abstractbooleanbreakbytecasecatchcharclassconstcontinuedefaultdodoubleelseextendsassertfinalfinallyfloatforgotoifimplementsimportinstanceofintinterfacelongnativenewstrictfppackageprivateprotectedpublicreturnshortstaticsupersw…

用java实现楼层导航_JS实现网站楼层导航效果代码实例

壹 ❀ 引言对于楼层导航而言&#xff0c;还有个重要的功能就是&#xff0c;随着滚动条滚动&#xff0c;达到某层时得同步点亮楼层导航的小图片。由于我前面也说了不打算使用JQ&#xff0c;所以想着用JS去实现它&#xff0c;实现并不难&#xff0c;主要得弄清滚动满足怎样的条件…

费尔马小定理素数java_利用费马小定理判断素数

今天听了ljss神犇的数论课&#xff0c;顿时感觉————我真的是太弱啦&#xff01;我只能稍微写一下我能听懂的部分orz那么这就是今天我为数不多能听懂一点的之一......QAQ首先先介绍今天的主角&#xff1a;费马小定理————转自维基百科没看懂的话我稍微解释一下&#xff0…

java aspectj_AspectJ基本用法

AOP虽然是方法论&#xff0c;但就好像OOP中的Java一样&#xff0c;一些先行者也开发了一套语言来支持AOP。目前用得比较火的就是AspectJ了&#xff0c;它是一种几乎和Java完全一样的语言&#xff0c;而且完全兼容Java(AspectJ应该就是一种扩展Java&#xff0c;但它不是像Groovy…

php json to object,PHP JSON_FORCE_OBJECT函数实现强转对象

JSON_FORCE_OBJECT在多级数组中&#xff0c;JSON_FORCE_OBJECT会将所有嵌套数值数组编码为对象。如果你只关注第一级数组(例如&#xff0c;使其适合作为MySQL JSON列)&#xff0c;那么可以将第一级数组强制转换为对象&#xff0c;例如&#xff1a;$ json json_encode((object)…

php推送示例wordpress,给WordPress的编辑后台添加提示框的代码实例分享

WordPress 3.5 新添加了一个提示框功能&#xff0c;可以创建一个提示框&#xff0c;然后指向任何元素&#xff0c;比如下边的例子&#xff1a;本文就来教你怎么创建一个这样的提示框。首先需要添加提示框的脚本&#xff0c;这样才能使用提示框的 JS 方法。//挂载提示框脚本func…

jmeter php网站,jmeter实战之phpwind随机回帖/发帖

关键词&#xff1a;jmeter phpwind 性能测试一、性能需求1)性能需求&#xff1a;30min内&#xff0c;phpwind随机回帖/发帖&#xff0c;观察服务器性能的表现。2)需求分析&#xff1a;2.1 核心业务论坛系统的核心业务主要是登录、看帖、发帖、回帖&#xff0c;业务建模时应考虑…

php7改进,关注一下:PHP 7.3.7 正式发布 改进、修复的地方不少哦

PHP 7.3.7正式发布了。PHP(PHP&#xff1a;Hypertext Preprocessor)是一种在电脑上执行的脚本语言&#xff0c;主要是用途在于处理动态网页&#xff0c;也包含了命令列执行接口(command line interface)&#xff0c;或者产生图形使用者接口(GUI)程式。版本主要还是修复 bug&…

php jwt token刷新方案,laravel JWT自动刷新 自定义验证器

在前面的文章中&#xff0c;我们引入了JWT的验证方式&#xff0c;但是在前面并没有做过多的处理&#xff0c;只是用JWT生成了一个token&#xff0c;那么今天来就解决后续问题为了保证用户信息的安全&#xff0c; 我们的生成的JWT不可能一直有效&#xff0c;我们在配置文件里边配…

2019java形势,2019Java开发还有哪些发展

相信已经有不少人在心里考虑着春节之后转行新工作了吧&#xff0c;而在众多行业中IT行业&#xff0c;特别是Java开发、Java程序员等岗位相信是很多人的首选。谁让现在程序员薪资这么高呢&#xff0c;但是现在互联网发展迅速&#xff0c;各类编程语言层出不穷&#xff0c;比如py…

mysql允许两个用户远程连接,配置MySQL服务允许用户远程连接

默认情况下&#xff0c;mysql只允许本地登录&#xff0c;如果要开启远程连接&#xff0c;则需要修改/etc/mysql/my.conf文件。一、修改/etc/mysql/my.conf找到bind-address 127.0.0.1这一行改为bind-address 0.0.0.0即可二、为需要远程登录的用户赋予权限1、新建用户远程连接…

php流程控制的类型有哪些,流程控制包括哪些内容

流程控制也称为控制流程&#xff0c;是计算机运算领域的用语&#xff0c;其内容包括在程序运行时&#xff0c;个别的指令或是陈述、子程序运行或求值的顺序&#xff0c;不论是在声明式编程语言或是函数编程语言中&#xff0c;都有类似的概念。控制流程(也称为流程控制)是计算机…

oracle11g创建闪回分区多大,Oracle闪回区大小预估

一个朋友问如何设置Oracle闪回区大小&#xff0c;有什么依据没有。查证官方文档&#xff0c;有如下描述For example, if you intend to setDB_FLASHBACK_RETENTION_TARGET to 24 hours, and if the database generates 20 GB of redo in a day, then a rule of thumb is to all…

查询linux服务器事物传输失败日志,查看fail2ban日志代替lastb查看登录失败记录

之前我曾经用shell脚本提取lastb登录失败超过指定次数的IP加入到iptables&#xff0c;来禁止这些IP登录主机&#xff0c;达到防止恶意攻击的目的。后来为了给主机提供更全面的防护&#xff0c;又安装了fail2ban。今天早上我收到fail2ban发过来的报警邮件提示我禁止了一个IP登录…

linux双屏播放视频,Ubuntu Linux下双屏显示解决方案

Ubuntu从起后居然把Windows的设置给记住了。显示ok。我晕。以前倒是也有过这问题&#xff0c;在双系统情况下&#xff0c;外接键盘的灯会继承Windows的早就有心弄个显示器&#xff0c;把笔记本的外接上&#xff0c;倒不是说非要2个屏幕来工作如何如何&#xff1f;只是因为我的本…

鸟哥linux群,【鸟哥的linux私房菜-学习笔记】linux的帐号与群组

linux的帐号与群组使用者标识符&#xff1a; UID 与 GIDID 与账号的对应就在 /etc/passwd 当中&#xff1b;计算机只认得ID(即数字)&#xff0c;并不能区别账号&#xff1b;每个登陆的使用者至少都会取得两个 ID &#xff0c;一个是使用者 ID (User ID &#xff0c;简称 UID)、…

C语言中表示温度符号,摄氏度符号怎么打(SCI论文中摄氏度°C符号的正确输法)...

大家可能知道中文的摄氏度百思特网是一个字符&#xff0c;而且输入方法比较简单&#xff0c;可以用搜狗输入法&#xff0c;还可以输入 "sheshidu"&#xff0c;第五个一般就是℃&#xff0c;甚至可以在网上或文献中复制粘贴。而英文的摄氏度C 却是两个字符&#xff0c…

android filehelper,为AndroidStudio开发mvp插件(MvpHelper)

如果觉得写mvp有点枯燥无味&#xff0c;我们可以做点 cool 的事情&#xff1a;做个 as 插件help.pngtodo-mvp: 基础的MVP架构。todo-mvp-loaders:基于MVP架构的实现&#xff0c;在获取数据的部分采用了loaders架构。todo-mvp-databinding: 基于MVP架构的实现&#xff0c;采用了…

android+5.q,MSM8909+Android5.1.1电池管理(2)--qpnp-linear-charger.txt驱动学习概要

MSM8909Android5.1.1电池管理(2)--qpnp-linear-charger.txt驱动学习概要参考文件\kernel\Documentation\power\qpnp-linear-charger.txt---下面是学习此文件\kernel\Documentation\devicetree\bindings\power\qpnp-linear-charger.txt1. 简介The QPNP linear charger drive…

岳阳鸿蒙数学培优阶梯训练,鸿蒙应用-呼吸训练app部分练习展示(开始)

本帖最后由 李洋水蛟龙 于 2020-12-20 18:11 编辑1.在主页面添加一个按钮并响应点击事件效果显示&#xff1a;图片1.png (404.17 KB, 下载次数: 0)2020-12-10 17:53 上传点击按钮“点我”下方便会显示“我被点击了”说明点击事件已完成代码如下&#xff1a;Index.hml文件中Hell…