AJP与HTTP比较和分析

系统环境:
OS:Ubuntu 10.10 (2G)

Servlet Container:tomcat-tomcat-7.0.23  (最大内存:default 256M  maxThreads:500)

Web server: apache2.2 (maxClient:250)

设置apache最大连接数

Java代码  

  1. 在/usr/local/etc/apache22/httpd.conf中加载MPM配置(去掉前面的注释):
  2. # Server-pool management (MPM specific)
  3. Include etc/apache22/extra/httpd-mpm.conf
  4. 修改d-mpm.conf中对应module如下
  5. <IfModule mpm_prefork_module>
  6. StartServers                      5
  7. MinSpareServers                   5
  8. MaxSpareServers                  10
  9. ServerLimit                     3000
  10. MaxClients                      2000
  11. MaxRequestsPerChild               0
  12. </IfModule>]

一、benchmark测试方法

./ab -n 100000 -c 100 http://localhost/test

使用ab进行测试,当并发较高时,会出现以下错误

错误1:apr_socket_recv: Connection reset by peer (104)

Java代码  

  1. apache2.2及以下版本
  2. 修改support下面的ab.c源代码, 大概在
  3. line 1369, 修改成
  4. 1368                 return;
  5. 1369             } else {
  6. 1370                 //apr_err("apr_socket_recv", status);
  7. 1371                 bad++;
  8. 1372                 close_connection(c);
  9. 1373                 return;
  10. 1374             }
  11. 然后编译安装

错误2:Too many open files (24)

(PS;使用AJP协议和HTTP协议,多次进行测试,取测试结果较好的一次进行比较)

二、使用AJP后的benchmark

Java代码  

  1. Benchmarking localhost (be patient)
  2. Completed 10000 requests
  3. Completed 20000 requests
  4. Completed 30000 requests
  5. Completed 40000 requests
  6. Completed 50000 requests
  7. Completed 60000 requests
  8. Completed 70000 requests
  9. Completed 80000 requests
  10. Completed 90000 requests
  11. Completed 100000 requests
  12. Finished 100000 requests
  13. Server Software:
  14. Server Hostname:        localhost
  15. Server Port:            80
  16. Document Path:          /test
  17. Document Length:        347 bytes
  18. Concurrency Level:      100
  19. Time taken for tests:   50.270 seconds
  20. Complete requests:      100000
  21. Failed requests:        0
  22. Write errors:           0
  23. Total transferred:      48712175 bytes
  24. HTML transferred:       34708675 bytes
  25. Requests per second:    1989.24 [#/sec] (mean)
  26. Time per request:       50.270 [ms] (mean)
  27. Time per request:       0.503 [ms] (mean, across all concurrent requests)
  28. Transfer rate:          946.29 [Kbytes/sec] received
  29. Connection Times (ms)
  30. min  mean[+/-sd] median   max
  31. Connect:        0   23  15.3     21     714
  32. Processing:     2   27  19.8     24     724
  33. Waiting:        1   22  15.4     20     714
  34. Total:          9   50  25.3     44     747
  35. Percentage of the requests served within a certain time (ms)
  36. 50%     44
  37. 66%     49
  38. 75%     53
  39. 80%     55
  40. 90%     64
  41. 95%     73
  42. 98%     87
  43. 99%    101
  44. 100%    747 (longest request)

三、使用HTTP 后的benchmark

Java代码  

  1. Benchmarking localhost (be patient)
  2. Completed 10000 requests
  3. Completed 20000 requests
  4. Completed 30000 requests
  5. Completed 40000 requests
  6. Completed 50000 requests
  7. Completed 60000 requests
  8. Completed 70000 requests
  9. Completed 80000 requests
  10. Completed 90000 requests
  11. Completed 100000 requests
  12. Finished 100000 requests
  13. Server Software:        Apache-Coyote/1.1
  14. Server Hostname:        localhost
  15. Server Port:            80
  16. Document Path:          /test
  17. Document Length:        347 bytes
  18. Concurrency Level:      100
  19. Time taken for tests:   55.392 seconds
  20. Complete requests:      100000
  21. Failed requests:        0
  22. Write errors:           0
  23. Total transferred:      51415934 bytes
  24. HTML transferred:       34710757 bytes
  25. Requests per second:    1805.32 [#/sec] (mean)
  26. Time per request:       55.392 [ms] (mean)
  27. Time per request:       0.554 [ms] (mean, across all concurrent requests)
  28. Transfer rate:          906.47 [Kbytes/sec] received
  29. Connection Times (ms)
  30. min  mean[+/-sd] median   max
  31. Connect:        0   24  10.1     24     185
  32. Processing:     8   31  10.7     28     215
  33. Waiting:        1   26  10.0     24     198
  34. Total:         13   55  12.3     51     247
  35. Percentage of the requests served within a certain time (ms)
  36. 50%     51
  37. 66%     54
  38. 75%     58
  39. 80%     60
  40. 90%     66
  41. 95%     74
  42. 98%     86
  43. 99%     99
  44. 100%    247 (longest request)

四、结论

If integration with the native webserver is needed for any reason,
an AJP connector will provide faster performance than proxied HTTP.

前端apache,后端tomcat,通过ajp协议访问性能优于http协议,随着并发量的提升,效果会更加趋于明显。可以从吞吐率和总时间开销上观察。

(吞吐率:单位时间内计算机的处理请求来描述其并发处理能力)

可以参考下ajp协议的设计 http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html

原因总结如下:

1、ajp使用长连接保持webServer和servlet Container的通信,减少了建立tcp连接的开销。可以通过观察tomcat/manager 下serverStatus,ajp建立的连接都处于keepalive的状态。

2、ajp使用一定的协议格式,减少了传递的报文数据大小,节省了带宽。可以通过观察ajp和http 的benchmark报告重看到,Total transferred 一项有明显的区别。

时间: 2024-10-13 06:14:40

AJP与HTTP比较和分析的相关文章

Tomcat(三):tomcat处理连接的详细过程

*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-template_comment, .diff .hljs-header, .hljs-javadoc { color: #998; font-style: italic; } .hljs-keyword, .css .rule .hljs-keyword, .h

【CVE-2020-1938】Tomcat AJP 任意文件读取和包含漏洞分析记录

0x00 前言 2020年2月20日傍晚,在某群看到有群友问CNVD的tomcat文件包含漏洞有什么消息没 接着看到安恒信息应急响应中心公众号发了个漏洞公告 随后chy师傅也在群里发了个阿里云的公告链接 根据安恒和阿里云公告给出的信息我们知道是tomcat ajp服务出了问题,但具体是哪里出了问题却不知道.(这个时候我就在想阿里云是怎么知道ajp服务出了问题的呢? 以tomcat7为例给出的修复版本是100,遂去github看commit,看100版本release之前的commit记录. 0x

AJP协议总结与分析

Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户.默认情况下,Tomcat在server.xml中配置了两种连接器: <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --> <Connector port="8080" maxThreads="150" minSpare

tomcat系列分析之生命周期管理初始化动作

tomcat中有很多组件,要对这些组件进行生命周期的管理非常困难,tomcat中采用的是抽象出一个生命周期管理接口,然后所有的组件都实现该接口,当父组件启动时,同事负责将子组件启动起来,从而完成整tomcat的初始.启动.结束等动作. 来看下tomcat启动的过程,首先构造Bootstrap类,调用其中的init方法,完成类加载器的初始化,方便后面加载类使用,然后调用其中的load方法,实际上tomcat真正的启动动作是由Catalina类完成的.而这其中在BootStrap中调用Catalin

TOMCAT源码分析(启动框架)

建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, 是不那么容易掌握TOMCAT的框架的. 所以得实践.实践.再实践. 建议下载一份TOMCAT的源码, 调试通过, 然后单步跟踪其启动过程. 如果有不明白的地方, 再来查阅本文, 看是否能得到帮助. 我相信这样效果以及学习速度都会好很多! 1. Tomcat的整体框架结构 Tomcat的基本框架, 分为4个层次. Top Level Elements: Server Service Connector HTTP AJP Conta

Tomcat 学习进阶历程之Tomcat架构与核心类分析

前面的http及socket两部分内容,主要是为了后面看Tomcat源码而学习的一些网络基础.从这章开始,就开始实际深入到Tomcat的'内在'去看一看. 在分析Tomcat的源码之前,准备先看一下Tomcat的架构与一些核心类的简单分析,并简单介绍一下Tomcat是如何处理一次Http请求的.这部分内容有相当一部分来源于网络,在此,感谢原作者的贡献. Tomcat的总体架构 Tomcat的架构关系可以从Tomcat的配置文件server.xml中看到端倪. 从上图中可以看出Tomcat 的心脏

tomcat源码分析(一)从tomcat架构说起

p { margin-bottom: 0.25cm; line-height: 120% } 首先dowload源码并导入到Eclipse中,导入后代码代码的层次如下图所示.先简单来看下tomcat源码的结构.javax这个包主要是有关JavaEE规范的,比如Servlet等等,并不是我们主要分析的.需要分析有org.apache下的子包,其中catalina中很重要,其中tomcat的启动就在该包下中的startup包下, catalina下还定义了tomcat容器(server,servic

Tomcat7调试运行环境搭建与源代码分析入门

1. 需要准备好下面这些工具 JDK 1.6+ Maven 2或3 TortoiseSVN 1.7+ (从1.7开始".svn"目录集中放在一处了,不再每个目录下都放一份) Eclipse 3.5+ 这4个工具不在这里描述怎么配置了,如果你是有两三年开发经验的Java开发人员,正常来讲都一直在用了. 另外,分析tomcat源代码不需要对这4个工具做什么特殊配置. 2. 下载Tomcat的源代码 Apache旗下的开源项目基本上都放在这: http://svn.apache.org/re

Tomcat7.0源码分析——请求原理分析(上)

前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多人早期的J2EE项目,由程序员自己实现Jsp页面或者Servlet接受请求,后来借助Struts1.Struts2.Spring等中间件后,实际也是利用Filter或者Servlet处理请求,大家肯定要问了,这些Servlet处理的请求来自哪里?Tomcat作为Web服务器是怎样将HTTP请求交给Servlet的呢? 本文就