记一次tomcat进程cpu占用过高的问题排查记录

本文主要记录一次tomcat进程,因TCP连接过多导致CPU占用过高的问题排查记录。

问题描述

linux系统下,一个tomcat web服务的cpu占用率非常高,top显示结果超过200%。请求无法响应。反复重启依然同一个现象。

问题排查

1、获取进程信息

通过jdk提供的jps命令可以快速查出jvm进程,

jps pid

2、查看jstack信息

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使用量。

#!/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后,通过如下命令查看该进程中每个线程的资源使用情况

top -H -p pid

从这里获取pid(线程id),转换为16进制,然后去stack信息中查找对象的线程信息。

通过上述方法,查出tomcat进程对应的线程cpu占用率累积之和约80%,远小于top给出的200%+

说明并不存在长期占用cpu的线程,应该是属于有许多短暂性的cpu密集计算。进而怀疑是不是jvm内存不足,频繁gc导致。

jstat -gc pid

发现jvm内存使用并未出现异常,gc次数明显暴涨

查完内存,由于本身是一个网络程序,进一步排查网络连接。

4、问题定位

查询tomcat对应端口的tcp链接,发现存在大量EASTABLISH的链接,还有部分其它状态的连接,总计400+。

netstat -anp | grep port

进一步查看这些连接的来源,发现是该tomcat服务的应用端,存在大量后台线程,在频繁轮询该服务,导致该服务tomcat 连接数被打满,无法继续接收请求。

netstat状态说明:

  • LISTEN:侦听来自远方的TCP端口的连接请求
  • SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
  • SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood***了)
  • ESTABLISHED:代表一个打开的连接
  • FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
  • FIN-WAIT-2:从远程TCP等待连接中断请求
  • CLOSE-WAIT:等待从本地用户发来的连接中断请求
  • CLOSING:等待远程TCP对连接中断的确认
  • LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被***)
  • TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
  • CLOSED:没有任何连接状态

5、根源分析

直接触发原因是客户端轮询,请求异常,继续轮序;客户端不断有新的后台线程加入轮询队伍,最终导致服务端tomcat连接被打满。

到此这篇关于记一次tomcat进程cpu占用过高的问题排查记录的文章就介绍到这了,更多相关tomcat进程cpu占用过高内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-02-23

flex tomcat端口被占用的问题分析及解决方法

概述: 在启动Tomcat,提示8080端口(如果安装的时候端口被修改了,使用你自己设置的端口)被占用了.解决方法如下: 1. 开始-> 运行 -> 输入cmd 2. 输入 netstat -ano, 查看是哪个程序占用了8080的端口,记住该进程的PID 3. 打开任务管理器, 4. 查找对应第2步的PID的进程.( 如果任务管理器没有PID这一列,请打开 查看-> 选择列, 把PID这一项选上) 5. 关闭该进程,重启tomcat

java中tomcat的80端口被占用问题解决

今天遇见了这个端口被占用问题 然后各种百度 先是说 用命令 netstat -a -n -o 最后一个选项表示连接所在进程id. 找到8080端口的PID然后打开任务管理器, 切换到进程选项卡, 在菜单栏选择查看->选择列, 选择PID. 在列表中找到PID对应的进程就可以了然后发现占用端口的进程的PID为4 可无奈如何关闭都关闭不了这个进程 于是又百度了pid为4的进程 果然找到同样问题 解决办法是把world wide web publishing service这个服务关闭就没事了.pid

完美解决在eclipse上部署Tomcat时出现8080等端口被占用的问题

问题描述: 在eclipse中部署Tomcat时,出现如下错误. 解决方法如下: 方法一: 1.开始->cmd->输入命令netstat -ano出现下图所示(注意下边显示有些错位,最后一列是PID): 2.有的同学输入netstat -ano后显示不是内部文件,解决方法如下: 开始->cmd->cd: c\WINDOWS\system32\ 结果如上图所示. 3.打开Windows任务管理器,点击查看,点击选择列,勾起PID选项,如下图所示: 4.由于自己机子上的8080端口处于

浅谈Tomcat乱码与端口占用的解决方案

Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选.但是有些小伙伴在启动Tomcat时也会遇到各种各样的问题,比如Tomcat的startup.bat启动后出现乱码,端口占用,启动后闪退等问题,这里我们来一一进行解决 问题一:Tomcat的startup.bat启动后出现乱码 找到Tomcat文件下的conf目录,修改logging.properties文件中java.ut

Tomcat 发布程序使用cmd查看端口占用、相应进程、杀死进程等的命令

如何查看程序占用的端口 一. 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano|findstr "指定端口号" 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano|f

Tomcat 启动错误(8080端口被占用)处理方法

错误描述: 2009-7-12 15:40:35 org.apache.coyote.http11.Http11BaseProtocol start 严重: Error starting endpoint java.net.BindException: Address already in use: JVM_Bind:8080 at org.apache.tomcat.util.net.PoolTcpEndpoint.initEndpoint(PoolTcpEndpoint.java:298)

Tomcat显示8080端口被占用的图文解决方法

大概思路:找到占用端口的进程,通过唯一标识的进程号终止该进程 在控制台中找到端口对应的进程号 在任务管理器中找到服务进程号 然后终止进程 ps:不知道的进程不要乱终止,后果很严重的 win+R-->cmd-->netstat -ao win+R:运行,cmd:打开控制台 netstat-ao:显示活动连接(展示端口号和对应进程号) 在控制台中找到端口对应的进程号 右键任务栏,选择任务管理器 在选项卡中选择详细信息,然后点击PID排序,再找到需要终止的进程号,右键选择结束任务即可 总结 以上所述

eclipse端口被占用问题的解决方法

发现问题: 问题如图所示,在eclipse中开启tomcat服务器时报错:端口已被占用. 这是因为在tomcat开启的状态下,eclipse异常关闭,导致tomcat一直占用端口. 解决办法如下: 1: 输入命令netstat -ano|findstr "8080" ,查看8080端口是否被占用,且得到了进程号"13384": 2: 再输入命令tasklist|findstr "13384" ,得到进程映像名javaw.exe: 3: 启动任务管

Linux Centos7系统端口占用问题的解决方法

前言 服务器为Linux-Centos7系统 , 昨天发生了一个非常诡异的情况 , tomcat在已关闭的情况下 , 依然显示其8080端口被占用 , 最后定位到占用端口的进程 , 解决问题 ,下面话不多说了,来一起看看详细的介绍吧. 1.查看占用端口的进程netstat -lnp|grep 8080 [root@izbp109iqt20o2h63tpcuvz java]# netstat -lnp|grep 8080 tcp6 0 0 :::8080 :::* LISTEN 4486/java

MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法

1. 解压版的安装 (1). 下载压缩包并解压到一个磁盘位置 压缩包下载链接:https://dev.mysql.com/downloads/mysql/ 压缩包内容: (2). 写配置文件 复制my-default.ini重命名为my.ini,然后修改或添加配置信息: [mysqld] #mysql解压目录 basedir = <解压目录> #data文件夹位置,用来存放库和表 datadir = <data文件夹目录> #mysql默认端口号 port = 3306 #数据库服

Linux下Tomcat启动正常,但浏览器无法访问的解决方法

1.服务器可ping通 2.服务器抓本地的http请求包,可以抓到 3.本地抓服务器返回的http响应包,抓不到 经过查找,是由于开启了Linux防火墙 查看防火墙配置(需要root权限) [root@localhost ~]# service iptables status Redirecting to /bin/systemctl status  iptables.service iptables.service - IPv4 firewall with iptables Loaded: l

警告1909无法创建快捷方式VMware Workstation Pro.Ink的图文解决方法(附 VMware_workstation 12的安装方法)

电脑之前装过VMware 10,很长时间没用就卸载了,也没有在意卸载的干不干净,直到最近需要用Linux系统,重新安装了VMware 12,就出现下面这样的情况: 警告1909.无法创建快捷方式VMware Workstation Pro.Ink. 从网上找了各种办法试过之后都不太理想,后来仔细看看上面的提示,意思是说无法创建快捷方式,可能是用户在快捷方式文件夹的读写权限不够,那就去找到存放快捷方式的文件夹去试试: 就是下面这个路径,就可以找到快捷方式文件夹! 复制代码 代码如下: C:\Pro

thinkPHP显示不出验证码的原因与解决方法分析

本文实例讲述了thinkPHP显示不出验证码的原因与解决方法.分享给大家供大家参考,具体如下: 今天到公司,svn update代码后,在浏览器上输入域名后,在验证码那块显示不出,找了半个上午,后来仔细看了下apache的配置文件 <VirtualHost *:80> ServerName admin.exam.com DocumentRoot E:/www/exam/trunk/server/Admin/ <Directory E:/www/exam/trunk/server/apps

ubuntu 14.04 忘记用户登录密码的图文解决方法

1.在VMware Workstatiom中点击"开启此虚拟机",注意,进入系统自启时随即先点击一下屏幕,目的是让鼠标从VM切换到ubuntu启动(否则下面长按shift时可能不会进入GNU GRUN界面): 2.点击屏幕后随即长按shift,系统会进入GUN GRUB界面(对此界面的操作可看界面下面的说明),如图 1所示:如果进入图 2 所示的界面则此步骤的操作失败,不要着急再试一下. 图 1 图 2 3.在GNU GRUB界面中选中ubuntu 高级选项,回车 ,进入图 3所示界面

IDEA创建yml文件不显示小树叶创建失败问题的解决方法

不知道自己干了什么骚操作,在创建yml文件时,出现了以下问题: 这不单单是没有显示小树叶的问题,而是真的没法用,而且是在YAML插件全部安装的情况下出现了这样的问题. 通过一番搜索,现解决方法如下: 打开setting-File Types: 找到Text,在以下列表中找到自己创建的失效的application.yml,点击右边的减号将其删除,应用,问题解决. 附录:SpringBoot项目yml文件 不显示绿色小树叶的问题 方法1: 显示为灰色或者是表格样式的, 1.确认idea是否安装yam