【软件性能测试与调优实践】应用中间件的性能分析与调优

中间件除了web中间件外最重要的就是应用中间件
web中间件一般主要负责静态资源请求的处理和动态请求的转发,而动态请求一般都是由应用中间件来进行处理
平时最常用的应用中间件就是Tomcat和WildFly,应用中间件作为操作系统和应用程序之间的桥梁,为处于其中的应用程序组件提供一个运行环境
由于应用中间件处理的是动态请求,所以其性能好坏往往会直接影响系统的处理能力

Tomcat的性能调优

Tomcat的组件及工作原理

Tomcat运行需要JDK(Java Development Kit,Java语言开发工具包)的支撑,运行在JVM(Java Virtual Machine, Java虚拟机)上的一个进程,是Java应用程序和JVM之间的中间容器

Tomcat的顶层结构图
在这里插入图片描述
Tomcat 的核心功能有两个,负责接收和反馈外部请求的连接器 Connector和负责处理请求的容器 Container,其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service,每个 Tomcat 服务器可以管理多个 Service

在这里插入图片描述

Server

代表整个Tomcat应用服务容器中间件,里面可以包含多组子服务,Server负责管理和启动里面配置的每组子服务。Server的核心配置定义在Tomcat中conf目录下的server.xml配置文件中,这个配置文件中包含了Service、Connector、Container、Engine、Hosts等主组件的相关配置信息,如下所示,在Tomcat启动时会启动一个监听在8005端口,以接收shutdown命令的Server实例(实际就是一个JVM进程)
使用telnet命令可以连接到启动后的8005端口上,直接执行SHUTDOWN命令来关闭Tomcat Server实例

<?xml version='1.0' encoding='utf-8'?>
<Server poot="8005" shutdown="SHUTDOWN">
......
</Server>
Service

Tomcat Server封装对外可以提供完整的基于组件的Web应用服务,包含了Connector和Container两大核心组件,Container中又包含了多个子功能组件,每个Service之间是相对独立互不干扰,但是依附于同一个Server进程,并且共享同一个Server实例的JVM资源,在server.xml中配置

<?xml version='1.0' encoding='utf-8'?>
<Server poot="8005" shutdown="SHUTDOWN">
	<Service name="Catalina1">
	......
	</Service>
	<Service name="Catalina1">
	......
	</Service>
</Server>
Connector

Tomcat Server对外提供Web应用服务的连接器,可以通过监听指定端口,接收外部调用者发给Tomcat Server的请求,传递给Container,并将Container处理的响应结果返回给外部调用者,在server.xml中的配置如下,在Connector中一般会配置对应端口以及连接器处理的协议,比如HTTP、AJP等,也可以配置连接器的超时时间等

<?xml version='1.0' encoding='utf-8'?>
<Server poot="8005" shutdown="SHUTDOWN">
	<Service name="Catalina1">
		<Connector poot="8080" protocol="HTTP/1.1" URIEncoding="utf-8" connectionTimeout="20000" redirectPort="8443"  />
		<Connector poot="8009" protocol="AJP/1.3" redirectPort="8443" />
	</Service>
	<Service name="Catalina1">
	......
	</Service>
</Server>
Container

Tomcat Server的核心容器,其内部由多层组件组成,用于管理部署到容器中服务器端程序的整个生命周期(这些服务器端程序一般是用Java语言编写),调用服务端程序相关方法来完成请求的处理。Container由Engine、Host等组件共同组成
在这里插入图片描述

  • Engine
    Tomcat Server服务器端程序的处理引擎,Engine需要定义一个defaultHost属性,以作为默认的Host组件来处理没有明确指定虚拟主机的请求。一个Engine中可以包含多个Host,但是必须有一个Host的名称和defaultHost属性中指定的名称一致
    Host
    位于Engine引擎中用于接收请求并进行相应处理的主机或虚拟主机,负责Web应用的部署和Context的创建

Tomcat容器的I/O调优

随着计算机编程的发展,I/O的常见处理方式一般包括同步阻塞I/O、同步非阻塞I/O、异步非阻塞I/O、I/O多路复用等

同步阻塞I/O

当在用户态调用I/O读取操作时,如果此时操作系统内核(Kernel)还没有准备好待读取的数据或者数据还没处理完毕,用户态会一直阻塞等待,直到有数据返回,这时候就是在同步阻塞的情况下进行I/O等待。当操作系统准备好数据后,用户态需要继续等待操作系统内核把数据从内核态拷贝到用户态之后才可以使用。总共会发生两次同步阻塞的I/O等待,用户态等待操作系统内核准备好可读的数据,以及等待操作系统内核把数据拷贝到用户态

同步非阻塞I/O

对比同步阻塞I/O,同步非阻塞I/O是不需要操作系统内核把数据准备完毕才有返回,而是不管数据是否处理好了都会立即返回
如果操作系统内核返回数据还未处理完毕,用户态线程会轮询不断地发起I/O请求,直到操作系统内核把数据处理完成或者准备完毕,然后用户态开始等待操作系统内核把数据拷贝到用户态

异步非阻塞

对比同步非阻塞I/O,异步非阻塞I/O处理模式在发起读取数据请求后,就不需要做任何等待,此时用户线程就可以继续去执行别的操作。在操作系统内核把数据处理完毕,并且把数据从内核拷贝到用户态后,会主动通知用户线程数据已经拷贝完成,在收到通知后,用户线程再去读取数据即可

I/O多路复用

在传统的I/O处理方式中,每来一个I/O请求就需要开启一个进程或者线程来处理,如果是在高并发的调用方式中,就需要开启大量的进程和线程来进行I/O处理,而大量的进程或者线程必然会需要大量的服务器硬件资源来支撑,I/O多路复用可以解决这个问题
开启单个进程或者线程,通过记录I/O流的状态来同时管理多个I/O,就可以有效地节省服务器资源,以及减少线程过多时带来的服务器CPU的中断和切换,从而提高资源的有效利用,也可以提高服务器的吞吐能力

在Tomcat Server中,Connector的实现模式可以是I/O阻塞的方式,也可以是I/O非阻塞的方式,可以通过server.xml中指定Connector的I/O处理方式
在默认情况下,Tomcat Server的Connector指定的protocol为"HTTP/1.1",这种方式就是阻塞的处理方式,可以修改为protocol="org.apache.coyote.http11.Http11NioProtocol"Http11NioProtocol是一种非阻塞的I/O处理模式

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="30000" URIEncoding="UTF-8" enableLookups="false" redirectPort="443" />

对应设置

  • BIO(同步阻塞I/O)
protocol="HTTP/1.1"
  • NIO(同步非阻塞)
protocol="org.apache.coyote.http11.Http11NioProtocol"
  • NIO2(异步非阻塞)
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
  • APR(JNI调用)
protocol="org.apache.coyote.http11.Http11AprProtocol"

WildFly的性能调优

一个开源的基于JavaEE的轻量级应用服务器,于Tomcat相比,WildFly的管理能力更强,更加适用于大型的应用集群服务器中

WildFly Standalone模式

WildFly常用的部署模式一般包括Standalone(独立运行)模式和Domain(分布式运行)模式,一般Standalone模式用得会更多一些

WildFly最大的特点是采用了模块化设计,启动时可以按照模块进行按需加载。WildFly目录下的modules文件夹存放着各个模块,每个模块以一个jar包的形式存在,并且会有一个对应的module.xml进行定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sysu_lluozh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值