关于高性能服务器底层网络通信模块的设计方法

高性能服务器底层网络通信模块的设计方法

在对I/O完成端口进行底层封装的基础上,本文提出一种具有高性能的、可扩展性的通用网络通信模块设计方案。该方案采用多种系统性能优化技术,如线程池、对象池和环形缓存区等。该模块在Win32平台上用c++开发完成,经过严格的压力和性能测试后,实验结果表明该模块能够支持海量并发连接,具有较高的数据吞吐量,在实际项目应用中也取得了良好的表现。

        1、概述

  要设计与开发出一款高性能的服务器(如网游服务器、Web服务器和代理服务器等),一般都采用高效率的网络I/O模型。Linux平台上经常会采用epoll模型,而在Win32平台上完成端口(以下简称IOCP)模型是设计与开发高性能的、具有可伸缩性的服务器的最佳选择,它可以支持海量并发客户端请求。多线程编程是服务器端开发常用技术,多线程必然涉及线程间的通信与同步。如果使用不当,也会影响到系统的性能,必须谨慎设计才能保证系统良好运行。减少数据拷贝以及小对象频繁创建与销毁是一种很重要的提高系统性能手段,可通过设计内存池或对象池加以解决。这几个问题的提出,说明实际的高性能服务器研发比较复杂,尤其是采用高效I/O模型来架构服务器时,更是增加了开发的难度,原因是这些模型的机制比较复杂。

  底层网络通信模块是服务器应用程序的核心模块,也是高性能服务器的最基础模块之一。它主要的功能是接收海量并发连接、接收网络数据包、暂存和发送应用逻辑层的逻辑数据包,所以,它也是上次应用逻辑和底层网络之间通信的媒介。

  2、 IOCP机制

  要实现一个并发的网络服务器,比较简单的模型是:每当一个请求到达就创建一个新线程,然后在新线程中为请求服务。这种模型减轻了实际开发的复杂度,在并发连接较少的情况下可以考虑使用,然而在高并发需求下并不适用。高并发环境中,创建和销毁大量线程所花费的时间和消耗的系统资源是巨大的,而且会加重线程调度的负担,同时线程上下文切换(context switch)也会浪费许多宝贵的CPU时间。

  为了提高系统性能,首先必须有足够的可运行线程来充分利用CPU资源,但线程的数量不能太多。事实上,具体工作线程的数量和并发连接数量不是直接相关联的。在Win32平台下开发高效的服务器端应用程序,最理想的模型是IOCP模型,该模型解决了一系列系统性能瓶颈问题。

  IOCP提供了最好的可伸缩性,而且其执行效率比较高,采用这种网络模型可能会加大开发的复杂度,但却是Windows平台上唯一适用于开发高负载服务器的技术。IOCPWindows系统的一种内核对象,也是Win32下最复杂的一种I/O模型,它通过一定数量的工作线程对重叠I/O请求进行处理,以便为已经完成的I/O请求提供服务,相对其他I/O模型,它可以管理任意数量套接字句柄。它主要由等待线程队列和I/O完成队列2个部分组成。一个完成端口对象可以和多个套接字句柄相关联,当针对某个套接字句柄发起的异步I/O操作完成时,系统向该完成端口的I/O完成队列加入一个I/O完成包。于此同时,工作线程调用GetQueuedcompIetionstatus(以下简称GQCS)时,如果I/O完成队列中有完成包,当前调用就会返回,取得数据进行后续的处理。

  成功创建一个完成端口后,便可开始将套接字句柄与对象关联到一起。但在关联套接字之前,首先必须创建一个或多个工作者线程为完成端口提供服务。

  3、模块设计方案

  3.1架构设计

  在充分考虑服务器性能和扩展性的基础上,本文提出了基于三层结构的系统设计方案,该模块的架构如图1所示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值