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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 线上运行的项目突然变得很卡如何排查?

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


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



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实时生图绘板
相关文章
|
SQL 监控 网络协议
线上故障如何快速排查?来看这套技巧大全
有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服务器、Java应用、数据库、Redis、网络和业务六个层面分享线上故障排查的思路和技巧。较长,同学们可收藏后再看。
线上故障如何快速排查?来看这套技巧大全
|
7月前
|
人工智能 弹性计算 运维
阿里云 MCP Server 开箱即用!
本文介绍了如何通过alibaba-cloud-ops-mcp-server和MCP(Model Context Protocol)实现AI助手对阿里云资源的复杂任务操作。内容涵盖背景、准备步骤(如使用VS Code与Cline配置MCP Server)、示例场景(包括创建实例、监控实例、运行命令、启停实例等),以及支持的工具列表和参考文档。借助这些工具,用户可通过自然语言与AI助手交互,完成ECS实例管理、VPC查询、云监控数据获取等运维任务,实现高效“掌上运维”。
|
安全 Java
HashMap和Hashtable的区别
HashMap和Hashtable的区别
394 2
|
SQL 监控 数据库
线上服务假死排查
线上服务假死排查
154 0
|
消息中间件 存储 SQL
代码很少,却很优秀!RocketMQ的NameServer做到了!
本文深入剖析了RocketMQ的注册中心NameServer,基于RocketMQ release-5.2.0版本。NameServer作为Broker、Producer与Consumer之间的纽带,仅由少数几个类构成,却实现了高性能与轻量化。文章详细介绍了NameServer的AP设计思想、简洁的数据结构及心跳机制。AP设计避免了复杂的分布式协议,简化了网络开销;数据结构主要包括路由表、Broker信息等;心跳机制则通过定时扫描确保Broker的活跃状态。通过这些核心设计,NameServer实现了高效稳定的注册与发现功能。
550 5
|
资源调度 JavaScript
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
vue项目:集成富文本编辑器 - 百度ueditor(vue-ueditor-wrap)
1447 0
|
移动开发 API
2024年阿里云域名优惠口令及优惠口令获取方法(新)
com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,cn域名注册优惠口令“互联网上的中国标识”,阿里云优惠口令是域名专属的优惠码,可用于域名注册、续费和转入使用,域名优惠口令区分域名后缀,阿里云百科分享2024年阿里云域名优惠口令更新(注册、转入、续费均可使用)
3500 1
|
数据库
达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
1489 0
达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
|
安全 Java
java.security.InvalidKeyException: Illegal key size
java.security.InvalidKeyException: Illegal key size
310 0
|
Java 关系型数据库 MySQL
【Linux】jdk、tomcat、MySQL环境搭建的配置安装,Linux更改后端端口
【Linux】jdk、tomcat、MySQL环境搭建的配置安装,Linux更改后端端口
266 0
下一篇
开通oss服务