Tomcat 8(十)HTTP/AJP Connector、Bio/Nio/Apr性能对照
Tomcat 8(七)解读Bootstrap介绍过,Connector初始化/启动的时候,将初始化/启动内部的ProtocolHandler。事实上ProtocolHandler仅仅是个接口
ProtocolHandler的UML图(下面这些类在org.apache.coyote包下)
创建Connector对象时,Connector的构造函数内会依据server.xml的Connector标签的配置创建ProtocolHandler(默为Http11NioProtocol)
- public Connector(String protocol) {
- setProtocol(protocol);
- // Instantiate protocol handler
- ProtocolHandler p = null;
- try {
- Class<?> clazz = Class.forName(protocolHandlerClassName);
- p = (ProtocolHandler) clazz.newInstance();
- } catch (Exception e) {
- log.error(sm.getString(
- "coyoteConnector.protocolHandlerInstantiationFailed"), e);
- } finally {
- this.protocolHandler = p;
- }
- if (!Globals.STRICT_SERVLET_COMPLIANCE) {
- URIEncoding = "UTF-8";
- URIEncodingLower = URIEncoding.toLowerCase(Locale.ENGLISH);
- }
- }
setProtocol(protocol)方法内容:
- public void setProtocol(String protocol) {
- //protocol相应server.xml的Connector标签的protocol属性
- if (AprLifecycleListener.isAprAvailable()) {
- if ("HTTP/1.1".equals(protocol)) {
- setProtocolHandlerClassName
- ("org.apache.coyote.http11.Http11AprProtocol");
- } else if ("AJP/1.3".equals(protocol)) {
- setProtocolHandlerClassName
- ("org.apache.coyote.ajp.AjpAprProtocol");
- } else if (protocol != null) {
- setProtocolHandlerClassName(protocol);
- } else {
- setProtocolHandlerClassName
- ("org.apache.coyote.http11.Http11AprProtocol");
- }
- } else {
- if ("HTTP/1.1".equals(protocol)) {
- setProtocolHandlerClassName
- ("org.apache.coyote.http11.Http11NioProtocol");
- } else if ("AJP/1.3".equals(protocol)) {
- setProtocolHandlerClassName
- ("org.apache.coyote.ajp.AjpNioProtocol");
- } else if (protocol != null) {
- setProtocolHandlerClassName(protocol);
- }
- }
- }
假设server.xml配置了AprLifecycleListener
- <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
AprLifecycleListener.isAprAvailable()为true
Connector支持两种协议:HTTP/1.1和AJP/1.3
HTTP比較熟悉,在此不做说明了。AJP主要用于Tomcat的负载均衡,即Web Server(如Apache) 能够通过AJP协议向Tomcat发请求
AJP(Apache JServ Protocol)是一种定向包协议, 用于将传入Web Server(如Apache)的request传递到处理详细业务的Application Server(如Tomcat)
AJP的长处:
1. AJP使用二进制格式来传输可读性文本,Web Server通过TCP连接Application Server,较HTTP性能更高
2. 为了降低生成socket的开销,Web Server和Application Server之间尝试保持持久性的TCP连接,对多个request/response循环重用一个连接
3. 一旦连接分配给一个特定的request,在该request完毕之前不会再分配给其它request。因此,request在一个连接上是独占的,这使连接两端的编码变得简洁
4. 在连接上发送的基本请求信息是高度压缩的
AJP的缺点:
1. 某一时刻的连接数可能较多
2. HTTP Connector能够在Server.xml设置有效时间(connectionTimeout),而AJP Connector是永久有效
AJP协议的设计:http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html
以下来測试下HTTP和AJP的性能
測试环境:win8.1 64位(4核、4G内存) + Tomcat8.0.3
64位 + jdk1.7.0_51 64位
压力測试工具:Apache ab
监控工具:Process Explorer、任务管理器
測试方法:在Tomcat\webapps\examples下创建index.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ page import="java.text.SimpleDateFormat"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Test</title>
- </head>
- <body>
- Server Info:
- <%
- String dtm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
- System.out.println("["+request.getLocalAddr()+":"+ request.getLocalPort()+"]" + dtm);
- out.println("<br>["+request.getLocalAddr()+":" +request.getLocalPort()+"]" + dtm+"<br>");
- %>
- Session Info:
- <%
- session.setAttribute("name","dennisit");
- System.out.println("[Session Info] Session ID:"+session.getId());
- out.println("<br>[Session Info] Session ID:" + session.getId()+"<br>");
- %>
- </body>
- </html>
index.jsp的内容比較简单,就是获取Server信息和Session信息。Tomcat 8默认配置下,配置了AprLifecycleListener,监听8080port的Connector使用HTTP/1.1协议;监听8009port的Connector使用AJP/1.3协议,这两个port默认使用apr模式。使用ab向HTTP Connector/AJP Connector发送10000个请求(并发量设为1000)
測试HTTP Connector的命令:ab -n 10000 -c 1000 localhost:8080/examples/index.jsp
測试AJP Connector的命令:ab -n 10000 -c 1000 localhost:8009/examples/index.jsp
下面数据是三次測试的平均值(注:每次仅仅測一个Connector,每次測试都会重新启动Tomcat)
名词解释:
时间-处理全然部请求所用的时间(单位:s)
CPU-java.exe进程的CPU占用峰值
内存-java.exe进程的内存占用峰值(单位:MB)
流量-处理请求期间的宽带占用(单位:kb/s)
測试结果:
通过上表能够看出,AJP处理请求稍快一点,但使用AJP时,CPU和内存占用更少,宽带占用差点儿为0(因为使用AJP时,发送的基本请求信息是高度压缩。当然,也跟这个请求简单有关系)
所以,AJP Connector的性能更优
每一个ProtocolHandler内部都有一个Endpoint,ProtocolHandler初始化/启动的时候,将初始化/启动其内部的Endpoint
Tomcat有三种Endpoint:JIoEndpoint、NioEndpoint、AprEndpoint
ProtocolHandler与Endpoint的相应关系
Http11Protocol/AjpProtocol使用JIoEndpoint
Http11NioProtocol/AjpNioProtocol使用NioEndpoint
Http11AprProtocol/AjpAprProtocol使用AprEndpoint
Server.xml的Connector标签配置的部分属性(如port),在Endpoint中才真正被使用。因此仅仅有Endpoint启动了,Tomcat才開始监听指定端口
学习这三种Endpoint之前,须要了解下java io和java nio,可參考这两篇文章:
http://www.cnblogs.com/flyoung2008/p/3251826.html
http://tutorials.jenkov.com/java-nio/index.html
JIoEndpoint:使用java io(也称为bio)技术,即一个请求相应一个线程。缺点:并发量高时,线程数较多,占资源
NioEndpoint:使用java nio技术,能够通过少量的线程处理大量的请求
AprEndpoint:Apr即Apache Portable Runtime,从操作系统层面解决io堵塞问题。使用Apr时将用到Tomcat\bin\tcnative-1.dll (使用Apr时,应用了jni技术)。
Tomcat 8默认配置下,HTTP Connector和AJP Connector均使用Apr。測试AprEndpoint,使用Tomcat 8的默认配置就可以。測试JIoEndpoint、NioEndpoint须要将server.xml中的AprLifecycleListener凝视掉
- <!--
- <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
- -->
并改动Connector标签的protocol属性
測试JIoEndpoint的配置:
- <Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol "
- connectionTimeout="20000"
- redirectPort="8443" />
測试NioEndpoint的配置:
- <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol "
- connectionTimeout="20000"
- redirectPort="8443" />
三种Endpoint的測试採用HTTP Connector
測试结果:
通过上表能够看出,Apr处理请求最快,Bio最慢;Apr宽带占用最高,Bio最低;但Apr的内存占用最高,而Nio的内存占用最低
所以综合来看,Nio适用于一般需求;Apr适用于高并发需求
Tomcat 8(十)HTTP/AJP Connector、Bio/Nio/Apr性能对照的更多相关文章
- Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化
Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomc ...
- Tomcat Connector三种执行模式(BIO, NIO, APR)的比較和优化
Tomcat Connector的三种不同的执行模式性能相差非常大,有人測试过的结果例如以下: 这三种模式的不同之处例如以下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. ...
- tomcat bio nio apr 模式性能测试
转自:tomcat bio nio apr 模式性能测试与个人看法 11.11活动当天,服务器负载过大,导致部分页面出现了不可访问的状态.那后来主管就要求调优了,下面是tomcat bio.nio.a ...
- Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式及apr配置
转: http://www.oschina.net/question/54100_16195omcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志. ...
- 【转】Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式
转载地址:http://www.oschina.net/question/54100_16195 tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或 ...
- Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式
tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态. ...
- Tomcat Connector(BIO, NIO, APR)三种运行模式(转)
Tomcat支持三种接收请求的处理方式:BIO.NIO.APR . BIO 阻塞式I/O操作即使用的是传统 I/O操作,Tomcat7以下版本默认情况下是以BIO模式运行的,由于每个请求都要创建一个线 ...
- tomcat7.0.27的bio,nio.apr高级运行模式(转)
一 前言 tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务 ...
- Apache Tomcat 7 Configuration BIO NIO AIO APR ThreadPool
Apache Tomcat 7 Configuration Reference (7.0.93) - The Executor (thread pool)https://tomcat.apache.o ...
随机推荐
- 10、bitmap格式分析
说到图片,位图(Bitmap)当然是最简单的,它Windows显示图片的基本格式,其文件扩展名为*.BMP.在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图个时候才能显示出来,各种 ...
- Nginx+Memcached+Tomcat集群配置(MSM--win7 64bit)
本次主要是在win7 64 上演示操作. web应用构建 Memcached安装配置启动 Tomcat配置 所需jar包 memcached-session-manager 序列化 contextxm ...
- SAP ABAP编程 字符串加密-MD5_CALCULATE_HASH_FOR_CHAR
DATA: str1 TYPE c LENGTH 12 VALUE 'zxcv', str2 TYPE c LENGTH 32, str3 TYPE c LENGTH 32. ...
- 怎样实现iMessage群发
怎样实现iMessage群发 Apple公司全线在mac os与ios两个操作系统上内置了FaceTime与iMessage两个应用.完美替代运营商的短信与电话.并且FaceTime与iMessage ...
- 怎样把ul li 前面的点去掉
在li 属性框里 放入 <li style="list-style-type:none;">...<li> 就可以了
- ssion机制详解
ssion机制详解 ref:http://justsee.iteye.com/blog/1570652 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚sess ...
- Java CPU使用率过高分析
http://note.youdao.com/publicshare/?id=d02cba2714709d4d4fe8a8627fc1cf41&type=note#/ (友情提示:本博文章欢迎 ...
- 封装springmvc处理ajax请求结果
原文链接:http://blog.csdn.net/qq_37936542/article/details/79064818 需求描述:ajax向后台发起请求,springmvc在处理完请求后返回的结 ...
- [RxJS] Add debug method to Observable in TypeScript
Observable.prototype.debug = function(message: any) { return this.do( (next) => { if(!environment ...
- Android selector背景以及透明色
selector可以设置图片或layout的点击效果: <?xml version="1.0" encoding="utf-8"?> <sel ...