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测试结果
短连接:
- Concurrency Level: 100
- Time taken for tests: 190.754776 seconds
- Complete requests: 1000000
- Failed requests: 0
- Write errors: 0
- Total transferred: 1891115351 bytes
- HTML transferred: 1456088816 bytes
- Requests per second: 5242.33 [#/sec] (mean)
- Time per request: 19.075 [ms] (mean)
- Time per request: 0.191 [ms] (mean, across all concurrent requests)
- Transfer rate: 9681.50 [Kbytes/sec] received
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 0 8 3.7 8 44
- Processing: 1 10 3.8 9 79
- Waiting: 0 7 3.0 7 61
- Total: 4 18 5.7 17 101
长连接:
- Concurrency Level: 100
- Time taken for tests: 59.509558 seconds
- Complete requests: 1000000
- Failed requests: 0
- Write errors: 0
- Keep-Alive requests: 990148
- Total transferred: 1927566346 bytes
- HTML transferred: 1456007280 bytes
- Requests per second: 16804.02 [#/sec] (mean)
- Time per request: 5.951 [ms] (mean)
- Time per request: 0.060 [ms] (mean, across all concurrent requests)
- Transfer rate: 31631.71 [Kbytes/sec] received
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 0 0 0.1 0 12
- Processing: 0 5 22.5 1 1406
- Waiting: 0 5 22.4 1 1405
- 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模式是每个请求由单独的子进程来响应,因此通过对其中的一个子进程跟踪来比较调用系统资源的次数
短连接:
- % time seconds usecs/call calls errors syscall
- ------ ----------- ----------- --------- --------- ----------------
- 44.24 0.187941 19 9997 accept
- 40.22 0.170887 10 17738 poll
- 2.58 0.010976 0 67716 17737 read
- 2.49 0.010583 0 59964 9994 lstat
- 2.19 0.009319 0 49970 9994 stat
- 1.74 0.007388 0 39976 setsockopt
- 1.42 0.006045 1 9997 shutdown
- 1.25 0.005312 0 29988 close
- 1.06 0.004499 0 19989 open
- 0.71 0.003003 0 19994 fcntl
- 0.57 0.002426 0 9994 write
- 0.45 0.001911 0 9994 writev
- 0.38 0.001598 0 9994 sendfile
- 0.35 0.001503 0 9997 getsockname
- 0.34 0.001439 0 9997 gettimeofday
- 0.00 0.000002 1 2 fstat
- 0.00 0.000001 1 1 lseek
- 0.00 0.000001 1 1 mmap
- 0.00 0.000001 1 1 munmap
- ------ ----------- ----------- --------- --------- ----------------
- 100.00 0.424835 375310 37725 total
长连接:
- % time seconds usecs/call calls errors syscall
- ------ ----------- ----------- --------- --------- ----------------
- 37.05 0.032997 3 9919 write
- 21.90 0.019503 2 9940 poll
- 10.38 0.009248 0 39676 setsockopt
- 7.86 0.007000 0 49595 9919 stat
- 7.46 0.006642 0 59514 9919 lstat
- 5.35 0.004764 0 49720 9941 read
- 3.54 0.003156 0 19839 open
- 2.27 0.002018 0 9919 sendfile
- 1.95 0.001735 0 19941 close
- 1.28 0.001143 0 9919 writev
- 0.92 0.000816 0 9921 gettimeofday
- 0.02 0.000014 0 200 fcntl
- 0.01 0.000007 0 100 accept
- 0.01 0.000007 0 100 getsockname
- 0.01 0.000006 0 100 1 shutdown
- 0.00 0.000002 1 2 fstat
- 0.00 0.000001 1 1 lseek
- 0.00 0.000001 1 1 mmap
- 0.00 0.000001 1 1 munmap
- ------ ----------- ----------- --------- --------- ----------------
- 100.00 0.089061 288408 29780 total
以上数据表明,长连接accept和shutdown次数仅为100次,而短连接为9997次,近100倍的差距,从这里就不难发现为什么长连接的TPS那么高了,省了这么多次系统调用,不快才怪啊。
本次试验得出验证来开始的理论分析:长连接比短连接能带来更高的TPS,更低的CPU消耗,更少的IO,更高的内存占用,更少的系统调用
web服务器长连接的更多相关文章
- 1. Visio Web 形状 - 无法与 Web 服务器建立连接。请稍后重新进行搜索。处理方式
今天在Visio中使用“搜索形状”,发现不管搜什么,结果都是:Visio Web 形状 - 无法与 Web 服务器建立连接.请稍后重新进行搜索 具体解决方案如下:控制面板=>添加或删除程序=&g ...
- 如何实现android和服务器长连接
转载 这种功能实际上就是数据同步,同时要考虑手机本身.电量.网络流量等等限制因素,所以通常在移动端上有一下两个解决方案: 1.一种是定时去server查询数据,通常是使用HTTP协议来访问web服务器 ...
- Android 心跳包心跳连接 如何实现android和服务器长连接呢?推送消息的原理
前言:现在的大多数移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接受消息的被动权.例如:微信,QQ,天气预报等等,相信好处和用户体验相信大家都知道吧. 提出问题:这种功能必须涉及cl ...
- shell基础知识---与监听服务器长连接端口状态
从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808st ...
- Web服务器-并发服务器-长连接(3.4.4)
@ 目录 1.说明 2.代码 关于作者 1.说明 每次new_socket都被强制关闭,造成短连接 所提不要关闭套接字 但是不关闭的话,浏览器不知道发完没有啊 此时用到header的属性Content ...
- web通信 长连接、长轮询
http://www.cnblogs.com/hoojo/p/longPolling_comet_jquery_iframe_ajax.html
- 使用SecureCRTP 连接生产环境的web服务器和数据库服务器
一.使用SecureCRTP 连接生产环境的web服务器 首先,需要知道以下参数信息: 1.web服务器的ip地址 2.服务器的端口号 3.会话连接的用户名和密码 4.服务器的用户名 ...
- 前端学HTTP之WEB服务器
前面的话 Web服务器每天会分发出数以亿计的Web页面,它是万维网的骨干.本文主要介绍WEB服务器的相关内容 总括 Web服务器会对HTTP请求进行处理并提供响应.术语“Web服务器”可以用来表示We ...
- 20步打造最安全的NGINX WEB服务器
Nginx 是一个轻量级的,高性能的Web服务器以及反向代理和邮箱(IMAP/POP3)代理服务器.它运行在UNIX,GNU /linux,BSD 各种版本,Mac OS X,Solaris和Wind ...
随机推荐
- ubuntu14.04 安装 bcm43142无线网卡
thinkpad e430c 在安装ubuntu14.04时无法识别无线网卡 用命令lspci 查看无线网卡类型 然后下载对应的无线网卡驱动. 之后,使用下列命令安装,即可搜索无线热点了: sudo ...
- ps esc 问题
最近经常发现esc键突然变得不能用了.主要是使用搜狗输入法时使用esc键取输错的字,因此还以为是搜狗的问题,后来突然想到可能是因为打开某个软件导致esc不能用,最后发现居然是ps,在网上查了后发现很多 ...
- C++ Primer : : 第十四章 : 重载运算符与类型转换之类型转换运算符和重载匹配
类型转换运算符 class SmallInt { public: SmallInt(int i = 0) : val(i) { if (i < 0 || i > 255) throw st ...
- C#中的async和await
其实这两个关键字的功效比之前的异步方法调用有一个好处,那就是异步阻塞的方法可以有返回值.之前都是通过回调函数实现,执行上下文会切换,不过和这个执行过程类似.可以对这两个关键字这么理解:遇到async的 ...
- Mysql-简单安装
centos上安装msqyl 通过如下命令来查看我们的操作系统上是否已经安装了mysql数据库 [root@CentOS6.5 ~]# rpm -qa | grep mysql #这个命令就会查看该操 ...
- Morphia 学习一 注解
http://blog.csdn.net/liumm0000/article/details/7535858 生命周期方法注解(delete没有生命周期事件)@PrePersist save之前被调用 ...
- Linux命令全集
一.Ubuntu10.4 启动纯文件界面 打开 /etc/default/grub 文件, 注释掉 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash&quo ...
- struts2 Demo
参考资料 :http://www.cnblogs.com/yangy608/archive/2010/11/08/1871962.htmlhttp://www.yiibai.com/struts2/s ...
- 如何把项目部署到OSChina上
1. 在苹果电脑终端 ls -la 查看当前目录所有的隐藏文件 2. 删除 .ssh文件 rm -rf .ssh 3.创建一个隐藏的文件 mkdir .ssh 在查看 4.进入 .ssh ...
- Semaphore tryAcquire release 正确的使用方法
boolean permit = false; try { permit = semaphore.tryAcquire(1, TimeUnit.SECONDS); if (permit) { Syst ...