Tomcat性能优化

闲来无事,逛网站看到一篇关于 Tomcat APR的文章,结合自己以前使用过的一些经验,整理篇文章,希望能帮助到一些朋友

通常tomcat作为java开发者的默认应用服务器。但是tomcat默认的配置都比较低。容易造成性能瓶颈

可以从多方面来进行优化

1、内存大小

tomcat/bin目录下的 catalina.bat/windows catalina.sh/linux

调整内存大小

JAVA_OPTS='-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m'

-Xms<size> JVM初始化堆的大小

-Xmx<size> JVM堆的最大值 实际参数大小根据服务器配置或者项目具体设置

2、tomcat在并发线程方面的优化

打开conf目录下的server.xml文件

找到<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="300" minSpareThreads="50" maxSpareThreads="400" acceptCount="500" />,这是默认配置

在里面加上:maxThreads="300" minSpareThreads="50" maxSpareThreads="400" acceptCount="500"等配置信息,根据实际情况而定

最终:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="300" minSpareThreads="50" maxSpareThreads="400" acceptCount="500" minProcessors="100" maxProcessors="1000" enableLookups="true"/>

maxThreads="300" 表示最多同时处理300个连接

minSpareThreads="50" 初始化50个连接

maxSpareThreads="400" 表示如果最多可以有400个线程,一旦超过400个,则会关闭不在需要的线程

acceptCount="500" 当同时连接的人数达到maxThreads时,还可以排队,队列大小为500.超过500就不处理,监听端口队列最大数,满了之后客户请求会被拒绝同时不能小于maxSpareThreads数

minProcessors="100" 服务器创建时的最小处理线程数 
maxProcessors="1000" 服务器同时最大处理线程数 

enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名

3、tomcat缓存优化

还是以上配置信息

compression 打开压缩功能 
compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB 
compressableMimeType 压缩类型 
connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="300" minSpareThreads="50" maxSpareThreads="400" acceptCount="500" minProcessors="100" maxProcessors="1000" enableLookups="true" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>

4、开启NIO模式

同步阻塞IO(BIO):

我们熟知的Socket编程就是BIO,一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作)。阻塞的原因在于:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。

同步非阻塞IO(NIO):

New IO是对BIO的改进,基于Reactor模型。我们知道,一个socket连接只有在特点时候才会发生数据传输IO操作,大部分时间这个“数据通道”是空闲的,但还是占用着线程。NIO作出的改进就是“一个请求一个线程”,在连接到服务端的众多socket中,只有需要进行IO操作的才能获取服务端的处理线程进行IO。这样就不会因为线程不够用而限制了socket的接入。客户端的socket连接到服务端时,就会在事件分离器注册一个 IO请求事件 和 IO 事件处理器。在该连接发生IO请求时,IO事件处理器就会启动一个线程来处理这个IO请求,不断尝试获取系统的IO的使用权限,一旦成功(即:可以进行IO),则通知这个socket进行IO数据传输。

NIO还提供了两个新概念:Buffer和Channel

Buffer:
–        是一块连续的内存块。
–        是 NIO 数据读或写的中转地。
Channel:
–        数据的源头或者数据的目的地
–        用于向 buffer 提供数据或者读取 buffer 数据 ,buffer 对象的唯一接口。
–         异步 I/O 支持
      Buffer作为IO流中数据的缓冲区,而Channel则作为socket的IO流与Buffer的传输通道。客户端socket与服务端socket之间的IO传输不直接把数据交给CPU使用,
而是先经过Channel通道把数据保存到Buffer,然后CPU直接从Buffer区读写数据,一次可以读写更多的内容。
      使用Buffer提高IO效率的原因(这里与IO流里面的BufferedXXStream、BufferedReader、BufferedWriter提高性能的原理一样):IO的耗时主要花在数据传输的路上,普通的IO是一个字节一个字节地传输,
而采用了Buffer的话,通过Buffer封装的方法(比如一次读一行,则以行为单位传输而不是一个字节一次进行传输)就可以实现“一大块字节”的传输。比如:IO就是送快递,普通IO是一个快递跑一趟,采用了Buffer的IO就是一车跑一趟。很明显,buffer效率更高,花在传输路上
的时间大大缩短。

异步阻塞IO(AIO):

          NIO是同步的IO,是因为程序需要IO操作时,必须获得了IO权限后亲自进行IO操作才能进行下一步操作。AIO是对NIO的改进(所以AIO又叫NIO.2),它是基于Proactor模型的。每个socket连接在事件分离器注册 IO完成事件 和 IO完成事件处理器。程序需要进行IO时,向分离器发出IO请求并把所用的Buffer区域告知分离器,分离器通知操作系统进行IO操作,操作系统自己不断尝试获取IO权限并进行IO操作(数据保存在Buffer区),操作完成后通知分离器;分离器检测到 IO完成事件,则激活 IO完成事件处理器,处理器会通知程序说“IO已完成”,程序知道后就直接从Buffer区进行数据的读写。

          也就是说:AIO是发出IO请求后,由操作系统自己去获取IO权限并进行IO操作;NIO则是发出IO请求后,由线程不断尝试获取IO权限,获取到后通知应用程序自己进行IO操作。

tomcat通讯协议支持http1.0和1.1,默认BIO通讯模式

将以上配置信息的protocol改为org.apache.coyote.http11.Http11NioProtocol

即:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" maxThreads="300" minSpareThreads="50" maxSpareThreads="400" acceptCount="500" minProcessors="100" maxProcessors="1000" enableLookups="true" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>

5、APR(Apache Portable Runtime)  https://apr.apache.org/

APR是以操作系统级别的来解决异步IO问题,在性能方面有大幅度提升

APR的整体模式还是非阻塞IO,实现的线程模型也是按照NIO的标准模型实现的

目前Tomcat 8.x默认情况下全部是运行在NIO模式下(包括Spring Boot默认也是NIO),而apr的本质就是使用jni技术调用操作系统底层的IO接口,所以需要提前安装所需要的依赖,首先是需要安装openssl和apr。还需要安装tomcat-native,native可以看成是tomcat和apr交互的中间环节。详细安装步骤网上很多

注意native需要openssl版本大于1.0.2

安装完之后在tomcat/bin目录的catalina.sh/bat 

文件添加配置 JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib

注意需要将server.xml文件里面默认的protocol="HTTP/1.1"修改为protocol="org.apache.coyote.http11.Http11AprProtocol" 上面已经提到过

启动tomcat 会看到日志http-apr-8080等信息

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值