- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章记一次tomcat进程cpu占用过高的问题排查记录由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文主要记录一次tomcat进程,因TCP连接过多导致CPU占用过高的问题排查记录.
问题描述 。
linux系统下,一个tomcat web服务的cpu占用率非常高,top显示结果超过200%。请求无法响应。反复重启依然同一个现象.
问题排查 。
1、获取进程信息 。
通过jdk提供的jps命令可以快速查出jvm进程, 。
1
|
jps pid
|
2、查看jstack信息 。
1
|
jstack pid
|
发现存在大量log4j线程block,处于waiting lock状态 。
org.apache.log4j.Category.callAppenders(org.apache.log4j.spi.LoggingEvent) @bci=12, line=201 (Compiled frame) 。
搜索相关信息,发现log4j 1.x版本存在死锁问题.
发现问题,于是调整log4j配置,仅打开error级别日志,重启tomcat。此时stack中block线程消失,但进程cpu占用率依然高涨.
3、进一步排查 。
分析每个线程的cpu占用量,此处需要引入一个大神贡献的脚本,计算java进程中,每个线程的cpu使用量.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/bin/bash
typeset
top
=${1:-10}
typeset pid=${2:-$(pgrep -u $USER java)}
typeset tmp_file=
/tmp/java_
${pid}_$$.trace
$JAVA_HOME
/bin/jstack
$pid > $tmp_file
ps
H -eo user,pid,ppid,tid,
time
,%cpu --
sort
=%cpu --no-headers\
|
tail
-$
top
\
|
awk
-
v
"pid=$pid"
'$2==pid{print $4"\t"$6}'
\
|
while
read
line;
do
typeset nid=$(
echo
"$line"
|
awk
'{printf("0x%x",$1)}'
)
typeset cpu=$(
echo
"$line"
|
awk
'{print $2}'
)
awk
-
v
"cpu=$cpu"
'/nid='
"$nid"
'/,/^$/{print $0"\t"(isF++?"":"cpu="cpu"%");}'
$tmp_file
done
rm
-f $tmp_file
|
脚本适用范围 。
因为ps中的%CPU数据统计来自于/proc/stat,这个份数据并非实时的,而是取决于OS对其更新的频率,一般为1S。所以你看到的数据统计会和jstack出来的信息不一致也就是这个原因~但这份信息对持续LOAD由少数几个线程导致的问题排查还是非常给力的,因为这些固定少数几个线程会持续消耗CPU的资源,即使存在时间差,反正也都是这几个线程所导致.
除了这个脚本,简单点儿的方法则是,查出进程id后,通过如下命令查看该进程中每个线程的资源使用情况 。
1
|
top
-H -p pid
|
从这里获取pid(线程id),转换为16进制,然后去stack信息中查找对象的线程信息.
通过上述方法,查出tomcat进程对应的线程cpu占用率累积之和约80%,远小于top给出的200%+ 。
说明并不存在长期占用cpu的线程,应该是属于有许多短暂性的cpu密集计算。进而怀疑是不是jvm内存不足,频繁gc导致.
1
|
jstat -gc pid
|
发现jvm内存使用并未出现异常,gc次数明显暴涨 。
查完内存,由于本身是一个网络程序,进一步排查网络连接.
4、问题定位 。
查询tomcat对应端口的tcp链接,发现存在大量EASTABLISH的链接,还有部分其它状态的连接,总计400+.
1
|
netstat
-anp |
grep
port
|
进一步查看这些连接的来源,发现是该tomcat服务的应用端,存在大量后台线程,在频繁轮询该服务,导致该服务tomcat 连接数被打满,无法继续接收请求.
netstat状态说明:
5、根源分析 。
直接触发原因是客户端轮询,请求异常,继续轮序;客户端不断有新的后台线程加入轮询队伍,最终导致服务端tomcat连接被打满.
到此这篇关于记一次tomcat进程cpu占用过高的问题排查记录的文章就介绍到这了,更多相关tomcat进程cpu占用过高内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/yiduyangyi/article/details/77101459 。
最后此篇关于记一次tomcat进程cpu占用过高的问题排查记录的文章就讲到这里了,如果你想了解更多关于记一次tomcat进程cpu占用过高的问题排查记录的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个网站。 必须登录才能看到里面的内容。 但是,我使用此代码登录。 doc = Jsoup.connect("http://46.137.207.181/Account/Login.aspx")
我正在尝试为我的域创建一个 SPF 记录并使我的邮件服务器能够对其进行评估。我在邮件服务器上使用 Postfix 并使用 policyd-spf (Python) 来评估记录。目前,我通过我的私有(p
我需要为负载平衡的 AWS 站点 mywebsite.com 添加 CName 记录。记录应该是: @ CNAME mywebsite.us-east-1.elb.amazon
我目前正在开发一个相当大的多层应用程序,该应用程序将部署在海外。虽然我希望它在解聚后不会折叠或爆炸,但我不能 100% 确定这一点。因此,如果我知道我可以请求日志文件,以准确找出问题所在以及原因,那就
我使用以下命令从我的网络摄像头录制音频和视频 gst-launch-0.10 v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=30/1
我刚刚开始使用 ffmpeg 将视频分割成图像。我想知道是否可以将控制台输出信息保存到日志文件中。我试过“-v 10”参数,也试过“-loglevel”参数。我在另一个 SO 帖子上看到使用 ffmp
我想针对两个日期查询我的表并检索其中的记录。 我这样声明我的变量; DECLARE @StartDate datetime; DECLARE @EndDate datetime; 并像这样设置我的变量
在 javascript 中,我可以使用简单的 for 循环访问对象的每个属性,如下所示 var myObj = {x:1, y:2}; var i, sum=0; for(i in myObj) s
最近加入了一个需要处理大量代码的项目,我想开始记录和可视化调用图的一些流程,让我更好地理解一切是如何组合在一起的。这是我希望在我的理想工具中看到的: 每个节点都是一个函数/方法 如果一个函数可以调用另
如何使用反射在F#中创建记录类型?谢谢 最佳答案 您可以使用 FSharpValue.MakeRecord [MSDN]创建一个记录实例,但是我认为F#中没有任何定义记录类型的东西。但是,记录会编译为
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
我是 Sequelize 的新手并且遇到了一些语法问题。我制作了以下模型: // User sequelize.define('user', { name: { type: DataTyp
${student.name} Notify 这是我的output.jsp。请注意,我已经放置了一个链接“Notify”以将其转发到 display.jsp 上。但我不确定如何将 Stud
例如,这是我要做的查询: server:"xxx.xxx.com" AND request_url:"/xxx/xxx/xxx" AND http_X_Forwarded_Proto:(https O
我一直在开发大量 Java、PHP 和 Python。所有这些都提供了很棒的日志记录包(分别是 Log4J、Log 或logging)。这在调试应用程序时有很大帮助。特别是当应用程序 headless
在我的Grails应用程序中,我异步运行一些批处理过程,并希望该过程记录各种状态消息,以便管理员以后可以检查它们。 我考虑过将log4j JDBC附加程序用作最简单的解决方案,但是据我所知,它不使用D
我想将进入 MQ 队列的消息记录到数据库/文件或其他日志队列,并且我无法修改现有代码。是否有任何方法可以实现某种类似于 HTTP 嗅探器的消息记录实用程序?或者也许 MQ 有一些内置的功能来记录消息?
如果我有一条包含通用字段的记录,在更改通用字段时是否有任何方法可以模仿方便的 with 语法? 即如果我有 type User = // 'photo can be Bitmap or Url {
假设我有一个名为 Car 的自定义对象。其中的所有字段都是私有(private)的。 public class Car { private String mName; private
当记录具有特定字段时,我需要返回 true 的函数,反之亦然。示例: -record(robot, {name, type=industrial, ho
我是一名优秀的程序员,十分优秀!