Tomcat的优化
Tomcat的并发处理能力不强,大项目一般不使用Tomcat作为转发动态的中间件(一般使用k8s集群,Python,Ruby等),小项目会使用(内部访问的)。
1. 优化Tomcat的启动速度
vim /urs/java/jdk1.8.0_201-amd86/jre/lib/security/java-security 117行 改为 /dev/urandom #非阻塞的版本,不依赖系统的终端,进程忙也不会进入等待状态,所以处理速度相对较快 #如果对应用安全性要求比较高,必须使用/dev/random ./shutdown ./startup
默认配置不适合生产环境,可能频繁出现假死,需要不停地重启。要根据生产环境的实际情况,自行测试。
2. 配置文件参数优化
Tomcat安装目录的conf目录下,配置server.xml
cd /usr/local/tomcat/conf vim server.xml #71行处修改connector的内容,新增行 maxThreads="500" minSpareThreads="20" enableLookups="false" disableUploadTimeout="true" connectionUploadTimeout="20000"
解释:
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=“浏览器名称” :对与这些浏览器,不启用压缩。
compressableMimeType=“” 压缩类型,指定对哪些类型的文件进行压缩,多种类型用逗号
,
隔开常用的页面类型
文本类型 :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 文件中添加(文件首部位置附近)
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC" cygwin=false
解释:
-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的默认端口