五种I/O模型的性能分析

2023-05-16



重叠I/O模型的另外几个优点在于,微软针对重叠I/O模型提供了一些特有的扩展函数。当使用重叠I/O模型时,可以选择使用不同的完成通知方式。

采用事件对象通知的重叠I/O模型是不可伸缩的,因为针对发出WSAWaitForMultipleEvents调用的每个线程,该I/O模型一次最多都只能支持6 4个套接字。假如想让这个模型同时管理不止64个套接字,必须创建额外的工作者线程,以便等待更多的事件对象。因为操作系统同时能够处理的事件对象是有限的,所以基于事件对象的I/O模型不具备伸缩性。

使用完成例程通知的重叠I/O模型,因为以下几个原因,也不是开发高性能服务器的最佳选择。首先,许多扩展功能不允许使用APC(Asyncroneus Procedure Call,异步过程调用)完成通知。其次,由于APC在系统内部特有的处理机制,应用程序线程可能无限等待而得不到完成通知。当一个线程处于“可警告状态”时,所有挂起的APC按照先进先出的顺序(FIFO)接受处理。现在考虑这样一种情况,服务器已经建立起了一个连接,并且调用含有完成例程指针的WSARecv投递了一个重叠I/O请求。当有数据到达时(即I/O完成时),完成例程执行并且再次调用WSARecv抛出另外一个重叠I/O请求。一个APC抛出的I/O操作需要一定的时间才能完成,所以这期间可能另外一个完成例程等待执行(比如本次WSARecv还没接收完时,又有一个新的客户接入并发来数据),因为还有更多的数据需要读取(上一个客户发来的数据尚未读完)。只要(投递WSARecv的)那个套接字上还有“未决”(未接收完)的数据,就会导致调用线程长久阻塞。

基于完成端口通知的重叠I/O模型是Windows NT系统提供的一个真正支持高伸缩性的I/O模型。在上一章中,探讨了Winsock几种常见的I/O模型,并且说明了当应对大规模客户连接时,完成端口是最佳的选择,因为它提供了最好的伸缩性。

对不同Winsock I/O模型的性能测试结果如图1所示。其中服务器采用Pentium 4 1.7 GHz Xeon的CPU,768M内存;客户端有3台PC,配置分别是Pentium 2 233MHz ,128 MB 内存,Pentium 2 350 MHz ,128 MB内存,Itanium 733 MHz ,1 GB内存。服务器、客户端安装的操作系统都是Windows XP。


图1 不同I/O模型的性能比较

1.分析图表1提供的测试结果可知,在所用的I/O模型中,阻塞模式性能最差。这个测试程序中,服务器为每个客户创建两个线程:一个负责处理数据的接收,一个负责处理数据的发送。在多次测试中的共同问题就是,阻塞模式难以应对大规模的客户连接,因为它在创建线程上耗费了太多的系统资源。因此,服务器创建太多的线程后,再调用CreateThread函数时,将返回ERROR_NOT_ENOUGH_MEMORY的错误,这个错误码提示内存不够。那些发出连接请求的客户则收到WSAECONNREFUSED的错误提示,表示连接的尝试被拒绝。

让我们来看看监听函数listen,其原型如下:

WINSOCK_API_LINKAGE int WSAAPI listen(SOCKET s, int backlog );

参数一s已绑定了地址的监听套接字。

参数二backlog指定了正在等待连接的最大队列长度。

参数backdog非常重要, 因为完全可能同时出现几个对服务器的连接请求。例如,假定backlog参数为2时有三个客户机同时发出连接请求,那么前两个会被放在一个“等待处理”队列中,以便应用程序依次为它们提供服务。而第三个连接的请求就会造成一个WSAECONNREFUSED错误。一旦服务器接受了一个连接请求,那个连接请求就会从队列中删去,以便可以继续接收其他客户发出的连接请求。即当一个连接请求到来时队列已满,那么客户将收到一个WSAECONNREFUSED错误。而backlog参数本身的大小就存在着限制,这个限制是由协议提供者决定的。

故阻塞模式下,由于系统资源的限制,其并发处理量是极难突破的。

2.非阻塞模式表现出的性能要比阻塞模式稍好,但是占用了太多的CPU处理时间。测试服务器将所有客户对应的socket分类放到FD_SET集合中,然后调用select函数筛选出对应集合中有事件发生的socket,并对集合更新。接下来调用FD_ISSET宏重新判断一个套接字是否在原来加入的FD_SET集合中。随着客户连接数量的增多,这种模型的局限性逐渐凸现。仅仅为了判断一个套接字是否有网络事件发生,就需要对集合FD_SET执行一次遍历!使用迭代搜索来对select更新的FD_SET进行扫描,性能可以得到一些提升。瓶颈在于,服务器必须能够很快地扫描出FD_SET集合中的有网络事件发生的套接字的相关信息。针对这个问题,可以使用更复杂的扫描算法,如哈希搜索,它的效率是极高的。还需要注意的一个问题就是,非分页池(即直接在物理内存中分配的内存)的使用极高。这是因为AFD(Ancillary Function Driver,由afd.sys提供的支持Windows Sockets应用程序的底层驱动程序,其中运行在内核模式下afd.sys驱动程序主要管理Winsock TCP/IP通信)和TCP都将使用I/O缓存,因为服务器读取数据的速度是有限的,相对于CPU的处理速度而言,I/O基本是零字节的吞吐量。

3.基于Windows消息机制的WSAAsyncSelect模型能够处理一定的客户连接量,但是扩展性也不是很好。因为消息泵很快就会阻塞,降低了消息处理的速度。在几次测试中,服务器只能处理大约1/3的客户端连接。过多的客户端连接请求都将返回错误提示码WSAECONNREFUSED,说明服务器不能及时处理FD_ACCEPT消息导致连接失败,这样监听队列中待处理的连接请求不致于爆满。然而,通过上表中的数据可以发现,对那些已经建立的连接,其平均吞吐量也是极低的(即使对于那些对比特率进行了限制的客户也如此)。

4.基于事件通知的WSAEventSelect模型表现得出奇的不错。在所有的测试中,大多数时候,服务器基本能够处理所有的客户连接,并且保持着较高的数据吞吐量。这种模型的缺点是,每当有一个新连接时,需要动态管理线程池,因为每个线程只能够等待64个事件对象。当客户连接量超过64个后再有新客户接入时,需要创建新的线程。在最后一次测试中,建立起了超过45,000个的客户连接后,系统响应速度变得非常缓慢。这时由于为处理大规模的客户连接创建了大量的线程,占用了过多的系统资源。791个线程基本达到了极限,服务器不能再接受更多的连接了,原因是WSAENOBUFS:无可用的缓冲区空间,套接字无法创建。另外,客户端程序也达到了极限,不能维持已经建立的连接。

使用事件通知的重叠I/O模型和WSAEventSelect模型在伸缩性上差不多。这两种模型都依赖于等待事件通知的线程池,处理客户通信时,大量线程上下文的切换是它们共同的制约因素。重叠I/O模型和WSAEventSelect模型的测试结果很相似,都表现得不错,直到线程数量超过极限。

5.最后是针对基于完成端口通知的重叠I/O模型的性能测试,由上表中数据可以看出,它是所有I/O模型中性能最佳的。内存使用率(包括用户分页池和非分页池)和支持的客户连接量与基于事件通知的重叠I/O模型和WSAEventSelect模型基本相同。真正不同的地方,在于对CPU的占用。完成端口模型只占用了60%的CPU,但是在维持同样规模的连接量时,另外两种模型(基于事件通知的重叠I/O模型和WSAEventSelect模型)占用更多的CPU。完成端口的另外一个明显的优势是,它维持更大的吞吐量。

对以上各种模型进行分析后,可以会发现客户端与服务器数据通信机制本身存在的缺陷是一个瓶颈。在以上测试中,服务器被设计成只做简单的回应,即只是将客户端发送过来的数据发送回去。客户端(即使有比特率限制)不停的发送数据给服务器,这导致大量数据阻塞在服务器上与这个客户端对应的套接字上(无论是TCP缓冲区还是AFD的单套接字缓冲区,它们都是在非分页池上)。在最后三种性能比较好的模型中,同一时间只能执行一个接受输入操作,这意味着在大多数时间,还是有很多数据处于“未决”状态。可以修改服务器程序使其以异步方式接受数据,这样一旦有数据达到,需要将数据缓存起来。这种方案的缺点是,当一个客户连续发送数据时,异步接受到了大量的数据。这会导致其他的客户无法接入,因为调用线程和工作者线程都不能处理其他的事件或完成通知。通常情况下,调用非阻塞异步接收函数,先返回WSAEWOULDBLOCK,然后数据间断性的传输,而不采取连续接收的方式。

从以上测试结果,可以看出WSAEventSelect模型和重叠I/O模型是性能表现最佳的。两种基于事件通知的模型中,创建线程池来等待事件完成通知并作后续处理是很繁琐的,但是并不影响以它们来架构中型服务器的良好性能。当线程的数量随着客户端连接数量而逐增时,CPU将花费大量时间在线程的上下文切换上,这将影响服务器的伸缩性,因为连接量达到一定数量后,便饱和了。完成端口模型提供了最佳的可扩展性,因为CPU使用率低,其支持的客户连接量相对其他模型最多。

I/O模型的选择

通过上一节对各种模型的测试分析,对于如何挑选最适合自己应用程序的I/O模型已经很明晰了。同开发一个简单的运行多线程的锁定模式应用相比,其他每种I/O模型都需要更为复杂的编程工作。因此,针对客户机和服务器应用开发模型的选择,有以下原则。

1. 客户端

若打算开发一个客户机应用,令其同时管理一个或多个套接字,那么建议采用重叠I/O或WSAEventSelect模型,以便在一定程度上提升性能。然而,假如开发的是一个以Windows为基础的应用程序,要进行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一种最好的选择,因为WSAAsyncSelect本身便是从Windows消息模型借鉴来的。采用这种模型,程序需具备消息处理功能。

2. 服务器端

若开发的是一个服务器应用,要在一个给定的时间,同时控制多个套接字,建议采用重叠I/O模型,这同样是从性能角度考虑的。但是,如果服务器在任何给定的时间,都会为大量I/O请求提供服务,便应考虑使用I/O完成端口模型,从而获得更佳的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

五种I/O模型的性能分析 的相关文章

  • P2651 增加括号III(简单数学)

    include lt iostream gt include lt cstdio gt include lt string gt include lt algorithm gt include lt vector gt include lt
  • P1233 木棍加工(最长上升子序列)

    P1233 木棍加工 https www luogu com cn problem P1233 include lt iostream gt include lt cstdio gt include lt string gt include
  • Ubuntu 22.04重启后网络连接失败

    Ubuntu 22 04重启后 xff0c 远程登录时 xff0c 发现连接失败 xff0c 就使用ifconfig查看ip xff0c 结果发现没有网卡 xff0c 只有个lo 以为是网络设置没打开 xff0c 进入setting gt
  • BT4设置

    首先一定要让 BT4 联网 我们先来配置下网络 1 虚拟机的网卡编辑里面选择的是 NAT 2 自己的 windows 系统 本地连接 属性 高级 internet 连接共享 里面选择共享网络 然后进虚拟机 打开 BT4 的终端 输入 wic
  • 计算机网络协议(五)——DNS、HTTPDNS

    底层网络知识详解 xff1a DNS HTTPDNS 概述一 DNS协议 xff1a 网络世界的地址簿1 1 DNS解析流程1 2 负载均衡 二 HTTPDNS 概述 这个专栏的计算机网络协议 xff0c 我是在极客时间上学习 已经有三万多
  • EIGRP理论详解及基础实验

    EIGRP Enhanced Interior Gateway Routing Protocol 增强型内部网关路由协议 EIGRP 是一种Cisco专用协议 同时具备链路状态和距离矢量路由协议的优点 只发送变化后的信息 这类似于链路状态协
  • OpenCV参考手册之Mat类详解(二)

    译文参考The OpenCV Reference Manual xff08 Release 2 3 xff09 August 17 2011 Mat Mat Mat的析构函数 C 43 43 Mat Mat 析构函数调用Mat releas
  • AC9560网卡linux驱动安装

    参考 xff1a https blog csdn net yrc19950911 article details 79156065 起因 xff1a NUC 8 小主机Ubuntu16 04更换低延迟内核后 xff0c 无法识别无线网卡 x
  • iperf3测试万兆网路性能

    起因 xff1a 采用万兆直连线连接两台服务器的光口 xff0c 用于OAI 5G rfsim模式运行 xff0c 希望测试一下连接速率 解决步骤 xff1a 测试万兆网络需要iperf3 xff0c 下面采用手动编译安装方式安装 下载编译
  • vmware ubuntu 虚拟机分辨率问题

    起因 xff1a vmware15安装的ubuntu 18 04虚拟机 xff0c 发现更换完5 0 0 23版本内核后 xff0c 虚拟机分辨率被限制在1176 885 且虚拟机内始终无法调大 xff0c 原本以为是内核或者ubuntu的
  • 随机数发生器 rand()函数使用方法

    给出完整程序代码以供参考 xff1a include lt bits stdc 43 43 h gt using namespace std typedef long long LL define INF 0x3f3f3f3f define
  • word中插入一页横向页面

    参考 xff1a https zhidao baidu com question 7650080 html 有时需要在竖版的页面中插入一个横向页面的大表格 大图片等 xff0c 不能直接修改纸张方向 xff0c 因为在Word中 xff0c
  • 手动控制DELL服务器风扇转速

    参考 xff1a https www cnblogs com dreamdale p 13187452 html https www cnblogs com lothar p 13321205 html https www cnblogs
  • 通过windows日志查看器查看系统登陆日志

    起因 xff1a 回到工位发现自己电脑没锁屏 xff0c 突然想找到查看windows登录记录的方法 参考 xff1a http www cflab net News 1522379153901 https blog csdn net C
  • hackrf+portapack 组装上手体验记录

    1 物理安装 拧下SMA天线接头 用portapack提供的黄色翘片撬开hackrf盖子 插接两块板子 装好螺丝和sma天线接头的垫片和螺母即可 2 更新固件 装好后需要更新固件 xff0c 否则portapack插好电后只闪一下 xff0
  • ios平台Ahorro记账APP换新机无法下载问题

    起因 xff1a 更换iphone新机后 xff0c 原有记账APP Ahorro在app store中已不再提供 xff0c 无法下载 解决方法 xff1a 前提 xff1a 原有手机仍在手上 xff0c 且原有手机中的Ahorro AP
  • Microsoft Print to PDF的纸张大小问题

    问题 尚未解决 在word打印选项页面设置纸张大小为信纸 xff0c 在 打印机属性 gt 高级 中也设置纸张规格为信纸 但是导出的PDF文档大小依然是A4 猜想原因 在打印机的可用纸张选项中只有A4 xff0c 且未找到添加纸张类型的方法
  • KDE下安装Fcitx

    sudo apt get install fcitx pinyin im switch im switch s fcitx z all ALL 修改 etc X11 xinit xinput d fcitx xff0c 为 xff1a XI
  • win10 vs2015 tesseract5.0

    https www cnblogs com hupeng1234 p 8545371 html

随机推荐

  • python 买卖提的菜单_03

    temp 61 input 34 你要买几根 xff1f n 34 mount 61 int temp print type temp Totalprice 61 20 mount print 39 您一共需要支付 xff1a 39 43
  • python 02

    import turtle as t 39 39 39 t speed 0 t screensize 600 500 屏幕大小 t pensize 5 t pencolor 34 black 34 t fillcolor 34 black
  • 取字符串某个特定字符后的字符串 strchr函数

    strchr函数返回指定字符串中从左到右第一个指定字符的指针 xff0c 未找到则返回NULL 函数原型 xff1a extern char strchr char str char character 例如 xff1a 字符串s为 11
  • 折腾了好久这个opencv的Windows库

    折腾了好久这个opencv的Windows库 xff0c 实在是想吐血了 终于找到一个可以用的已经编译好的 xff0c 下载地址如下 xff1a https github com huihut OpenCV MinGW Build 来自 x
  • ch10_列表 字典 例子

    num 61 num len 61 0 for i in range 100 if i gt 1 temp 61 0 for j in range 2 int i 2 if i j 61 61 0 temp 43 61 1 if temp
  • C# AForge设置摄像头参数(含代码)

    网上有很多c 设置摄像头参数的例子 xff0c 代码给的不多 增加新类的源码 xff1a AForge设置摄像头参数实例源码 源码地址 xff1a https download csdn net download gigizhongyan
  • QT 开发多窗口多页面问题(一)中文乱码的问题

    开发环境 xff1a Microsoft Visual C 43 43 2019 43 QT 5 13 1 QT5 中文乱码 xff0c 网上有很多例子 效果有但是没有那么彻底 因为我需要使用tr 后续中文需要翻译 最后在 h文件中加入了
  • QT 开发多窗口多页面问题(二)QT 插件模式

    编译环境 xff1a VS2019 43 QT5 13 1 业务要求 xff1a 界面是多窗口拖动的模式 xff0c 窗口采用插件的模式 xff08 DLL xff09 封装 参考的文档 xff1a 结合两个文档 结合了vs的QDesign
  • QT项目适配libmodbus3.1.6库源码

    想要自己开发的可以参考 xff1a https blog csdn net qq 37887537 article details 88548358 https blog csdn net zgrjkflmkyc article detai
  • 时隔一年,C++加python 的混合编程(包括python无环境发布)

    时隔一年 xff0c 上一篇文档比较LOW一点 xff0c 实现了python2 7的混合编译 xff0c 可发布无PYTHON环境的机器 发布也是比较LOW xff0c 文件特别大 编译版本 xff1a python 3 7 2 xff0
  • 逆向APP查看内部源码

    我的原创 xff1a https www jianshu com p 991265039648 文章中使用的工具 xff1a https download csdn net download gigizhongyan 12568942
  • 用C#实现MVC+观察者模式(WINFORM)

    用C 实现MVC xff08 Model View Control xff09 模式介绍 益处 下载案例 xff1a https download csdn net download gigizhongyan 13011332 在我们的开发
  • sscanf函数基本用法

    用法1 xff1a 从字符串中取数字 代码如下 xff1a include lt bits stdc 43 43 h gt using namespace std int main char s 61 34 11 LL 34 int v s
  • 2020-10-22

    用C 实现MVC xff08 Model View Control xff09 模式介绍 益处 在我们的开发项目中使用MVC xff08 Model View Control xff09 模式的益处是 xff0c 可以完全降低业务层和应用表
  • sqlite 删除数据的时候如果设立外键如何解决

    PRAGMA foreign keys 61 no 关闭了外键限制 清空各表 DELETE from D ConfigFormula DELETE from D ConfigSensor DELETE from D ConfigCommun
  • Microsoft.NETCore.App/2.1.0的下载超时问题

    最近公司一个项目需要采用 Microsoft NETCore App技术 之前没有基于这个框架开发过代码 xff0c 安装了2019后 xff0c 一直提示 未能从 https www nuget org api v2 package Mi
  • SRS 分发HLS 跨域问题

    一 SRS 分发 1 通过修改配置 usr local srs conf xff1a 的srs conf 增加如下配置 xff0c 开通srs的hls功能 http stream 注释 xff1a srs 版本不一样 配置信息头可能不一样
  • C# 调用ffmepg 读取海康或大华视频的功能

    一 C 调用ffmepg 调用C FFmpeg AutoGen 下载方法 注意这个版本需要和下载的ffmpeg的版本一致 也就是FFmpeg AutoGen4 3 1那么下载的ffmpeg的动态链接库也要是4 3 1 ffmpeg下载 ht
  • Windows Socket五种I/O模型——代码全攻略

    Windows Socket五种I O模型 代码全攻略 2007 06 14 09 45 43 分类 xff1a WINDOWS 如果你想在Windows平台上构建服务器应用 xff0c 那么I O模型是你必须考虑的 Windows操作系统
  • 五种I/O模型的性能分析

    重叠I O模型的另外几个优点在于 xff0c 微软针对重叠I O模型提供了一些特有的扩展函数 当使用重叠I O模型时 xff0c 可以选择使用不同的完成通知方式 采用事件对象通知的重叠I O模型是不可伸缩的 xff0c 因为针对发出WSAW