阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Tomcat占用CPU过高解决方法

703次阅读
没有评论

共计 1901 个字符,预计需要花费 5 分钟才能阅读完成。

问题描述

在工作中经常遇到 Tomcat 占用 CPU 居高不下,top 显示结果超过 200%,请求无法响应,针对这种情况有以下处理办法进行排查。请求无法响应。

问题排查

1、获取进程信息

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

jps pid

2、查看 jstack 信息

jstack pid

3、将十进制 pid 转换为 16 进制

将十进制转换成 16 进制
# printf “%x\n” 19713–> 将第 2 步查到占用较高 CPU 的线程号转换为 16 进制,以便于 jstack 查看
4d01

#jstack pid | grep 0x4d01–> 0x4d01 为第 3 步 19713 转换为 16 进制后的数字,因为 jstack 显示的线程号是以 16 进制表示的!

将 16 进制转换成十进制
# printf “%d\n” 0x4d19

jstack 的作用是显示正在运行的所有 Java 线程情况,jstack pid | grep 0x4d01 的意思只显示某个 java 线程的运行信息。通过这种方法,可以将此线程正在运行的方法显示出来,将此方法交给开发即可。(也可能 jstack pid | grep 0x4d01 什么都没有出来的)

4、打印线程的堆栈信息

jstack pid | grep tid -A 30

此处不一一列表各 tid 的堆栈信息了,在其中一个的 tid 堆栈信息中找到了问题的原因

5、进一步排查,分析每个线程的 cpu 占用量

简单点儿的方法则是,查出进程 id 后,通过如下命令查看该进程中每个线程的资源使用情况

top -H -p pid  - H 用于显示某个进程的所有线程

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

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

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

jstat -gc pid

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

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

6、问题定位

查询 tomcat 对应端口的 tcp 链接,查看是否存在大量 EASTABLISH 的链接,或还有部分其它状态的连接。

netstat -anlp | grep port

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:没有任何连接状态

解除 Tomcat 中 POST 方式上传文件的大小限制

当服务器是 Tomcat 时,通过 POST 上传的文件大小的最大值为 2M(2097152)。

如果想修改该限制,修改方法如下:

tomcat 目录下的 conf 文件夹下,server.xml 文件中以下的位置中添加 maxPostSize 参数

<Connector port=”8081″ 
              maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″ 
              enableLookups=”false” redirectPort=”8443″ acceptCount=”100″ 
              debug=”0″ connectionTimeout=”20000″ 
              disableUploadTimeout=”true” URIEncoding=”GBK” 
              maxPostSize=”-1″/>

注意:maxPostSize 参数只有当 request 的 Content-Type 为“application/x-www-form-urlencoded”时起作用。

从 apache-tomcat-7.0.63 开始,参数 maxPostSize 的含义就变了:如果将值设置为 0,表示 POST 最大值为 0,不限制 POST 大小需要将值设置为 -1。,在此版本之前设置为 0 表示不限制 POST 大小。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计1901字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中