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

高并发高性能下提高SERVER性能的一种网络处理模式

 
阅读更多

给大家分享下我目前在项目中(需要开发一个monitor进程,用于监控大量逻辑SERVER,每个dms服务需要与后端做交互,性能较低)实现的异步网络IO架构,希望对大家解决相同场景的问题时能有所帮助。

适用场景

这个架构用来解决“高性能场景下,当我的SERVER还需要访问拉取其他SERVER的数据时,我的SERVER性能已经达到最大了,可是这台machine所有硬件(比如所有CPU都没有达到100%machine负载还是个位数)都没有达到瓶颈”这种场景。

还有一点需要补充,如果第三方服务或者后端SERVER仅提供同步接口给我们,没有提供任何异步接口,并且不支持我们在协议级别上实现异步访问,这个方案就无能为力了。

问题描述

一般来说,对其他SERVER发出大量并发请求的耗时会存在两个问题:

1、 响应时间不稳定;

2、 平均响应时间可能过长。

举个例子,当逻辑SERVER需要从其他第三方服务里拉取数据,受网络和第三方服务的稳定性影响,性能会有波动,假定平均请求时间为1S,可能99%的请求都可以正常应答,但是可能会有1%的请求延时会达到5S

某后端SERVER对大量请求的响应时间通常会有这种长尾效果,虽然这种长时间响应的请求数量很少,但是如果设计不当,会对SERVER的整体性能产生较大影响,正常响应用户的请求也会被延迟。

一般我们可能是通过设置网络套接字的超时时间来降低这种影响,但是超时时间过短又可能造成失败率上升。

所以,我们必须防止这1%的请求对其他正常请求的响应造成影响,又不能增加失败率。

2个问题跟后端SERVER的性能有关,比如说,dms拉取某file cache server,当cache server达到1万次每秒访问量时,平均单次响应需要100ms,那么如果我们设计不良好的系统会出现什么问题呢?首先把非网络因素都剔除,我们假定只有网络IO占了主要请求响应时间的消耗(一般情况下都是如此)。

假定下面这种较常见的网络设计模式:我们对每个网络套接字设定超时时间为1S,当从接入系统中(通常是一个队列)获取到一个完整的请求后,交给一组线程池去实现业务。每个线程分解业务后,向后端SERVER发请求等待响应,收到响应后分析结果,最后应答给client

首先只看第2个问题。如果平均一个请求100ms,那么每个线程可以处理10次每秒,如果我们开100个线程,可以处理1000个请求每秒。理论上似乎无限。但实际上,当一台PC机器上运行的线程数达到200时,进程间切换已经占到很大的比重,如果有共享资源用到锁,那么这种加解锁的系统调用也会占用系统资源。根据我的经验,通常情况下如果一台PC机线程达到200个左右后,继续增加线程数毫无意义,只能降低性能。

如果再把第1个问题算进去,那么那些少量的长时间响应请求,就会占用线程池的大量业务处理线程,造成SERVER的并发处理能力下降。

解决方案

我在设计dms_monitor时,假定我一台dms_monitor监控多台dms,比如很极端的配置下,每秒需要轮询一台dms,一共需要管理5000dms(仅举例),那么就需要每秒发送5000个请求,从不间断(因为需要灵敏的检测到不工作的DMS),并且每个请求都要等待响应。这些请求的响应时间肯定很不均匀,就遇到了上面所说的问题。

我的解决方案是这样的:

略去其他设计,仅谈这一块网络IO模式。我的原则就是软件上无等待,使进程最大化的运行,直到达到硬件资源的瓶颈(通常最直接的表现是处理网卡中断的CPU达到100%)。所以思路就是,仅保留核心的线程,除了没办法优化的资源锁外,去除所有的阻塞操作。

主要设计如下:1+N线程数,用于保存中间过程的共享容器(比如排序二叉树,存储所有请求未处理完的中间数据),下面简要解释下:

11个发送线程,负责创建(或者从连接池中获取)非阻塞网络套接字,向后端SERVER发送请求,将发送信息存入共享容器,将套接字放进多路复用实现对象中(例如epoll,select,poll等)。

2N个处理线程。N>=1,有些情形下实际1个线程应该是效率最高。并且这N个线程可以是几组线程池,例如N=30时,其中10个线程用于处理大数据量(中断较多)请求,20个线程用于处理小数据量请求。这N个处理线程被多路复用实现对象激活,比如:DMS收到DB回的响应包。激活后从网络IO取出数据,接下来从共享容器中取出正确的中间数据,判断业务完整性,不完整,则继续放入多路复用实现对象中,处理下一次激活。

3、保存中间过程的共享容器,应当是适合addget操作非常多的容易,一般用关系容器实现,不太可能用顺序容器实现。所有的中间过程都必须保存下来,举个例子,client端发来的必要信息必须保存,如果需要多次接收后端SERVER发来的回包(比如回包超大在2K以上大小),或者该业务需要多次向后端SERVER发送请求获取回包。

这种设计肯定增大了CODE复杂度,因为原本一次完成的业务请求,被分成数次甚至被几个线程分别处理了。对于小数据量的应用,该网络设计模式没意义,高并发高性能下则可以几倍的提高同等machine的性能。

实现难点

我用C++实现了这种结构的简单封装,复用时在解决下面几个问题后就可以正常使用了:

1、 业务分解。根据业务特性来实现,如果只需要对后端SERVER做一次交互,就会很简单。需要多次交互,比如DMS先访问PM去加锁,然后再访问PM获取数据,这就是两次交互,需要设计好中间过程的数据。

2、 后端SERVER必须支持异步接口,协议级别同样可以。

3、 实现可以分析后端SERVER回包的回调方法。比如,判断PM回包是否完整,当一个回包1M以上时,可能需要十几次的网络调用才能完整接收。

4、 如果占用内存大,并且每个请求占用的内存大小分布极不均匀,建议用内存池来存储一个请求处理时的中间数据。

该设计在client访问达到server所能容纳的峰值时,所有线程都不会有阻塞,基本瓶颈在网卡,建议使用千兆网卡多个,同时每颗CPU单独绑定网卡,避免业务操作抢占网卡CPU

分享到:
评论

相关推荐

    高性能,高并发TCP server

    在IT行业中,构建一个高性能、高并发的TCP服务器是许多应用程序的基础,特别是在网络服务、游戏服务器、实时数据传输等领域。Boost.Asio库是C++中实现这类服务的有力工具,它提供了一种高效且灵活的方式来处理I/O...

    c# tcp 基于完成端口开发 高性能 高并发 吞吐量大 包含服务端 客户端完整代码 支持最大连接数支持65535个长连接

    本资源提供的是一套基于C#语言实现的TCP服务器和客户端代码,利用了完成端口(IO Completion Ports, I/OCP)技术来优化高并发和高性能的网络通信。 完成端口是Windows系统中的一种高级I/O模型,它通过将I/O操作的...

    C#实现Socket高性能、大容量并发(附完整实例源码)

    - **IO Completion Ports (IOCP)**:IOCP是一种高效的并发处理机制,可以处理大量并发连接,适合服务端高并发场景。 - **事件驱动/回调函数**:使用事件驱动编程模型,如.NET的Async/Await关键字,简化异步编程,...

    C#版支持高并发的HTTP服务器源码

    在高并发场景下,传统的同步I/O模型可能会导致线程池耗尽,影响系统性能。而异步处理则允许服务器在等待I/O操作完成时执行其他任务,显著提高了资源利用率和吞吐量。 异步编程在C#中主要通过`async`和`await`关键字...

    webserver(1)_linux高并发服务器_源码

    这里的“webserver(1)_linux高并发服务器_源码”是一个针对该主题的实践项目,它采用Preactor模式并利用了Linux的epoll LT模型来处理大量并发连接。以下是对这些关键知识点的详细说明: **Linux高并发服务器:** 在...

    UDP 高并发的实现

    高并发是指服务器可以同时处理多个客户端的请求,而不影响服务器的性能。 多路复用的优势 多路复用是指在服务器端使用单个进程或线程来同时处理多个客户端的请求,以提高服务器的性能。常见的多路复用机制有select...

    一个使用Go语言实现的IMServer,具备高性能高并发特性。.zip

    《Go语言实现的高性能IMServer解析》 在现代互联网应用中,即时通讯(Instant Messaging,简称IM)系统扮演着至关重要的角色,它为用户提供了实时、便捷的信息交流平台。本项目是一个采用Go语言构建的IMServer,...

    高并发回应服务器

    Asio提供了一种统一的API,用于处理I/O事件,包括网络通信。它的设计基于非阻塞I/O模型,可以实现异步操作,使得服务器能够同时处理多个客户端的请求,从而达到高并发的目的。在Asio中,主要涉及的概念有服务...

    高并发高流量网站构架

    综上所述,构建高并发高流量网站架构涉及多层面的技术整合与优化,包括负载均衡、网络优化、缓存策略、数据库管理、应用设计以及容错机制等。这种架构的设计必须灵活且可扩展,以适应不断变化的用户需求和流量波动。...

    sqlserver并发连接测试

    8. **故障恢复和灾难恢复**:在并发测试中,也需要考虑系统的容错能力和在高并发下的恢复能力。SQL Server提供了日志运输、数据库镜像和Always On可用性组等技术来保证高可用性和快速恢复。 综上所述,SQL Server...

    SpServer-0.9.4 一个高性能服务器代码

    高性能服务器是指能够处理大量并发连接请求,快速响应,并且在高负载下仍能保持稳定运行的服务器。SpServer 正是这样一款服务器代码,它的设计目标就是提供极低的延迟和高吞吐量,以满足现代互联网应用对速度和效率...

    SqlServer并发调优

    标题和描述均聚焦于"SqlServer并发调优"这一主题,涉及了并发环境下SQL Server数据库性能优化的关键技术点,包括锁管理、事务隔离等级、锁升级、动态锁等。以下是对这些核心知识点的深入解析。 ### 锁和锁管理 ###...

    尊天缓存,高并发高性能,让服务器飞起来

    尊天缓存是高并发高性能的缓存系统 内存数据库 专门应对高并发高吞吐的服务器环境 尊天缓存主要使用在的高并发的服务器节点上 比如嵌入web服务器中 缓存常用数据 能够极大缓解数据库服务器的压力 显著提升web服务器...

    Java系统的高并发解决方法详解

    Java系统的高并发解决方法详解 ...Java系统的高并发解决方法可以通过静态化、图片服务器分离、数据库集群和库表散列、缓存等多种方法来实现,选择哪种方法需要根据实际情况进行选择和组合,以提高系统的性能和扩展性。

    linuxc高并发服务器

    LinuxC高并发服务器是利用操作系统提供的epoll机制,在C语言环境下构建的一种能处理大量并发连接的服务器。Epoll是Linux内核提供的一种I/O多路复用技术,它极大地提升了在高并发场景下的系统性能。下面我们将深入...

    SQL Server和Oracle并行处理比较分析

    但是,Oracle也可能面临锁定问题,特别是在高并发的更新操作下,可能会导致锁定冲突和性能瓶颈。 两者的并行处理策略各有优劣。Oracle的MVCC提供了较高的并发性,但在特定条件下可能增加数据一致性验证的复杂性;...

    C#高并发SOCKET服务器和客户端完整工程实例源码.zip

    在高并发场景下,服务器需要处理大量同时连接的客户端请求。C#中的Socket服务器通常采用多线程或异步编程模型来提高并发性能。多线程允许每个客户端连接在一个单独的线程上运行,而异步编程(如使用async/await...

    SqlServer数据库性能优化详解

    在高负载环境下,例如大型Web站点,采用多层系统并在多个服务器之间均衡处理负荷是一种常见的做法。SqlServer 2000通过将SQL Server数据进行水平分区,在一组服务器之间分摊数据库处理负荷,从而形成一个“联合体”...

Global site tag (gtag.js) - Google Analytics