高并发、资源利用效率和稳定性等因素。为了提升 Tomcat 的运行效率和稳定性,我们可以从操作系统、Tomcat 配置文件以及 Java 虚拟机(JVM)三个方面进行优化。
Tomcat 的配置文件主要是 conf/server.xml
,其中
标签是优化的重点之一。以下是一些常用的优化参数及其解释:
redirectPort
:当 HTTP 连接器接收到 HTTPS 请求时,重定向到的端口。maxThreads
:Tomcat 可创建的最大线程数,即支持的最大并发连接数。默认值可能较低,根据服务器硬件和负载情况调整。minSpareThreads
:Tomcat 启动时初始化的线程数,即最小空闲线程数。maxSpareThreads
:最大备用线程数,一般不需要设置,默认为-1(无限制)。processorCache
:线程池中的线程在空闲时会被缓存起来,以便快速响应新的请求。这个值可以根据 maxThreads
设定或设为-1。URIEncoding
:Tomcat 容器的 URL 编码格式,通常设置为 UTF-8。connectionTimeout
:网络连接超时时间,单位毫秒。enableLookups
:是否反查域名。为了提高性能,应设置为 false
。disableUploadTimeout
和 connectionUploadTimeout
:与上传文件相关的超时设置。acceptCount
:当所有处理请求的线程都在使用时,可接受的最大请求队列长度。maxKeepAliveRequests
:长连接的最大请求数。compression
、compressionMinSize
、compressableMimeType
:控制是否对响应进行 GZIP 压缩及其相关设置。以下是一个示例配置,展示了如何在 server.xml
文件中调整
的参数:
vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="300"
maxThreads="500"
processorCache="500"
URIEncoding="UTF-8"
maxKeepAliveRequests="100"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
/>
查看 Tomcat 线程:
在 Linux 系统中,你可以使用 ps
命令结合 -T
和 -p
选项来查看指定 Tomcat 进程的线程信息:
ps -T -p <PID>
这里
是 Tomcat 进程的 ID。这个命令会列出该进程下所有的线程及其相关信息。
你的配置和解释已经很详细了,但有一些地方需要根据现代JVM(特别是从Java 8开始)的实际情况进行调整和澄清。下面是对你原始配置和说明的详细整理及更新:
对于2C4G(2核CPU,4GB内存)的服务器环境,以下是一个推荐的JVM配置示例,适用于Tomcat运行在Java 8或更高版本上:
vim /usr/local/tomcat/bin/catalina.sh
配置添加在 Tomcat 的 bin 目录下 catalina.sh 里,位置在 cygwin=false 前。
# 在 catalina.sh 中设置 JAVA_OPTS
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof -XX:ParallelGCThreads=2 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.awt.headless=true -XX:+DisableExplicitGC"
# 确保这行在 cygwin=false 之前
cygwin=false
- 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
- 因此建议-Xms与-Xmx设成一样的值,均设为物理内存的一半。其目的是为了能够在java垃圾回收机制清理完堆区内存后不需要重新计算堆区内存的大小而浪费资源。
- 堆区进一步细化分为:新生代、中生代、老生代。
- java中每新new一个对象所占用的内存空间就是新生代的空间,当java垃圾回收机制对堆区进行资源回收后,那些新生代中没有被回收的资源将被转移到中生代,中生代的被转移到老生代。
- 整个JVM堆大小 = 新生代大小 + 老生代大小 + 永久代大小
- 非堆区内存是不会被java垃圾回收机制进行处理的,且最大堆内存与最大非堆内存的和不能超出操作系统的可用内存。
- XMX和XMS设置一样大,MaxPermSize和PermSize设置一样大,这样可以减轻伸缩堆大小带来的压力。
System.gc()
被误调用,这可能导致不必要的性能下降。-XX:PermSize
和 -XX:MaxPermSize
参数不再使用,取而代之的是 -XX:MetaspaceSize
和 -XX:MaxMetaspaceSize
。对于大多数应用来说,默认设置(元空间大小根据需要动态增长)就足够了,除非你有特殊需求。tomcat优化.docx
server.xml
)在 Tomcat 的主配置文件 server.xml
中,可以调整多个参数以优化性能。以下是一些常用的优化参数及其说明:
UTF-8
。false
以提高性能。on
或 force
以减少传输数据量。Tomcat 作为 Java 程序,运行在 JVM 上,因此 JVM 的调优对 Tomcat 性能至关重要。以下是一些常用的 JVM 启动参数:
-Xmx
设置相同值以避免内存波动。-XX:NewSize
和 -XX:MaxNewSize
。System.gc()
。java.lang.OutOfMemoryError: Java heap space
-Xms
和 -Xmx
的值,增加 JVM 堆内存大小。java.lang.OutOfMemoryError: PermGen space
-XX:MaxPermSize
设置永久代大小;JDK 8 及以上版本已移除永久代,使用元空间(Metaspace)。java.lang.StackOverflowError
部署多个Tomcat实例可以在同一台服务器上运行多个独立的Web应用,提高资源利用率和系统灵活性。
首先,确保已安装JDK。然后下载并解压Tomcat到指定目录,并创建两个Tomcat实例的目录结构。
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2
编辑/etc/profile.d/tomcat.sh
文件,为每个Tomcat实例设置独立的环境变量。
vim /etc/profile.d/tomcat.sh
# tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1
# tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
使环境变量生效:
source /etc/profile.d/tomcat.sh
编辑第二个Tomcat实例的server.xml
文件,确保各实例的端口号不冲突。
vim /usr/local/tomcat/tomcat2/conf/server.xml
# 修改Server端口
<Server port="8006" shutdown="SHUTDOWN">
# 修改HTTP Connector端口
<Connector port="8081" protocol="HTTP/1.1">
# 修改AJP Connector端口
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
编辑每个Tomcat实例的startup.sh
和shutdown.sh
文件,添加相应的环境变量。
# 对于tomcat1
vim /usr/local/tomcat/tomcat1/bin/startup.sh
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
# 对于tomcat2
vim /usr/local/tomcat/tomcat2/bin/startup.sh
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
分别启动两个Tomcat实例,并检查端口监听情况。
/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
netstat -natp | grep java
通过浏览器访问两个Tomcat实例,验证是否正常运行。
http://192.168.80.101:8080
http://192.168.80.101:8081
注意