系统环境:jdk1.8,apache-tomcat-8.5.35

一、jvm优化

进入 bin/catalina.sh,修改JAVA_OPTS配置:

JAVA_OPTS="-server -Xms8192M -Xmx8192M -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/javamemorylogs/dump -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/javamemorylogs/gclog -XX:+DisableExplicitGC"

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

linux下jvm优化、tomcat调优 Linux 第1张

各参数含义: (1)-server:表示这是应用于服务器的配置,JVM 内部会有特殊处理的 。 (2)-Xms8192m:设置JVM最小内存。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 (3)-Xmx8192m:设置JVM最大可用内存。 (4):-XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与终身代的比值(除去永久代)。设置为 4,则年轻代与终身代所占比值为 1:4,年轻代占整个堆栈的 1/5 。 (4)-XX:SurvivorRatio=8:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:8,表示Eden:Survivor=8:2,一个Survivor区占整个年轻代的1/10。 (5)-XX:+UseConcMarkSweepGC:CMS收集,设置年老代为并发收集。它的主要适合场景是对响应时间的重要性需求大于对吞吐量的需求,能够承受垃圾回收线程和应用线程共享CPU资源,并且应用中存在比较多的长生命周期对象。CMS收集的目标是尽量减少应用的暂停时间,减少Full GC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代内存。 (6)-XX:ParallelGCThreads=8:表示JVM在进行并行GC的时候,用于GC的线程数。 (7)-XX:+HeapDumpOnOutOfMemoryError:可以让JVM在出现内存溢出时候Dump出当前的内存转储快照。 (8)XX:HeapDumpPath:生成DUMP文件的路径,如不设置,默认存储在jvm 运行环境目录。 (9)-XX:+PrintGCDetails:打印GC详细信息。 (10)-XX:+PrintGCDateStamps:记录GC日志并不会特别地影响Java程序性能,推荐你尽可能记录日志。 (11)-Xloggc:指定GC log的位置,以文件输出。帮助开发人员分析问题。 (12)-XX:+DisableExplicitGC:这个将会忽略手动调用 GC 的代码使得 System.gc() 的调用就会变成一个空调用,完全不会触发任何 GC。

二、tomcat优化

1.修改conf/server.xml如下两段配置:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="700" minSpareThreads="100" maxSpareThreads="400" prestartminSpareThreads = "true" maxQueueSize = "300"/>   <Connector executor="tomcatThreadPool" port="80" protocol="org.apache.coyote.http11.Http11Nio2Protocol" acceptCount="500" connectionTimeout="20000" redirectPort="8443" compression="on" disableUploadTimeout="true" compressionMinSize="2048" acceptorThreadCount="2" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" URIEncoding="utf-8" enableLookups="false" useURIValidationHack="false" maxConnections="1000" tcpNoDelay="true" /> linux下jvm优化、tomcat调优 Linux 第2张 重点参数解释: (1)maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断 (2)minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25 (3)prestartminSpareThreads:在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了 (4)maxQueueSize:最大的等待队列数,超过则拒绝请求 (5)acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100 (6)maxConnections:服务器在任何给定时间将接受和处理的最大连接数。当达到这个数字时,服务器将接受,但不处理另一个连接。这个额外的连接将被阻塞,直到正在处理的连接数量低于maxConnections,此时服务器将开始接受并再次处理新的连接。请注意,一旦达到限制,操作系统仍然可以接受基于acceptCount设置的连接。默认值因连接器类型而异。对于BIO,默认值是maxThreads的值,除非使用Executor,在这种情况下,默认值将是执行者的maxThreads的值。对于NIO和NIO2,默认值为10000.对于APR/native,默认值为8192。简单来说就是nio使用maxConnections代替maxThreads。 (7)enableLookups:禁用DNS查询

2.关闭shutdown端口

shown端口是写在Server参数里的,直接去掉是不管用,也是会默认启动的,一般在安全设置时候建议把端口修改为其他端口,shutdown修改为其他复杂字串。实际上这个端口是可以直接屏蔽不监听的。设置时候将其port值修改为-1即可: <Server port="-1" shutdown="SHUTDOWN"> linux下jvm优化、tomcat调优 Linux 第3张

3、禁用tomcat Manager管理入口

为防止从tomcat web管理界面上传文件,破坏运行环境,可以手动删除tomcat自带的管理界面。 进入tomcat默认页面时有“server status”、“manager app”、“Host manager”。 linux下jvm优化、tomcat调优 Linux 第4张 如果修改conf/tomcat-users.xml,配置后: <role rolename="manager"/> <role rolename="manager-gui"/> <role rolename="admin"/> <user username="user" password="password" roles="admin,manager,manager-gui"/> linux下jvm优化、tomcat调优 Linux 第5张

访问tomcat web页面,用上面配置的用户名密码登录将会出现如下界面,一旦用户名密码泄露或被攻击,服务器很容易被破坏。

Server Status

linux下jvm优化、tomcat调优 Linux 第6张

Manager App

 linux下jvm优化、tomcat调优 Linux 第7张

Host Manager

linux下jvm优化、tomcat调优 Linux 第8张

避免如上界面入口引发问题,操作如下: 1、进入tomcat/webapps目录 2、只保留manager,ROOT,以及项目相关文件,删除其他包含docs、examples、host-manager文件(rm -rf 目录名称), 如果怕出错,请先备份要删除的文件linux下jvm优化、tomcat调优 Linux 第9张

重新启动tomcat后,Tomcat Manager Web将如下:

Server Status

linux下jvm优化、tomcat调优 Linux 第10张

 

Manager App

linux下jvm优化、tomcat调优 Linux 第11张

Host Manager

linux下jvm优化、tomcat调优 Linux 第12张

恭喜!优化设置到此结束,赶紧尝试一下吧!

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄