高性能服务器系列-第五章 高并发服务器架构

高性能服务器系列-第五章 高并发服务器架构

前言

高性能大并发服务器是一个系统工程,服务器硬件(CPU、内存、磁盘、网络)和服务器软件系统(应用队列、连接池,缓存计算、网络通信技术、数据库、分布式技术)都至关重要。本文不讨论12306、淘宝等超高性能、超大规模的服务器,仅分析百万级QPS服务器技术。

一、高并发服务器架构-消息处理机制

服务器一个核心任务就是消息处理,消息处理包括网络消息接收、消息处理。下图展示套高效的消息处理机制:
在这里插入图片描述

1.网络消息接收

  • 网络消息传输协议选择

传输控制协议(TCP)和用户数据报协议(UDP)是两种最常用的网络传输协议。对服务器而言,使用TCP协议时,服务器需要管理大量的TCP连接,包括连接的建立与释放,TCP需要通过“三次握手”过程建立连接。在数据传输结束后,还需通过“四次挥手”过程来终止连接。这将消耗不少的服务器资源。因此高并发服务器选择更高效的UDP协议无疑是比较合适的,当然需要采取措施确保数据传输的可靠性。

  • IO复用模型选择

Linux系统网络消息接收比较好的方案是采用epoll IO多路复用技术,epoll 与select、poll相比,能明确知道哪个流发生了怎样的I/O事件,时间复杂度O(1),能提高程序在大量并发连接情况下的系统CPU利用率。

2.消息处理

高效的消息处理有几个关键点:1、尽量少地拷贝消息内容;2、避免消息处理阻塞;3、消息分类处理,尽量最短流程处理。下面逐条分析一下:

  • 1、尽量少地拷贝消息内容
    网络消息从内核区拷贝至用户区后,尽量不再进行消息拷贝,一个方法是开辟一块合适大小的全局内存,用于从内核区读取网络消息,该区域循环使用,消息处理时只传递消息的在该区域的偏移地址。

  • 2、避免消息处理阻塞
    避免消息处理阻塞要做到如下几点:
    a、消息接收与消息处理分离,采用线程池技术进行消息接收和消息处理,创建四个线程池:udp消息接收线程池、udp消息处理线程池、广播消息处理线程池、透传消息转发线程池。
    在这里插入图片描述
    在这里插入图片描述
    MSGRECVPORTNUM 为消息接收端口数,可根据业务需求在多个端口接收消息。
    MSGRECVTHREADNUM 为消息接收线程数,最好是MSGRECVPORTNUM的倍数。
    MSGPROTHREADRATE 为每个消息接收线程对应的消息处理线程数
    b、消息处理线程池线程数要足够多,但要解决线程空闲时的CPU消耗问题,当消息处理线程空闲时必须完全不占用CPU资源,比较好的方式是采用pipe管道通知消息处理线程进行消息处理,当无消息处理时,消息处理线程处于读管道阻塞状态,不占用CPU资源。

  • 3、消息分类处理,尽量最短路径处理。
    对网络消息进行分类,转发消息采用独立线程池处理,不需要经过管道,消息接收后直接转发;对大量客户端请求的数据提前进行预编码处理,采用RawServerData方式发送。

二、高性能服务架构-分层数据存储与处理

采用分级数据存储和处理技术,提高系统性能:
在这里插入图片描述

三、示例工程编译及运行

1.目录说明

解压HighConcurrencyServer.zip,可得到如下目录结构:
在这里插入图片描述
HighConcurrencyClient: 测试客户(c#)
HighConcurrencyServer:测试服务端(c++)
ProtoGen:Protobuf编译目录
test.mp4 : 测试用视频文件

2.客户端编译

  • 编译工具

Client_c#编译工具Microsoft Visual Studio Professional 2022

  • 编译后运行HighConcurrencyClient.exe文件,界面如下:
  • 在这里插入图片描述

3.服务端编译

  • 编译环境
    LSB Version: :core-4.1-amd64:core-4.1-noarch
    Distributor ID: CentOS
    Description: CentOS Linux release 8.5.2111
    protobuf-3.13.0
    gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)
    g++ (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)
    mysql Ver 8.0.24 for Linux on x86_64 (Source distribution)
    redis-cli 7.0.4
    cmake version 3.20.2

$PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/go/bin:/usr/local/lib/:/usr/local/bin/:/root/bin
$LD_LIBRARY_PATH :/usr/local/lib/:/tools/redis-7.0.4/deps/hiredis/

  • 编译方法

代码如下(示例):
将文件上传至centos系统,以”/xxfw/HighConcurrencyServer/”目录为例
cd /xxfw/HighConcurrencyServer/
ls
make
``
在这里插入图片描述
编译完成后执行./HighConcurrencyServer.out
在这里插入图片描述

四、资源下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值