TOMCAT的优化
tomcat的优化主要是从三个方面进行的,第一个是 tomcat配置
的优化第二是对JVM虚拟机的优化
第三是对Linux系统内核的优化,配置文件中的优化主要在tomcat中server.xml文件夹内
tomcat配置文件的优化
1、 maxThreads:
Tomcat 使用线程来处理接收的每个请求,这个值表示 Tomcat 可创建的最大的线程数,默认值是 200。
修改tomcat/conf/server.xml的配置文件,并修改 在模块中进行修改,如图
<Connector port="8081" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"maxThreads="300" />
把TomCat的最大并发量改成300
2、minSpareThreads:
最小空闲线程数,Tomcat 启动时的初始化线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10
下面是在第一题基础上把最小空闲线程数改成20
在Connector设置块中加入
minSpareThreads="20"
3、connnectionTimeout;
网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常默认 20000 毫秒就可以。
可以在Connector模块里加入
connnectionTimeout="30000"
就可以设置完成长连接持续时间30秒
4、maxKeepAliveRequests
最大连接请求数
它用于指定允许的最大持久连接(Keep-Alive)请求数。持久连接允许客户端在单个TCP连接上发送多个HTTP请求,以减少连接的开销,提高性能。通俗的来说,就是一次长连接允许发送的HTTP请求数,通常默认是-1也就是不限制
在Connector模块里加入
maxKeepAliveRequests="100"
5、acceptCount
它用于指定在Tomcat已经满负荷工作时,接受新连接的请求数量。当所有的处理线程都在工作时,新的连接请求会被放置在一个队列中等待处理。默认值:acceptCount的默认值通常是100。这意味着当Tomcat的处理线程已满时,最多会接受100个新的连接请求,其余请求会被拒绝。
acceptCount="200"
将最大等待链接数设置成200
6、enableLookups
用于指定是否进行DNS反查(反向DNS查找)以返回客户端主机的主机名。将其设置为 true 表示Tomcat会尝试通过客户端IP地址查找对应的主机名,而将其设置为 false 则表示Tomcat不进行反查,直接返回IP地址,以提高性能。默认值:通常情况下,enableLookups 的默认值为 true,这意味着Tomcat会尝试进行DNS反查以获取客户端主机的主机名。从性能方面考虑建议关闭
在Connector模块里加入可以关闭DNS反查
enableLookups="false"
JVM虚拟机的优化
在 catalina.sh
中设置
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=1024m -XX:MaxPermSize=1024m -Xmn768m"
-
-server
:这个选项启用了JVM的Server模式,它是一种优化模式,适用于多核服务器,可以提供更好的性能。Server模式主要优化了编译和运行时的性能,适合长时间运行的应用程序。通常情况下,使用-server
是一个好的做法,特别是在生产环境中。 -
-Xms2048m -Xmx2048m
:这两个选项用于设置JVM的堆内存大小。-Xms
设置堆的初始大小,-Xmx
设置堆的最大大小。在你的配置中,堆内存被设置为2GB,这意味着JVM会启动时分配2GB的初始堆空间,并且允许堆的最大大小达到2GB。这个设置可以根据你的应用程序和服务器的性能需求进行调整,通常设置为物理内存的一部分,以避免频繁的垃圾回收。 -
-XX:PermSize=1024m -XX:MaxPermSize=1024m
:这两个选项用于设置JVM的永久代(PermGen)大小。永久代主要用于存储类的元数据信息,例如类的结构、方法、字段等。在Java 8及更高版本中,永久代被元数据区(Metaspace)取代,因此这些选项在Java 8及以后的版本中不再有效。在你的配置中,永久代被设置为1GB,这通常足够存储大多数应用程序的类元数据。类元数据的大小取决于应用程序的复杂性和使用的库。 -
-Xmn
:这个选项用于设置JVM堆内存中的新生代大小。新生代是堆内存的一部分,用于存储新创建的对象。在你的配置中,新生代被设置为768MB,这是堆内存大小的3/8。通常情况下,新生代的大小应根据应用程序的内存分配模式和性能需求进行调整。较大的新生代可以容纳更多的新对象,但也会导致更频繁的垃圾回收。