tomcat的优化

tomcat的并发处理能力不强,大项目不适应tomcat作为转发动态的中间件,(k8s集群,python,rubby),小项目会用,(内部使用的)。

1、tomcat自身的优化

优化tomcat的启动速度。

securerandom.source=file:/dev/urandom

非阻塞的版本,不依赖系统和终端,进程忙也不会进入等待状态。所以处理的速度相对较快。

如果对应的安全性要求比较高,dev/random/

默认的配置不适合生产环境,可能会频繁的出现假死,需要不停的重启。

根据生产环境的实际情况,自行测试。

port 8080 http

8443 https 接收客户端https的请求。

maxThreads:tomcat使用线程来处理接收请求的个数。tomcat最多可以创建多少个线程。默认是200个1000个

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

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

connectionTimeout="20000”网络连接超时时间,单位是亳秒,设置成0,永不超时。默认即可。

enableLookups:是否支持反向解析,true false。关闭false可以提高处理速度。

disableUplaodTimeout:上传时是否使用超限制,10秒true禁用和false开启

connectionUploadTimeout:上传的超时时间

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

compression:是否对响应数据进行压缩。on就是开启,off就是关闭。开启压缩之后,可以有效的减少页面的大小(对文本无效,图片、音频、视频有点用一般可以减少三分之一)默认是off

compression=“on”

compressionMinSize:表示响应压缩的最小值,只有响应报文大于这个值才会进行压缩。如果开启压缩,默认值2048.

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

compressableMimeType=“text/plain,image/jpg” 压缩文件类型,指定哪些类型文件进行压缩。

常用的页面类型:

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

图像类型:image/jpg、image/jpeg、image/gif

音频类型:audio/ogg、audio/wav、audio/mpeg

视频类型:video/mp4、video/webm、video/rmvb、video/quicktime

应用程序:application/pdf、application/json、application/xml

2、内核优化

系统安全的优化

内核优化的配置文件:

vim /etc/security/limits.conf 打开文件数的限制。系统初始化第一步要做的事情。

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

net.ipv4.ip_forward=0/1 禁用或者开启数据包的转发功能,要做路由器必须打开,0是光,1是开。

net.ipv4.tcp_max_tw_buckets=2000 允许timewait的最大数量。

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

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

vm.swappiness=0,关闭内存的交换行为,不适用交换分区,k8s默认就不能使用交换分区,否则会保存。

net.ipv4.tcp_max_orphans: 系统允许的最大的tcp练级数量

net.ipv4.ip local_port_range=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.ip_forward = 0: 禁用IP数据包的转发功能,通常用于不充当路由器的系统。
​
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_max_tw_buckets = 6000: 设置允许的TIME_WAIT套接字最大数量,避免服务器性能下降。
​
net.ipv4.tcp_sack = 1: 启用有选择的应答(SACK)来提高TCP性能。
​
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.core.netdev_max_backlog: 控制网络接口接收数据包的排队队列大小。
​
net.ipv4.tcp_max_orphans: 设置系统允许的孤立TCP连接最大数量。
​
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.ipv4.tcp_fin_timeout: 设置TCP连接FIN(关闭连接)的超时时间。
​
net.ipv4.tcp_keepalive_time: 设置TCP keepalive探测包发送频率,以检测连接状态。
​
net.ipv4.ip_local_port_range: 设置本地端口范围,用于分配本地应用程序端口。
​
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杀掉进程。
​
vm.swappiness = 0: 设置内存交换行为,降低内存交换。
​
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 攻击。

3、jvm优化

JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC" 
-Xmx2048m:java初始化堆的大小,分配jvm的最小内存,cpu的性能比较高,可以分配的高一点
-Xmx2048m:java堆的最大值,也就是vm的最大内存,取决于物理内存的大小,官方建议设置成于xms一样设置成物理内存的一半
-Xmn768m:新生代内存的大小,官方推荐,设置成ivm内存最大值的3/8
java自带垃圾回收机制,java进行垃圾回收之后不需要重新计算堆区的大小。
-XX:ParallelGCThreads=2  配置并行收集器的线程数,同时有多个线程一起进行及时回收,配置成cpu的一半
-XX:PermSize=1024m 设置非堆内存的初始值,持久代内存的大小,默认是物理内存的1/4,建议设置成整个jvm内存的一半;在非堆内存是不会被java的垃圾回收机制处理的
-XX:MaxPermSize=1024m 非堆内存的最大值,和初始值一致即可。
-Djava.awt.headless=true:防止在linux访问的情况下,web页面的图片无法打开
-XX:+DisableExplicitGC" 老年代的收集算法,可以缩短垃圾回收机制的时间

堆区:新生代 中生代 老年代。

没生成一个新的对象,那么对象占用的内存空间就是新生代空间,垃圾回收对堆区当中的资源进行回收之后,新生态没有被回收的资源就变成中生代,中生代就会转移到老年代。

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

tomcat内存池

内存.池    Type    Initial Total   最大.值    Used
PS Eden Space   Heap memory 30.50 MB    110.50 MB   640.50 MB   16.53 MB (2%)
PS Old Gen  Heap memory 81.50 MB    58.50 MB    1301.50 MB  15.75 MB (1%)
PS Survivor Space   Heap memory 5.00 MB 5.00 MB 5.00 MB 4.99 MB (99%)
Code Cache  Non-heap memory 2.43 MB 8.75 MB 240.00 MB   8.65 MB (3%)
Compressed Class Space  Non-heap memory 0.00 MB 2.87 MB 1024.00 MB  2.70 MB (0%)
Metaspace   Non-heap memory 0.00 MB 26.62 MB    -0.00 MB    26.13 MB

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

PS Old Gen 堆内存 长期存活的对象,永生带。

PS Survivor Space 堆内存 存储新生代PS Eden Space、PS Old Gen之间的存活对象,中生代。

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

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

Metaspace 非堆内存 存储元数据的区域。

ajp-nio-8009

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

ajp协议:tomcat服务器和web服务器连接的协议,可以提供负载均衡和高效转发。nio可以提供高并发的处理能力

8009:就是ajp的端口

tomcat和nginx实现动静分离

访问nginx就是静态页面

nginx代理 index.jsp可以访问tomcat的动态页面

1

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐