Linux服务器tomcat部署运行后cpu升到最高一直不降。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux服务器tomcat部署运行后cpu升到最高一直不降。相关的知识,希望对你有一定的参考价值。

linux服务器部署tomcat启动过后访问页面导致java进程cup使用升到最高,持续不降,请问是什么原因我查找了项目内部debug.log输出:ClientAbortException: java.net.SocketException: Broken pipe,项目初部署时没有这种异常,最近刚部署后也不出现,但是过了段时间就出现这个问题,求各位大神解答。 linux -菜鸟

这个跟Linux没有任何关系。

是你的代码写的不好,重点检查以下几个方面:

    有输入输出流操作的地方,资源是否正常释放;

    有远程连接的地方,比如httpClient、Socket等,使用完是否正常关闭;

    如果系统有开放接口,接口代码是否健壮,是否经的起大并发访问;是否会导致阻塞;出现异常后,异常处理机制是否健全;

追问

试过很多,在本地虚拟机上也经过测试无误,但是放在服务器上就出现间断性的这种cpu过高,tomcat进程僵死的问题,我也认为是代码内部问题, 还能帮我列举几个容易出错的地方么? 我做了过滤器,一直异常都是经过过滤器抛出的,但是检测过后,发现不能叫做异常,我使用spring定时机制,在spring加载的时候会经过过滤器。

追答

这个跟网络有关,连接中断后,用户使用的服务端资源无法正常释放,就会这样,最终使得CPU冲高,所以我建议你检查你的连接部分的代码,如果没有连接接口,检查一下异常处理的地方,当用户异常网络中断时,需要手动释放一下,否则服务器会一直等,等session过期,才会将资源标记为汪使用,然后虚拟机才能GC,但此时可能 为时已晚,很有可能时间长了服务器就趴了。

如果代码中弄不好这个问题,先检查一下网络环境,一定要保证稳定,而且还要有足够的吞吐量性能。

参考技术A 解决:

1.更改代码

2.改回相关文件目录的原有属性

两个坑:

代码的死循环不够严谨

坚决不应该以root身份启动有固定用户的进程(属于误操作,应谨慎)

其他思路:

1.查日志,其实能看到很多删除失败的记录,这个应该留意,才能更好找到原因

2.利用jstat分析jvm状态 , jstat -gcutil pid(vmid) 间隔(毫秒) 次数,如:

[root@service ~]# jstat -gcutil 14503 1000 4

S0 S1 E O P YGC YGCT FGC FGCT GCT

43.75 0.00 0.00 76.49 85.93 148 17.511 1 0.618 18.129

43.75 0.00 0.00 76.49 85.93 148 17.511 1 0.618 18.129

43.75 0.00 0.00 76.49 85.93 148 17.511 1 0.618 18.129

43.75 0.00 0.00 76.49 85.93 148 17.511 1 0.618 18.129
参考技术B 有可能是linux的线程机制会产生JVM出错的问题,特别是在连接高峰期间经常出现这样的问题,tomcat在linux下也出现类似情况。

解决办法是在环境变量中设置:_JAVA_SR_SIGNUM=12 基本就可以解决。
sun的解释:
--posted by: cooper
Below is a clipping from Sun on working around JVM crashes under high
thread counts in the JVM 1.3 for Linux

On Linux, use a larger signal number for hotspot thread
suspension/resumption handler. The signal number being used is
specified by environment variable _JAVA_SR_SIGNUM. Setting it to a
number larger than SIGSEGV (11) will solve the problem. A good number
to use is 12, which is SIGUSR2. Using signal 16 to work around the
problem might have potential problems. So on tcsh, "setenv
_JAVA_SR_SIGNUM 12" can solve the problem.追问

_JAVA_SR_SIGNUM=12 这答案我在已经看见过了,但是不理解的是_JAVA_SR_SIGNUM=12这步设置具体意义在哪儿?

追答

我也不是很懂,你可以看sun给的解释,个人理解是_JAVA_SR_SIGNUM是一个资源信号量(这里应该是用于处理请求的线程数),即_JAVA_SR_SIGNUM的值指定了一定数量的资源用于处理suspension/resumption(暂停/恢复的请求,就是因为服务器的性能原因未处理的用户的重复请求被取消或者重复提交)。通过设置_JAVA_SR_SIGNUM=12达到一个相对稳定的状态。(个人的理解)

KVM部署搭建

1KVM概述

公司部分linux服务器利用率不高,为充分利用这些linux服务器,可以部署kvm,在物理服务器上运行多个服务,例如,运行nginx的服务器上部署kvm,然后虚拟机上运行tomcat

2:知识点

Kvm2.6版本后就直接整合到linux内核,依托与CPU虚拟化指令集(如lntel-VT AMD-V)实现高性能的虚拟化支持

一:安装方式桌面安装

实验环境操作系统为centos7.2 ??vmware虚拟机

1:安装kvm所要依赖包 ?

yum ?-y ?install ?qemu-kvm ??//KVM模块

yum ?-y ?install ?qemu-kvm-tools ?//kvm调试工具

yum ?-y ?install ?qemu-img ?//qemu组件。创建磁盘,启动虚拟机

yum ?-y ?install ?bridge-utils ?//网络支持工具

yum ?-y ?install ?libvirt ?//虚拟管理工具

yum ?-y ?install ?virt-manager ?//图形界面管理虚拟机

2yum安装结束后支持虚拟化功能需要调试 ?重启?

技术分享图片

验证是否支持虚拟化功能

[[email protected]?~]#?cat?/proc/cpuinfo?|?grep?vmx

技术分享图片

检查是否支持kvm模块

[[email protected]?~]#?lsmod?|?grep?kvm

技术分享图片

3:设置kvm网络

宿主服务器安装完成kvm 首先要设定网络 在libvirt中运行kvm网络有俩种办法

1NATBridge 默认是NAT

1:用户模式 NAT方式,默认网络,数据包由NAT方式通过主机接口进行传送,可以访问外网,但是无法从外部访问虚拟机

2: 桥接模式 允许虚拟机像一台独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持,一般有线网卡都支持

Bridge 桥接

修改网卡路径

[[email protected]?~]#?vim?/etc/sysconfig/network-scripts/ifcfg-eno16777736

技术分享图片

[[email protected]?~]#?vim?/etc/sysconfig/network-scripts/ifcfg-br0

技术分享图片

重新网卡服务 systemctl ?restart ?network ?查看确认IP地址

技术分享图片

Kvm管理

1)打开管理软件libvirt

[[email protected]?~]#?virt-manager

1)选择“存储”,单击“+”新建存储池,输入/data_kvm/store,这个位置用于存储之后创建的虚拟机。

[[email protected]?~]#?mkdir?-p?/data_kvm/sorce
[[email protected]?~]#?mkdir?-p?/data_kvm/iso

技术分享图片

技术分享图片

创建完成的结果如下所示

技术分享图片

创建存储卷

技术分享图片

技术分享图片

新建虚拟机,点击图中的new

技术分享图片

技术分享图片

技术分享图片

技术分享图片

最后选择左上角的begin ?installation开始启动虚拟机的安装。

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

部署完成

技术分享图片








以上是关于Linux服务器tomcat部署运行后cpu升到最高一直不降。的主要内容,如果未能解决你的问题,请参考以下文章

一个部署了tomcat服务的linux服务器,运行一段时间后出现内存和空间不足的问题

linux cpu占用100%排查

KVM

[转帖]Java性能检测工具-记录一次通过jstack排查Linux服务器CPU占用率很高的实践

部署Nginx+Tomcat负载均衡群集

Linux部署java和tomcat的运行环境