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

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

Web server: apache2.2 (maxClient:250)

设置apache最大连接数

  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)

  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

  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

  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 一项有明显的区别。

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

  1. Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)

    漏洞原理 Tomcat配置了两个Connecto,它们分别是HTTP和AJP. HTTP默认端口为8080,处理http请求:AJP默认端口8009,用于处理 AJP 协议的请求. AJP比http更 ...

  2. Tomcat配置(三):tomcat处理连接的详细过程

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

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

    Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html tomcat可以处理静态资源的请求,也可以通过servlet处理动态资源的请求 ...

  4. AJP协议总结与分析

    Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户.默认情况下,Tomcat在server.x ...

  5. tomcat源码分析(三)一次http请求的旅行-从Socket说起

    p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...

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

    p { margin-bottom: 0.25cm; line-height: 120% }

  7. Tomcat源码分析

    前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...

  8. Tomcat处理HTTP请求源码分析(上)(转)

    转载自:http://www.infoq.com/cn/articles/zh-tomcat-http-request-1 很多开源应用服务器都是集成tomcat作为web container的,而且 ...

  9. 服务器程序源代码分析之三:gunicorn

    服务器程序源代码分析之三:gunicorn 时间:2014-05-09 11:33:54 类别:网站架构 访问: 641 次 gunicorn是一个python web 服务部署工具,类似flup,完 ...

随机推荐

  1. Oracle中三种循环(For、While、Loop)案例

    1.ORACLE中的FOR循环用法(九九乘法表) declare i ; j ; begin .. loop ..i loop Dbms_Output.put(i||'*'||j||'='||i*j) ...

  2. Linux正确的关机方式

    本人还未入门,仅看书所得. Linux不建议的是直接关电源.Linux后台可能有多人在工作,直接关电源可能造成文件的毁坏. 正常关机之前应该干两件事:一.查看一下谁在线:二.通知一下别人啦,通知别人可 ...

  3. 关于在VWmare下安装Redhat

    本文是小白博主自行摸索安装的过程,下文主要是给出几篇很有用的文章出处和自己遇到的问题. 一.关于安装包 对于安装包,个人建议是去官网下载(个人安装的是rhel 7.4),可能初接触Linux时,是不是 ...

  4. 代码收藏系列--php--加载sql文件并解析成数组

    php加载sql文件,解析成以分号分割的数组.(支持存储过程和函数提取,自动过滤注释) /** * 加载sql文件为分号分割的数组 * <br />支持存储过程和函数提取,自动过滤注释 * ...

  5. spark(四)

    一. spark 2  版本 相对于以前版本的变化 spark core  : Accumulators (累加器):性能更好,页面上也可以看到累加器的信息 spark sql: 1. 2.DataS ...

  6. bzoj2054: 疯狂的馒头(并查集)

    每个区间只被覆盖一次,求每个点被哪种区间覆盖或者某个区间是否已经被覆盖过都可以用并查集做. 做法:每个点都指向当前被覆盖区间的右端点+1的位置,某个点的下一个没被覆盖的点是gf(i),同理如果某个区间 ...

  7. 【学习笔记】ac自动机&fail树

    定义 解决文本串和多个模式串匹配的问题: 本质是由多个模式串形成的一个字典树,由tie的意义知道:trie上的每一个节点都是一个模式串的前缀: 在trie上加入fail边,一个节点fail边指向这个节 ...

  8. POJ2975:Nim(Nim博弈)

    Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7279   Accepted: 3455 题目链接:http://p ...

  9. LightOJ 1166 Old Sorting 置换群 或 贪心 水题

    LINK 题意:给出1~n数字的排列,求变为递增有序的最小交换次数 思路:水题.数据给的很小怎么搞都可以.由于坐标和数字都是1~n,所以我使用置换群求循环节个数和长度的方法. /** @Date : ...

  10. 每个Web开发者都需要具备的9个软技能

    对于一份工作,你可能专注于修炼自己的内功,会在不自觉中忽视软技能.硬技能决定你是否能得到工作,而软技能能够表明你是否适合这份工作和适应工作环境等.所有的公司都有属于自己的文化,并努力将这些文化传承下去 ...