线上运行的项目突然变得很卡如何排查?

简介: 线上运行的项目突然变得很卡如何排查?

线上运行的项目突然变得很卡如何排查?


我们可能在项目部署后遇到一些问题,某一块模块功能或者全部的模块功能在某一时间段特别卡,我们应该如那些方面去排查呢?接下来我们一起去探究一下。



1、如果所有的模块都卡:


极有可能是网络出问题,cpu被拉满了。


2、如果是单一个模块的变得卡,其他模块都正常:


变卡的问题可能性点:文件句柄,IO流,SOCKET流,代码中sql不规范,数据库连接资源,数据库连接问题导致锁无法释放,代码中sleep过长,线程池使用不规范等等。


优先查看最近的代码提交是否符合规范。


如果上述无法确认,线上触发调用从接口调用出开始排查日志,查看每一次关键日志的时间信息,看能否确定哪一个调用链路时


间耗费过长,查看当前文件句柄,IO流,SOCKET流是否资源关闭正常,去数据库执行当前的sql语句看是否为慢sql,是否因为少参数问


题导致全表查询。


如果上述还无法确定,可以在触发线上调用之后看一下当前线程的dump信息

####使用top -H指令看每个线程的性能(如果有某个线程的cpu利用率一直是100,记录下pid)
root@hadoop top -H
####将上步骤的pid转换成线程用的nid(16进制的)
printf "%x\n" 上一步的pid
###获取当前项目的java的pid
root@hadoop  ps -aux | grep java
tomcat     1538 17.1 39.4 11175396 6620524 ?    Sl   Jul09 3629:14 /opt/taobao/install/ajdk-8.1.1_fp1-b52/bin/java -server -Xms5334m -Xmx5334m -Xss1m -XX:PermSize=128m -XX:MaxPermSize=256m -Xmn2000m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSParallelRemarkEnabled -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -verbose:gc -Xloggc:/alidata/www/logs/tomcat7/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:-HeapDumpOnOutOfMemoryError -XX:ErrorFile=/usr/share/tomcat7/logs/hs_err_pid%p.log -XX:HeapDumpPath=/usr/share/tomcat7/logs/java_pid.hprof -verbose:gc -Xloggc:/alidata/www/logs/tomcat7/gc.log-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Djdk.tls.rejectClientInitiatedRenegotiation=true -Dsun.net.inetaddr.ttl=0 -Dcatalina.logs=/usr/share/tomcat7/logs -Dlog4j.defaultInitOverride=true -Dlog4j.dir=/alidata/www/logs/tomcat7 -Dlog4j.level=WARN -Dproject.name=ecm-server -javaagent:/alidata/tianjimon-apm/tianjimon-apm.jar -classpath :/usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar: -Dcatalina.base=/usr/share/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.endorsed.dirs= -Djava.io.tmpdir=/tmp -Djava.util.logging.config.file=/usr/share/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
root     124342  0.0  0.0  61260  1864 pts/6    S+   16:40   0:00 grep java
####使用pid dump当前运行的线程信息
root@hadoop  jstack 1538 >> dump.log
####统计所有的线程状态
root@hadoop  grep Thread.State dump.log| awk '{print $2 $3 $4 $5}' | sort | uniq -c
   40 RUNNABLE
   21 TIMED_WAITING(onobjectmonitor)
   5 TIMED_WAITING(parking)
   44  TIMED_WAITING(sleeping)
   200 WAITING(onobjectmonitor)
   3 WAITING(parking)
####如果有大量WAITING的线程,可以查看当前dump.log中WAITING的线程在干什么,如果WAITING的线程日志中有await,说明有大量线程空闲状态。如果有大量的WAITING,会造成过多的线程上下文切换次数【因为WAITING状态是等待状态,等待就绪,等待cpu调度,每一次WAITING到RUNNABLE都会进行一次上下文切换】
###将第二步骤的线程nid拿过来去dump.log查询当前线程在干什么(示例)
locked <0x00000007d0015508>,再waiting on <0x00000007d0015508>
"Finalizer" #3 daemon prio=8 os_prio=31 cpu=0.43ms elapsed=283151.83s tid=0x00007fd4b301f800 nid=0x3803 in Object.wait()  [0x0000700002aba000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.10/Native Method)
        - waiting on <0x00000007d0015508> (a java.lang.ref.ReferenceQueue$Lock) 
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.10/ReferenceQueue.java:155)
        - locked <0x00000007d0015508> (a java.lang.Object)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.10/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.10/Finalizer.java:170)
######日志中如果能体现线程使用不合理,需要去代码中去看下线程池的使用是否规范,是否有代码不合理的地方
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
8月前
|
人工智能 弹性计算 运维
阿里云 MCP Server 开箱即用!
本文介绍了如何通过alibaba-cloud-ops-mcp-server和MCP(Model Context Protocol)实现AI助手对阿里云资源的复杂任务操作。内容涵盖背景、准备步骤(如使用VS Code与Cline配置MCP Server)、示例场景(包括创建实例、监控实例、运行命令、启停实例等),以及支持的工具列表和参考文档。借助这些工具,用户可通过自然语言与AI助手交互,完成ECS实例管理、VPC查询、云监控数据获取等运维任务,实现高效“掌上运维”。
|
Java 编译器
Java“精度可能丢失”错误解决
在处理Java编程语言中“精度可能丢失”的警告或错误信息时,通常涉及到数据类型之间的转换,特别是从高精度类型(如long、double)转换到低精度类型(如int、short)时。本指南将帮助你理解这一问题的根源,并提供有效策略来避免或解决此类错误,确保程序正确无误地运行。我们将会探讨如何使用显式类型转换(cast),以及如何优化代码逻辑来规避潜在的数据丢失风险。
660 0
|
安全 Java
HashMap和Hashtable的区别
HashMap和Hashtable的区别
554 2
|
消息中间件 存储 SQL
代码很少,却很优秀!RocketMQ的NameServer做到了!
本文深入剖析了RocketMQ的注册中心NameServer,基于RocketMQ release-5.2.0版本。NameServer作为Broker、Producer与Consumer之间的纽带,仅由少数几个类构成,却实现了高性能与轻量化。文章详细介绍了NameServer的AP设计思想、简洁的数据结构及心跳机制。AP设计避免了复杂的分布式协议,简化了网络开销;数据结构主要包括路由表、Broker信息等;心跳机制则通过定时扫描确保Broker的活跃状态。通过这些核心设计,NameServer实现了高效稳定的注册与发现功能。
614 5
|
资源调度 JavaScript
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
1634 0
|
机器学习/深度学习 人工智能 运维
智能化运维:AI与机器学习在IT管理中的应用
【7月更文挑战第10天】本文深入探讨了人工智能和机器学习如何革新传统的IT运维领域。文章首先界定了智能化运维的概念,随后分析了AI技术在故障预测、自动化处理和安全监控方面的应用实例,并讨论了实施智能化运维时面临的挑战及其克服策略。最终,文章展望了智能化运维的未来趋势,强调了持续学习和适应新技术的重要性。
|
数据库
达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
1715 0
达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
|
安全 Java
java.security.InvalidKeyException: Illegal key size
java.security.InvalidKeyException: Illegal key size
382 0
|
JavaScript 前端开发
js实现移动端图片预览:手势缩放, 手势拖动,双击放大...
原文:js实现移动端图片预览:手势缩放, 手势拖动,双击放大... 前言本文将介绍如何通过js实现移动端图片预览,包括图片的 预览模式,手势缩放,手势拖动,双击放大等基本功能; 扫码查看示例效果: 代码地址http://pangyongsheng.github.io/imgPreview/ 一、功能介绍   图片预览主要有以下几个功能点组成: 监听图片点击事件,进入图片预览模式 自定义手势事件, (双指缩放,滑动,双击。
3528 0