`
yinwufeng
  • 浏览: 287033 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

web服务器长连接

阅读更多
构建高性能web之路------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:   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 
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
------ ----------- ----------- --------- --------- ----------------
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 
% 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,更高的内存占用,更少的系统调用


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cutesource/archive/2010/05/08/5570369.aspx
分享到:
评论

相关推荐

    无法连接到Visual Studio 的Localhost Web服务器的解决方法

    ### 无法连接到Visual Studio 的Localhost Web服务器的解决方法 在进行Web开发时,我们经常需要使用到本地Web服务器来进行测试与调试。对于使用Visual Studio作为开发环境的用户来说,有时可能会遇到无法连接到...

    超级简单的web服务器

    【超级简单的Web服务器】 在IT领域,Web服务器是运行在计算机上的一种软件,它能够接收HTTP(超文本传输协议)请求,并返回相应的HTML页面或其他Web内容。这些服务器为我们提供了访问互联网上的网页和其他资源的...

    stm32+esp8266连web服务器

    stm32+esp8266连web服务器stm32+esp8266连web服务器stm32+esp8266连web服务器stm32+esp8266连web服务器stm32+esp8266连web服务器stm32+esp8266连web服务器stm32+esp8266连web服务器stm32+esp8266连web服务器stm32+...

    简单Web服务器设计与实现.doc

    其中,连接是指Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,文件的建立标志着连接建立成功。请求是指Web浏览器通过socket向Web服务器提交请求,HTTP的请求一般是GET或POST命令,GET命令...

    vs2015程序出现无法连接到已配置的开发 Web 服务器问题

    在使用Visual Studio 2015 (VS2015) 开发Web应用程序时,有时会遇到一个常见的问题,即“无法连接到已配置的开发Web服务器”。这个问题可能让开发者感到困扰,尤其是在尝试了多种网上的解决方案却无果的情况下。然而...

    简单搭建WEB服务器 简单搭建WEB服务器 简单搭建WEB服务器

    本文将详细介绍如何简单搭建一个WEB服务器,包括基础概念、所需工具及步骤,旨在帮助初学者快速入门。 一、Web服务器的基础概念 1. HTTP:HTTP是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本...

    基于单片机的嵌入式Web服务器设计与实现.pdf

    基于单片机的嵌入式Web服务器设计与实现 本资源摘要信息主要介绍了基于单片机的嵌入式Web服务器的设计思想和方法。该设计思想和方法可以在单片机无操作系统的环境下实现嵌入式Web服务器,满足嵌入式系统的需求。 ...

    php 长连接服务器端

    对于“基于web的长连接基数”,这可能是指一个基础框架或库,用于快速搭建PHP长连接服务器。开源项目的优势在于可以免费使用,源码公开,允许开发者根据需求进行定制和扩展。 即时通讯产品开发中,除了PHP长连接...

    WebServer vb web 服务器

    值得注意的是,尽管这样的Web服务器对于学习和理解Web服务器的工作原理很有帮助,但它可能并不适用于生产环境。商业级Web服务器如Apache、Nginx或IIS等,具有更高的性能、安全性以及更丰富的功能。 在提供的文件...

    Windows server 2022 web服务器的搭建

    1. 网络连接测试:测试服务器的网络连接是否正常。 2. 硬件设备测试:测试服务器的硬件设备是否正常工作。 3. 操作系统测试:测试操作系统是否正常工作。 三、挂载网站到服务器站点 在服务器安装和功能测试完成...

    VB6.0编写的简易WEB服务器

    VB6.0编写的简易WEB服务器是一个非常适合初学者入门网络编程的项目。VB6.0(Visual Basic 6.0)是微软推出的一种可视化编程工具,以其易学易用的特性,深受程序员喜爱。在这个项目中,我们将探讨如何利用VB6.0构建一...

    Web服务器的架设

    5. 进入管理界面,选择菜单“转发规则”下的“虚拟服务器”,在右边主窗口中,“服务端口”栏填入“80”,这是Web服务器的连接端口,“ip地址”栏填入Web服务器的ip地址(假设您的Web服务器的ip地址是192.168.1.188)...

    STM32实现Web服务器

    STM32实现Web服务器是一个将微控制器技术与网络通信相结合的课题,对于嵌入式系统开发者来说具有重要的学习价值。STM32是意法半导体公司推出的一款基于ARM Cortex-M内核的微控制器系列,广泛应用于各种嵌入式系统...

    stm32搭建web服务器

    在本文中,我们将探讨如何利用STM32F407微控制器和LWIP(Lightweight IP)库来搭建一个简单的Web服务器,并通过LAN9303以太网控制器连接网络。 首先,LWIP是一个开源、轻量级的TCP/IP协议栈,适用于资源有限的...

    易语言简易WEB服务器

    在易语言简易WEB服务器中,可能包含有解析请求头、提取请求方法、获取请求URL等函数。 4. **转换路径子程序**:在HTTP服务器中,转换路径是一个重要的功能,它将客户端请求的URL转换为服务器上实际的文件路径。例如...

    web服务器编程代码

    同时,还需要掌握网络编程的基本概念,如套接字编程和多线程,因为Web服务器通常需要并发处理多个客户端连接。 总结一下,本项目中的"web服务器编程代码"是一个基于Java的简单Web服务器实现,主要由`...

    用java实现Web服务器

    - 完成应答后,Web浏览器与Web服务器之间的连接必须断开,以便其他客户端可以建立新的连接。 - 这一步骤对于保持网络资源的有效利用至关重要。 #### 二、Java实现Web服务器功能的程序设计 根据HTTP协议的作用...

    Web服务器和应用程序服务器区别详解

    然而,Web服务器往往不具备处理复杂业务逻辑或提供数据库连接、事务处理等功能。为了实现高可用性和可扩展性,Web服务器可以采用负载均衡、缓存等策略。集群技术也常用于提高服务的稳定性和性能,但这并非Web服务器...

    web 服务器C++代码

    本文将深入探讨一个基于C++实现的Web服务器,并着重讲解其核心概念和技术细节。 首先,我们要了解C++语言在构建Web服务器中的作用。C++是一种强大的系统级编程语言,因其高效、灵活和对底层硬件的直接控制能力,常...

    WEB服务器的建立

    在本实验中,主要使用的是基于IIS(Internet Information Services)的WEB服务器建立方法。IIS是微软提供的一个集成了多种互联网服务的平台,包括Web服务器、FTP服务器、SMTP服务器等。 【实验目的】旨在让学习者...

Global site tag (gtag.js) - Google Analytics