16G内存 Tomcat并发优化、内存配置、垃圾回收、宕机预防

2024-05-06 20:58

本文主要是介绍16G内存 Tomcat并发优化、内存配置、垃圾回收、宕机预防,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Tomcat并发优化、内存配置、垃圾回收、宕机预防

目录

 

  • Tomcat并发优化、内存配置、垃圾回收、宕机预防
    • 目录
      • 序言
      • 一、Tomcat并发优化
        • (1) tomcat并发参数
        • (2) tomcat并发配置
      • 二、Tomcat内存配置
        • (1) tomcat内存参数
        • (2) tomcat内存配置
      • 三、Tomcat垃圾回收
        • (1) JVM中对象的划分及管理
        • (2) jvm垃圾搜集参数
        • (3) tomcat垃圾搜集配置
      • 四、Tomcat宕机预防
        • (1) TCP端口状态
        • (2) Windows系统下的TCP参数
        • (3) tomcat假死分析及预防
      • 五、结语

 

序言

这几天系统问题层出不穷,服务器并发性差、tomcat内存溢出、假死宕机、网络阻塞,搞得我好不难受,寝食难安。但是经过高人指点、网络资料,再加上实践运行测试,系统逐渐稳定下来,性能也提升了不少,轻松之余,为大家分享我的经历,希望大家能够有所收获。

一、Tomcat并发优化

tomcat并发量与其配置息息相关,一般的机器几百的并发量足矣,如果设置太高可能引发各种问题,内存、网络等问题也能在高并发下暴露出来,因此,配置参数的设置非常重要。

(1) tomcat并发参数

  1. maxThreads:最大的并发请求数,当cpu利用率高的时候,不宜增加线程的个数,当cpu利用率不高,大部分是io阻塞类的操作时,可以适当增加该值。
  2. maxSpareThreads:Tomcat连接器的最大空闲 socket 线程数
  3. acceptCount:当处理任务的线程数达到最大时,接受排队的请求个数
  4. connectionTimeout:网络连接超时,单位毫秒
  5. enableLookups:若为false则不进行DNS查询,提高业务能力应设置为false
  6. disableUploadTimeout:若为true则禁用上传超时

      以上是一些比较常用的参数,Tomcat中server.xml配置详解 会有更加详细的介绍。

(2) tomcat并发配置

    在conf下的server.xml文件中<Connector>节点进行配置<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="30000"redirectPort="8443"maxThreads="400"minSpareThreads="50"maxSpareThreads="200"acceptCount="400"enableLookups="false"disableUploadTimeout="true"     />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

二、Tomcat内存配置

tomcat一般都有默认的内存大小,其默认值对整个物理内存来说非常小,如果不配置tomcat的内存,会大大浪费服务器的资源,验证影响系统的性能,所以对tomcat的内存配置对用户量比较大的系统尤为重要。

(1) tomcat内存参数

  1. -server:一定要作为第一个参数,在多个CPU时性能佳
  2. -Xms:java Heap初始大小。 默认是物理内存的1/64。
  3. -Xmx:java heap最大值。建议均设为物理内存的一半。不可超过物理内存。
  4. -XX:PermSize:设定内存的永久保存区初始大小。缺省值为64M。
  5. -XX:MaxPermSize:设定内存的永久保存区最大 大小。缺省值为64M。
  6. -Xmn:young generation(年轻代)的heap大小。一般设置为Xmx的3、4分之一

(2) tomcat内存配置

     在bin下的catalina.bat文件中echo Using CATALINA_BASE:   "%CATALINA_BASE%"的前一行加入如下代码。
set JAVA_OPTS=%JAVA_OPTS% -server -Xms8192m -Xmx8192m -Xmn1890m 
  • 1
  • 2
  • 3

三、Tomcat垃圾回收

垃圾回收(gc)机制非常重要,有时系统会因为内存没有及时回收导致内存溢出,或是内存饱和出现无法响应用户请求的情况,这就要要求我们对空闲内存进行清理,以确保系统正常运行,tomcat GC的最佳配置是确保系统正常运行的关键。

(1) JVM中对象的划分及管理

JVM根据运行于其中的对象的生存时间大致的分为3种。并且将这3种不同的对象分别存放在JVM从系统分配到的不同的内存空间。这种对象存放空间的管理方式叫做Generation管理方式。

  1. Young Generation(年轻代):用于存放“早逝”对象(即瞬时对象)。例如:在创建对象时或者调用方法时使用的临时对象或局部变量。
  2. Tenured Generation(年老代):用于存放“驻留”对象(即较长时间被引用的对象)。往往体现为一个大型程序中的全局对象或长时间被使用的对象。
  3. Perm Generation(永久保存区域):用于存放“永久”对象。这些对象管理着运行于JVM中的类和方法。

(2) jvm垃圾搜集参数

  1. -verbose:gc:显示垃圾收集信息(在虚拟机发生内存回收时在输出设备显示信息)
  2. UseConcMarkSweepGC:开启此参数使用ParNew & CMS(serial old为替补)搜集器
  3. MaxTenuringThreshold:晋升老年代的最大年龄。默认为15,比如设为10,则对象在10次普通GC后将会被放入年老代。
  4. -XX:+ExplicitGCInvokesConcurrent:System.gc()可以与应用程序并发执行。
  5. GCTimeRatio:设置系统的吞吐量。比如设为99,则GC时间比为1/1+99=1%,也就是要求吞吐量为99%。若无法满足会缩小新生代大小。
  6. CMSInitiatingOccupancyFraction:触发CMS收集器的内存比例。比如60%的意思就是说,当内存达到60%,就会开始进行CMS并发收集。
  7. CMSFullGCsBeforeCompaction:设置在几次CMS垃圾收集后,触发一次内存整理。
  8. -Xnoclassgc:禁用类垃圾回收,性能会高一点;
  9. -XX:SoftRefLRUPolicyMSPerMB=N:官方解释是:Soft reference在虚拟机中比在客户集中存活的更长一些。其清除频率可以用命令行参数 -XX:SoftRefLRUPolicyMSPerMB=来控制,这可以指定每兆堆空闲空间的 soft reference 保持存活(一旦它不强可达了)的毫秒数,这意味着每兆堆中的空闲空间中的 soft reference 会(在最后一个强引用被回收之后)存活1秒钟。注意,这是一个近似的值,因为 soft reference 只会在垃圾回收时才会被清除,而垃圾回收并不总在发生。系统默认为一秒。

      以上是一些基本的参数配置,通过JVM内存管理——垃圾搜集器参数精解查看更详细的配置,通过Tomcat中Java垃圾收集调优查看原理

(3) tomcat垃圾搜集配置

tomcat的垃圾搜集是和内存设置一起配置的,内存和gc的设置也不是越大越好,良好的比例可以使你的系统性能提升一般甚至更多,下面是tomcat7 ,服务器物理内存16g的标准配置

在bin下的catalina.bat文件中echo Using CATALINA_BASE:   "%CATALINA_BASE%"的前一行加入如下代码。
  • 1
  • 2

set JAVA_OPTS=%JAVA_OPTS%
-server -Xms8192m -Xmx8192m -Xmn1890m -verbose:gc
-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=5 -XX:+ExplicitGCInvokesConcurrent -XX:GCTimeRatio=19 -XX:CMSInitiatingOccupancyFraction=70 -XX:CMSFullGCsBeforeCompaction=0 -Xnoclassgc -XX:SoftRefLRUPolicyMSPerMB=0

    *要把以上代码写在一行才能生效。* 
  • 1
  • 2

配置后系统的jvm内存运行状况如下:
这里写图片描述

可以看到系统在内存到达2g后就会回收空闲内存,基本不会发生溢出的情况,8g的最大内存最高才用了2g,说明系统的性能还是很优越的,用户数再增加也能在一定程度上保证系统稳定性。

四、Tomcat宕机预防

tomcat在运行一段时间后,出现无法访问的情况,检查内存完全正常,查看服务器端口发现大量close_wait,导致网络阻塞,以至于无法响应无法的请求,这就是tomcat最经常发生的宕机假死现象。

(1) TCP端口状态

  1. LISTENING状态
    FTP服务启动后首先处于侦听(LISTENING)状态。
  2. ESTABLISHED状态
    ESTABLISHED的意思是建立连接。表示两台机器正在通信。
  3. CLOSE_WAIT
    对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭。
  4. TIME_WAIT
    我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。

      更详细的TCP端口状态请参考TCP端口状态说明

(2) Windows系统下的TCP参数

  1. KeepAliveTime
      KeepAliveTime的值控制系统尝试验证空闲连接是否仍然完好的频率。如果该连接在一段时间内没有活动,那么系统会发送保持连接的信号,如果网络正常并且接收方是活动的,它就会响应。如果需要对丢失接收方的情况敏感,也就是说需要更快地发现是否丢失了接收方,请考虑减小该值。而如果长期不活动的空闲连接的出现次数较多,但丢失接收方的情况出现较少,那么可能需要增大该值以减少开销。
      缺省情况下,如果空闲连接在7200000毫秒(2小时)内没有活动,系统就会发送保持连接的消息。
  2. KeepAliveInterval
      KeepAliveInterval的值表示未收到另一方对“保持连接”信号的响应时,系统重复发送“保持连接”信号的频率。在无任何响应的情况下,连续发送“保持连接”信号的次数超过TcpMaxDataRetransmissions(下文将介绍)的值时,将放弃该连接。如果网络环境较差,允许较长的响应时间,则考虑增大该值以减少开销;如果需要尽快验证是否已丢失接收方,则考虑减小该值或TcpMaxDataRetransmissions值。
      缺省情况下,在未收到响应而重新发送“保持连接”的信号之前,系统会等待1000毫秒(1秒)。
  3. KeepAliveInterval
      KeepAliveInterval的值表示未收到另一方对“保持连接”信号的响应时,系统重复发送“保持连接”信号的频率。在无任何响应的情况下,连续发送“保持连接”信号的次数超过TcpMaxDataRetransmissions(下文将介绍)的值时,将放弃该连接。如果网络环境较差,允许较长的响应时间,则考虑增大该值以减少开销;如果需要尽快验证是否已丢失接收方,则考虑减小该值或TcpMaxDataRetransmissions值。
      缺省情况下,在未收到响应而重新发送“保持连接”的信号之前,系统会等待1000毫秒(1秒)。

      更多系统参数请参考Windows系统下的TCP参数

(3) tomcat假死分析及预防

close_wait发生的原因是TCP连接没有调用关闭方法,需要应用来处理网络链接关闭,对于Web请求出现这个原因,经常是因为Response的BodyStream没有调用Close,除了调整代码外,可以调整windows系统参数解决tomcat假死问题

tomcat假死时利用netstat -ano查看端口现象如下:
这里写图片描述
KeepLive在Windows操作系统下默认是7200000毫秒,也就是2个小时才清理一次,对与大量close_wait情况下,可以减小其时间
在注册表的[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]改动或创建以下项
“KeepAliveTime”=dword:afc8 (45000毫秒)
“KeepAliveInterval”=dword:1
“TcpMaxDataRetransmissions”=dword:”5″
情况会明显改善,但不保证大并发下服务器不会出现假死现象,毕竟代码的规范性也占很大比重。

五、结语

写了这么多我也累了,你们也看累了,更可恶的是中间写到一半网络不稳定,导致我写的东西许多都遗失,后面还是咬着牙写完了,现在还没吃饭,澡堂也关门了,哎,不过还是值得。你们能看到这里我也很荣幸,希望对你们有所帮助

这篇关于16G内存 Tomcat并发优化、内存配置、垃圾回收、宕机预防的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/965364

相关文章

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

Nginx 重写与重定向配置方法

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重... 目录一.try_files指令二.return指令三.rewrite指令区分重写与重定向重写: 请求