MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

tomcat调优相关

2024-12-14 12:00 huorong 精选文章 5 ℃ 0 评论

前言:

昨晚,正在现网运行的项目接口突然出现全阻问题。客户端发送过来的请求,我们作为服务端没有响应。经过一系列的tomcat优化和dump文件分析。最终解决问题。下面式分析的过程。

分析过程

首先登录linux服务器上查看ps -ef | grep tomcat查询服务运行正常。但是通过netstat命令

netstat -an | grep 8080查询端口状态是SYNC_RECV。接口请求没有响应,没有相关的日志打印。

SYNC_RECV状态首先是tcp建立连接三次握手的过程的第二次握手。

第二次握手(SYN + ACK):服务器收到客户端的 SYN 请求后,会发送一个带有 SYN 和 ACK(确认)标志的包作为响应。服务器通过 SYN 标志表示接受客户端的连接请求,通过 ACK 标志表示确认客户端的 SYN 请求有效。此时,服务器进入 SYN_RECEIVED(同步已接收)状态。

也就是说tcp连接未建立成功

tomcat连接数过多

首先排查了tomcat的相关配置和分析日志信息。server.xml的配置信息中未配置线程最大连接数的,也就是说tomcat6默认的最大连接数是200,也就是说超过200之后,如果连接未释放会“卡住”。还存在缓存未清理的问题。进行下面的操作。

原配置:

    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

给出的优化配置:

<Connector port="80" protocol="HTTP/1.1" 
          maxThreads="600"      
          minSpareThreads="100"
          maxSpareThreads="500"
          acceptCount="700"
          connectionTimeout="20000" 
					redirectPort="8443" />

当在对其进行并发测试时,基本对个并发上去就宕机了,还要修改默认连接数设置:以下红色四行TOMCAT6中好相没有,手工加上就可以了,基本上可以解决连接数过大引起的死机。其中具体的说明是:
maxThreads="600" ///最大线程数
minSpareThreads="100"///初始化时创建的线程数
maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要
的socket线程。

acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

Tomcat的JVM提示内存溢出

查看%TOMCAT_HOME%\logs文件夹下,日志文件是否有内存溢出错误

错误提示:java.lang.OutOfMemoryError: Java heap space

Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误,Out of Memory(系统内存不足)的异常,从而导致客户端显示500错误,一般调整Tomcat的使用内存即可解决此问题。
Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:set JAVA_OPTS=-Xms256m -Xmx512m
Linux环境下修改“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件开头增加如下设置:JAVA_OPTS=’-Xms256m -Xmx512m’
其中,-Xms设置初始化内存大小,-Xmx设置可以使用的最大内存。

错误提示:java.lang.OutOfMemoryError: PermGen space
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:

在catalina.bat的第一行增加:
set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -
XX:MaxPermSize=256m
在catalina.sh的第一行增加:
JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -
XX:MaxPermSize=256m

tomcat配置添加日志打印

在server.xml中配置日志添加的打印

 <Valve className="org.apache.catalina.valves.AccessLogValve"
           directory="logs" prefix="access_log" suffix=".txt"
           pattern="common" resolveHosts="false" />

通过这样的配置,当有请求到达 Tomcat 服务器时,AccessLogValve阀门将把请求的访问信息记录到指定的访问日志文件中。日志文件的命名格式为 access_log<日期>.txt,例如 access_log20220225.txt。

Tomcat连接数设置

在tomcat配置文件server.xml中的<Connector ... />配置中,和连接数相关的参数有:
minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75
acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100
enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

tomcat清楚缓存

清理/home/lcdacs/DACSINTF/tomcat/conf下的Catalina目录;命令cd /home/lcdacs/DACSINTF/tomcat/conf;rm -rf Catalina;

  1. 清缓存:cd /home/lcdacs/DACSINTF/tomcat/work;rm -rf Catalina;
  2. /home/lcdacs/DACSINTF/tomcat/temp目录存在文件进行清理。
  3. 目录:/home/lcdacs/DACSINTF/tomcat/webapps下保持空。

总结

以上是对tomcat相关配置的优化方案。旨在解决tomcat相关的配置问题。希望对大家有帮助。

Tags:tomcat jvm参数设置

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言