Tomcat服务之优化详解

Tomcat的优化

Tomcat的并发处理能力不强,大项目一般不使用Tomcat作为转发动态的中间件(一般使用k8s集群,Python,Ruby等),小项目会使用(内部访问的)。

1. 优化Tomcat的启动速度

默认配置不适合生产环境,可能频繁出现假死,需要不停地重启。要根据生产环境的实际情况,自行测试。

2. 配置文件参数优化

Tomcat安装目录的conf目录下,配置server.xml

http请求的端口是8080,https的请求端口是8443

maxThreads :Tomcat处理接收请求使用线程的最大个数,默认200,一般设置为500-1000

minSpareThreads :最小空闲数线程,Tomcat开启之后,没人使用也会有进程待命,默认值是10

maxSpareThreads :最大空闲数线程,一旦线程总数超过这个值,Tomcat就会关闭不再需要的线程。默认是-1,就是不限制。一般不设置。

connectionTimeout :20000 ,单位毫秒,网络连接超时时间,设置为0就是永不超时。一般默认即可。

enableLookups :是否支持反向解析,值为 true / false ,一般都关闭(false),可以提高处理速度

disableUploadTimeout :上传时是否禁用超时机制,值为 true / false ,true是禁用,false是禁止

connectionUploadTimeout :上传的超时时间,默认10s

acceptCount :当所有可用的处理请求的线程数都被使用时,可以接入请求的最大队列长度(排队长度),如果超过了这个数字的请求将被不予处理(直接丢弃),默认是100个,可以不写

compression :是否对响应数据进行压缩,on是开启,off是关闭,对文本效果不大,对图片、音频、视频等有效,一般可以减少1/3?,默认是off

compressionMinSize :响应压缩的最小值,大于这个值的响应报文才会被压缩。默认值是2048,即2M

noCompressionUserAgents=“浏览器名称” :对与这些浏览器,不启用压缩。

常用的页面类型

文本类型 :text/plain , text/html , text/css , text/javascript

图像类型 :image/jpg , image/jpeg , image/gif , image/png 等

音频类型 :audio/ogg , wav , mpeg 等(前缀省略)

视频类型 :video/mp4 , webm , rmvb , quicktime 等

应用程序 :application/pdf , json , xml 等

3. 内核优化
内核优化是对系统安全的优化补齐。

内核优化的配置文件:

/etc/security/limits.conf :修改打开系统最大文件数等,系统初始化第一步要做的事,修改后重启系统才能生效。

/etc/sysctl.conf :内核参数文件

sysctl -p :使修改生效

sysctl -a :查看内核参数设置
 

部分常用内核参数的解释:

net.ipv4.ip_forward=0/1 :禁用或开启数据包的转发功能,如果要做路由器,必须打开。0关,1开。(b端)

net.ipv4.tcp_max_tw_buckets=2000 :允许timewait的最大数量,如果太多,会影响服务器的性能

net.ipv4.tcp_sack=1 :启用有选择的应答,可以提高tcp的处理性能

net.core.netdev_max_backlog=262144 网络接口接收数据包队列的最大的大小(单位 字节),即256M

vm.swappiness=0 :关闭内存的交换行为,不使用交换分区,比如K8S就默认不能使用交换分区,否则会报错。

net.ipv4.tcp_max_orphans :设置系统允许的孤立TCP连接最大数量。

net.ipv4.ip_local_port_range=1024 65000 :设定系统的端口范围1024-65000

net.ipv4.tcp_fin_timeout=10 :设置tcp关闭连接的超时时间(单位 秒)

net.ipv4.tcp_keepalive_time :设置tcp的keepalive包的探测包的发送频率,用于检测连接状态
 

其他内核参数:
kernel.sysrq = 0: 禁用了内核的SysRq功能,SysRq允许在系统崩溃或出现问题时执行一些调试操作。

kernel.core_uses_pid = 1: 设置核心转储文件名中包含进程ID,有助于标识是哪个进程导致了核心转储。

kernel.msgmnb 和 kernel.msgmax: 增加IPC消息队列的默认和最大大小,用于进程间通信。

kernel.shmmax 和 kernel.shmall: 调整共享内存的最大大小和分配页面数。

net.ipv4.conf.default.rp_filter 和 net.ipv4.conf.all.rp_filter: 控制反向路径过滤,提高网络安全性。

net.ipv4.icmp_echo_ignore_all: 允许或禁止系统响应ping请求。

net.ipv4.icmp_echo_ignore_broadcasts: 禁止系统对广播和多播地址的ICMP回显和时间戳请求作出响应。

net.ipv4.conf.default.accept_source_route: 不接受源路由,增加网络安全性。

net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,保护系统免受TCP SYN 攻击。

net.ipv4.tcp_window_scaling = 1: 启用TCP窗口缩放功能,允许大窗口的TCP传输。

net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 调整TCP套接字读取和写入缓冲区大小。

net.ipv4.tcp_mem: 设置TCP缓冲区的最小、默认和最大值。

net.core.wmem_default, net.core.rmem_default, net.core.rmem_max, net.core.wmem_max: 调整网络核心
缓冲区的大小。
 

net.ipv4.tcp_max_syn_backlog: 控制系统允许的三次握手队列长度。

net.ipv4.tcp_synack_retries 和 net.ipv4.tcp_syn_retries: 设置SYN-ACK和SYN请求的重试次数。

net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_tw_reuse: 启用TIME_WAIT套接字快速回收和重用。

net.ipv6.conf.all.disable_ipv6 和 net.ipv6.conf.default.disable_ipv6: 禁用IPv6。

net.netfilter.nf_conntrack_max 和其他 net.netfilter.nf_conntrack_*: 控制连接跟踪和防火墙相关设置。

net.nf_conntrack_max: 设置最大连接跟踪项数。

vm.overcommit_memory = 0: 控制内存超额分配策略,避免OOM killer杀掉进程。

fs.file-max = 999999: 设置进程可以同时打开的最大文件句柄数。

net.ipv4.tcp_max_tw_buckets = 6000: 设置操作系统允许的TIME_WAIT套接字最大数量。

net.ipv4.ip_local_port_range = 1024 65000: 设置系统允许的本地端口范围。

net.ipv4.tcp_tw_recycle = 1: 启用TIME_WAIT套接字快速回收。
net.ipv4.tcp_tw_reuse = 1: 允许TIME-WAIT套接字重用。

net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,防止TCP SYN 攻击。

net.core.somaxconn = 40960: 设置最大监听队列长度,用于控制最大并发连接数。

net.core.netdev_max_backlog = 262144: 设置每个网络接口接收数据包队列的最大大小。

net.ipv4.tcp_max_syn_backlog = 262144: 设置接受SYN请求队列的最大长度。

net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 设置TCP套接字读取和写入缓冲区的最小、默认和最大大小。

net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max: 设置内核套接字接收和
发送缓冲区大小。

net.ipv4.tcp_syncookies = 1: 设置启用SYN Cookies,用于解决TCP SYN 攻击。

4. JVM优化

启用jar包 :java -jar jar包文件 &

注意要在后台运行,否则关闭当前终端运行就停止了

在 /bin目录下的 catalina.sh 文件中添加(文件首部位置附近)

-Xms2048m :java初始化堆的大小,分配jvm的最小内存 2048M,cpu性能高的可以分配高一点

-Xmx2048m :java堆的最大值 2048M,也就是jvm的最大内存,取决于物理内存的大小,官方建议设置成Xms一样的值,一般设置为物理内存的一半

-Xmn768m :新生代内存的大小,官方推荐,设置为jvm内存最大值的3/8,java自带垃圾回收机制,java进行垃圾回收之后不需要重新计算堆区的大小

堆区:新生代,中生代,老生代三种。每生成一个新的对象,对象占用的内存空间就是新生代空间。

垃圾回收对堆区当中的资源进行回收之后,新生代没有被回收的资源就转移到中生代,中生代的就会转移到老生代。

整个jvm堆的大小:新生代+老生代+永久代(系统自带的)

-XX:ParallelGCThreads=2 :配置并行收集器的线程数,同时有多少个线程一起来进行回收,配置成CPU的一半

-XX:PermSize=1024m :设置非堆内存的初始值,持久代内存的大小,默认是物理内存的1/4,建议设置成整个jvm内存的一半

非堆内存是不会被java的垃圾回收机制处理的,所以是持久代。
-XX:MaxPermSize=1024m :非堆内存的最大值,和初始值一致即可

-Djava.awt.headless=true :防止在Linux环境下,web页面的图片不能打开

-XX:+DisableExplicitGC :老年代的收集算法,缩短垃圾回收机制的时间
 

jvm的内存池

PS Eden Space :堆内存,创建一个新的对象都在堆内存中

PS Old Gen :堆内存,长期存活的对象,可以理解为永生代

PS Survive Space :堆内存,上述二者之间的存活对象,可以理解为中生代

Code Cache :非堆内存,存储已经编译的代码

Compressed Class Space :非堆内存,存储已经压缩过的类定义

Metaspace :非堆内存,存储元数据的区域(根本、核心的数据)

ajp-nio-8009

ajp-nio :连机器的类型。ajp是协议,nio:异步非阻塞的通信方式

ajp协议:Tomcat服务器和web服务器之间进行连接的协议。可以提供负载均衡和高校转发。配合nio异步非阻塞通信可以提高高并发处理能力。

8009 :ajp的默认端口。
 

 

 

 

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值