web服务器长连接

web服务器都提供长连接的方式,所谓长连接就是客户端一次请求完后,不关闭连接,保持一段时间的连接,下次此客户端再次请求时,不用创建新连接,复用所保持的连接即可。从理论上,长连接可以免去大量建立和关闭连接的资源消耗,但同时也有大量连接被占用的代价。因此可以初步判断长连接比短连接能带来更高的TPS,更低的CPU消耗,更少的IO,更高的内存占用,下面通过实战来验证。

服务器环境和测试工具可以见工具和环境准备篇

本次web服务器选用apache prefork模式,apache长短连接的选择可以配置httpd.conf里的KeepAlive选项,如:

KeepAlive On:长连接

KeepAlive Off:短连接

另外如果选择长连接还需配置KeepAliveTimeout和MaxKeepAliveRequests,其中KeepAliveTimeout为每个长连接服务端保持时长,默认配置为15秒,MaxKeepAliveRequests为每个长连接服务请求最大数,默认配置为100次,本次试验保持默认配置。

使用ab来压apache,如:

短连接环境下: /usr/alibaba/install/httpd-2.0.63-prefork/bin/ab -c 100 -n 1000000 http://localhost/

长连接环境下: /usr/alibaba/install/httpd-2.0.63-prefork/bin/ab -c 100 -n 1000000 -k http://localhost/

同时都已100个并发请求apache默认首页1000000次

然后通过ab测试结果、nmon收集资源消耗和strace跟踪实际调用三个维度来考察短连接和长连接的区别。

1)ab测试结果

短连接:

[python] view plaincopy

  1. Concurrency Level:      100
  2. Time taken for tests:   190.754776 seconds
  3. Complete requests:      1000000
  4. Failed requests:        0
  5. Write errors:           0
  6. Total transferred:      1891115351 bytes
  7. HTML transferred:       1456088816 bytes
  8. Requests per second:    5242.33 [#/sec] (mean)
  9. Time per request:       19.075 [ms] (mean)
  10. Time per request:       0.191 [ms] (mean, across all concurrent requests)
  11. Transfer rate:          9681.50 [Kbytes/sec] received
  12. Connection Times (ms)
  13. min  mean[+/-sd] median   max
  14. Connect:        0    8   3.7      8      44
  15. Processing:     1   10   3.8      9      79
  16. Waiting:        0    7   3.0      7      61
  17. Total:          4   18   5.7     17     101

长连接:

[python] view plaincopy

  1. Concurrency Level:      100
  2. Time taken for tests:   59.509558 seconds
  3. Complete requests:      1000000
  4. Failed requests:        0
  5. Write errors:           0
  6. Keep-Alive requests:    990148
  7. Total transferred:      1927566346 bytes
  8. HTML transferred:       1456007280 bytes
  9. Requests per second:    16804.02 [#/sec] (mean)
  10. Time per request:       5.951 [ms] (mean)
  11. Time per request:       0.060 [ms] (mean, across all concurrent requests)
  12. Transfer rate:          31631.71 [Kbytes/sec] received
  13. Connection Times (ms)
  14. min  mean[+/-sd] median   max
  15. Connect:        0    0   0.1      0      12
  16. Processing:     0    5  22.5      1    1406
  17. Waiting:        0    5  22.4      1    1405
  18. Total:          0    5  22.5      1    1409

从中不然发现,在其他参数和环境相同的情况下,长连接比短连接的TPS高很多,16804.02/sec vs 5242.33/sec,另外也不难发现长连接在connection上花的时间几乎为0

2)nmon 的测试结果

cpu消耗:

短连接

长连接

以上数据表明长连接比短连接消耗CPU较少

IO占用:

短连接

长连接

以上数据表明长连接比短连接IO占用更少

内存空闲:

短连接

长连接

以上数据表明长连接比短连接占用更多内存

3)strace结果

apache的prefork模式是每个请求由单独的子进程来响应,因此通过对其中的一个子进程跟踪来比较调用系统资源的次数

短连接:

[python] view plaincopy

  1. % time     seconds  usecs/call     calls    errors syscall
  2. ------ ----------- ----------- --------- --------- ----------------
  3. 44.24    0.187941          19      9997           accept
  4. 40.22    0.170887          10     17738           poll
  5. 2.58    0.010976           0     67716     17737 read
  6. 2.49    0.010583           0     59964      9994 lstat
  7. 2.19    0.009319           0     49970      9994 stat
  8. 1.74    0.007388           0     39976           setsockopt
  9. 1.42    0.006045           1      9997           shutdown
  10. 1.25    0.005312           0     29988           close
  11. 1.06    0.004499           0     19989           open
  12. 0.71    0.003003           0     19994           fcntl
  13. 0.57    0.002426           0      9994           write
  14. 0.45    0.001911           0      9994           writev
  15. 0.38    0.001598           0      9994           sendfile
  16. 0.35    0.001503           0      9997           getsockname
  17. 0.34    0.001439           0      9997           gettimeofday
  18. 0.00    0.000002           1         2           fstat
  19. 0.00    0.000001           1         1           lseek
  20. 0.00    0.000001           1         1           mmap
  21. 0.00    0.000001           1         1           munmap
  22. ------ ----------- ----------- --------- --------- ----------------
  23. 100.00    0.424835                375310     37725 total

长连接:

[python] view plaincopy

  1. % time     seconds  usecs/call     calls    errors syscall
  2. ------ ----------- ----------- --------- --------- ----------------
  3. 37.05    0.032997           3      9919           write
  4. 21.90    0.019503           2      9940           poll
  5. 10.38    0.009248           0     39676           setsockopt
  6. 7.86    0.007000           0     49595      9919 stat
  7. 7.46    0.006642           0     59514      9919 lstat
  8. 5.35    0.004764           0     49720      9941 read
  9. 3.54    0.003156           0     19839           open
  10. 2.27    0.002018           0      9919           sendfile
  11. 1.95    0.001735           0     19941           close
  12. 1.28    0.001143           0      9919           writev
  13. 0.92    0.000816           0      9921           gettimeofday
  14. 0.02    0.000014           0       200           fcntl
  15. 0.01    0.000007           0       100           accept
  16. 0.01    0.000007           0       100           getsockname
  17. 0.01    0.000006           0       100         1 shutdown
  18. 0.00    0.000002           1         2           fstat
  19. 0.00    0.000001           1         1           lseek
  20. 0.00    0.000001           1         1           mmap
  21. 0.00    0.000001           1         1           munmap
  22. ------ ----------- ----------- --------- --------- ----------------
  23. 100.00    0.089061                288408     29780 total

以上数据表明,长连接accept和shutdown次数仅为100次,而短连接为9997次,近100倍的差距,从这里就不难发现为什么长连接的TPS那么高了,省了这么多次系统调用,不快才怪啊。

本次试验得出验证来开始的理论分析:长连接比短连接能带来更高的TPS,更低的CPU消耗,更少的IO,更高的内存占用,更少的系统调用

时间: 2024-08-06 15:11:11

web服务器长连接的相关文章

如何实现android和服务器长连接

转载 这种功能实际上就是数据同步,同时要考虑手机本身.电量.网络流量等等限制因素,所以通常在移动端上有一下两个解决方案: 1.一种是定时去server查询数据,通常是使用HTTP协议来访问web服务器,称Polling(轮询): 2.还有一种是移动端和服务器建立长连接,使用XMPP长连接,称Push(推送). 从耗费的电量.流量和数据延迟性各方面来说,Push有明显的优势.但是使用Push的缺点是: 对于客户端:实现和维护相对成本高,在移动无线网络下维护长连接,相对有一些技术上的开发难度. 对于

Android 心跳包心跳连接 如何实现android和服务器长连接呢?推送消息的原理

前言:现在的大多数移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接受消息的被动权.例如:微信,QQ,天气预报等等,相信好处和用户体验相信大家都知道吧. 提出问题:这种功能必须涉及client(客户端)和server(服务器),所以到底client如何和server实现实时连接通讯? 分析问题:这种功能实际上就是数据同步,同时要考虑手机本身.电量.网络流量等等限制因素,所以通常在移动端上有一下两个解决方案:1.一种是定时去server查询数据,通常是使用HTTP协议来访问web服

web通讯长连接与长轮询

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息.这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已. 二.长连接.长轮询的应用场景 长连接.长轮询一般应用与WebIM.ChatRoom和一些需要及时交互的网站应用中.其真实案例有:WebQQ

shell基础知识---与监听服务器长连接端口状态

从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808string=str 字符串可以用单引号和双引号包裹,也可不包裹.数字话不用引号包裹的话就是一个数值. 变量也可以用来接受语句给变量赋值 file=`ls -l filepath/txt.txt` 上面的语句是接收filepath 下的txt.txt文档 数组的定义 程序中常用的还有数组在 Shell 中,用括号

使用SecureCRTP 连接生产环境的web服务器和数据库服务器

一.使用SecureCRTP 连接生产环境的web服务器 首先,需要知道以下参数信息: 1.web服务器的ip地址     2.服务器的端口号    3.会话连接的用户名和密码   4.服务器的用户名和密码  (root/zdsoft) step1.打开SecureCRTP ,点击新建会话按钮,如下: step2.打开的对话框如下: step3. 点击下一步之后,进入主要的连接参数设置界面,参数均为已知的参数信息: step4.点击下一步进入文件传输协议的设置界面: step5.点击下一步之后,

20步打造最安全的Nginx Web服务器

转自:http://www.open-open.com/solution/view/1319455592515 Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱 (IMAP/POP3)代理服务器.它运行在UNIX,GNU /linux,BSD 各种版本,Mac OS X,Solaris和Windows.根据调查统计,6%的网站使用Nginx Web服务器.Nginx是少数能处理C10K问题的服务器之一.跟传统的服务器不同,Nginx不依赖线程来处理请求.相反,它使用了更多的可扩展

实现最安全的Nginx Web服务器

原文地址:http://www.phpthinking.com/archives/414 Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱(IMAP/POP3)代理服务器.它运行在UNIX,GNU/Linux,BSD各种版本,Mac OS X,Solaris和Windows.根据调查统计,6%的网站使用Nginx Web服务器.Nginx是少数能处理C10K问题的服务器之一.跟传统的服务器不同,Nginx不依赖线程来处理请求.相反,它使用了更多的可扩展的事件驱动(异步)架构.Ng

老李谈HTTP1.1的长连接 1

老李谈HTTP1.1的长连接 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200. HTTP是一个构建在传输层的TCP协议之上的应用层的协议,在这个层的协议,是一种网络交互需要遵守的一种协议规范. HTTP1.0的短连接 HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立

使用Arduino UART-WiFi模块做web服务器

一.硬件准备 1.选择硬件,主要有2种: 一种是官方推荐的Arduino WiFi Shield(比较贵,大概要300~400块 淘宝网 :但是资料齐全): 一种是UART-WiFi模块,不仅支持Arduino,而且支持所有串口的单片机都可以和其模块通信(大概100块左右,淘宝网,资料较少). 最后选择了UART-WIFI模块,也走了条坎坷的路,也许到了不少东东. 2.   UART-WIFI模块介绍 图片 接口   双排(2 x 4)插针式接口   支持波特率范围:1200~115200bps