Tomcat优化

avatar
作者
筋斗云
阅读量:2

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. 内核优化

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

内核优化的配置文件:

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

  2. /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的默认端口

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!