rpc-server端io服务模型实现:epoll线程池

小树桩的朋友 小树桩的朋友     2022-08-22     408

关键词:

(一)功能

        rpc(远程函数调用)提供client端通过网络调用远程server端的函数的服务。

        rpc-server端需要提供较高的吞吐能力,支持较大的并发连接。

(二)设计思路

  • epoll监听多个连接fd,实现IO复用

        1)epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,一般远大于2048

        2)epoll效率高,只管活跃的连接,而跟连接总数无关

        3)使用共享内存,省去了内存拷贝

  • 生产者&消费者模式对请求任务进行管理

        一个IO-thread线程维护连接池中的连接,连接有3种状态:NO_USED、READY、BUSY。

        1)NO_USED状态,fd位置空闲,连接位尚未使用

        2)READY状态,已经与client端连接连接的fd,等待请求事件

        3)BUSY状态,已经收到请求事件,将fd放入任务队列,等待work-thread处理

  • 以单个请求事件为任务单位放入队列

        将连接放入任务队列,work-thread处理完这个请求后,该fd继续变为READY放入连接池,等待新的请求到来。因此,一个连接上的请求可能被多个work-thread线程处理。

  • 管理连接池中连接,设置超时时间

        某个连接超过一个时间没有事件到来时,服务端主动断开连接;每个连接的nLastActive字段记录上次事件到来orBUSY状态的时刻。

(三)流程

 

 

(四)数据结构

  • PendingPool连接池
序号 字段 类型 含义
1 m_listen_fd int 监听客户端请求的fd
2 m_aySocket SItem* 存放已与client建立的连接对象集合
3 m_socketNum int 连接池size
4 m_ayEvent epoll_event* 记录epoll监听到的活跃事件
5 m_eventNum int epoll监听的活跃事件size
6 m_ayReady int* 任务队列,有可读事件的fd
7 m_queueLen int 队列长度
8 m_mutex pthread_mutex_t 互斥锁,控制出队
9 m_condition pthread_cond_t 条件锁,控制入队、出队
  • SItem连接对象
序号 字段 类型 含义
1 nLastActive int 该连接最后一次活跃时间 记录秒数
2 status int 连接状态 0:未使用;1:已建立连接;2:可读
3 epoll_status int 是否加入epoll监听 0:未监听;1:已监听
4 processor shared_ptr<TProtocol>* thrift协议对象  

 

(五)实现

  • mask

=> 将连接池中的READY连接加入epoll监听

  • pool_epoll_wait

=> 等待epoll监听的fd有事件发生

  • deal_work

=> 依次处理所有有事件的fd

1)listen_fd=>有新的连接请求,accept建立新的socket,并放入连接池

2)其他socket=>有可读请求,从epoll中取消监听&将socket放入任务队列;其他事件,关闭连接

  • fetch_item

=> 从任务队列取出fd

 

(六)使用

  • IO-thread线程

        即处理接收请求的线程。其使用epoll监听listen_fd和多个client端fd,并处理epoll监听到的所有事件。

 

  • work-thread线程

不断从任务队列取出可读的fd任务,调用对应的函数处理请求,然后将fd继续放入连接池给epoll监听。

 

(七)问题

  • epoll_wait的超时时间设置

        IO-thread线程经历mask->wait->deal->checktimeout的循环,在deal时会将有请求的连接fd从epoll监听中移除

        如果mask时该请求未执行完成,则mask时该fd不加入监听

        如果此时1)没有新连接2)其他连接没有新请求,则该IO-thread线程要等待epoll超时时间才能重新监听该fd

        而如果该fd的此次执行消耗1ms&下次请求在第2ms,而epoll超时设置为1000ms,则该fd的下次请求要等待999ms才能被epoll监听到

        因此,当连接数or请求较少时,client的耗时近似于max(执行耗时,epoll_wait时间),进而,epoll_wait设置为server端请求平均处理时间较为合理

  • deal中处理可读的连接(有请求)为什么要将fd从epoll监听中移除

        如果epoll继续监听该fd,且该fd上又有新的请求,则该fd再次被放入任务队列 => 任务队列中两个fd

        可能出现多个线程处理这个连接fd的情况,无法保证顺序性

 

epoll服务端et模式

windows下IOCP,linux下epoll。epoll模型其实也是一个同步模型,ET是epoll里面的一种模式,叫边缘触发。个人理解,类似于windows下的事件选择模型。代码如下: #include<unistd.h>#include<sys/epoll.h>#include<arpa/inet.h>#include<st... 查看详情

epoll反应堆模型

...(libevent网络编程开源库核心思想)1.  普通多路IO转接服务器:红黑树――添加待监听的结点――epoll_ctl――EPOLLIN――fd――监听――epoll_wait――  返回满足监听事件的fd的总个数――传出参数events数组――内部元素――满... 查看详情

一个epoll事件实现的高并发服务/客户端(c语言实现,服务端存储基于hashtable)(代码片段)

...以自己尝试着实现了下。大体思想是将epoll接到的每一个服务请求存储到hashtable里来管理,每一个请求都可以设置独立的回调函数。具体可以先看 查看详情

epoll反应堆

...(libevent网络编程开源库核心思想)1.  普通多路IO转接服务器:红黑树――添加待监听的结点――epoll_ctl――EPOLLIN――fd――监听――epoll_wait――  返回满足监听事件的fd的总个数――传出参数events数组――内部元素―― 查看详情

c_cpplinux的下epoll的模型实现简单的http服务器(代码片段)

查看详情

多路转接之epoll服务器(代码片段)

1、epoll服务器的设计原理epoll服务器实现的仍然是多路转接,所以实现当然也是可以等待多个文件描述符了。但是,epoll服务器相对于poll服务器与select有了很大程度上的改变,优化了它的性能。(它的优点之后我... 查看详情

带有 epoll 的 TCP 服务器的线程和缩放模型

】带有epoll的TCP服务器的线程和缩放模型【英文标题】:ThreadingandscalingmodelforTCPserverwithepoll【发布时间】:2012-01-0814:34:20【问题描述】:我已经阅读了C10K文档以及许多有关扩展套接字服务器的相关论文。所有的道路都指向以下:... 查看详情

五种系统io模型以及select/poll/epoll原理与使用教程(附带reactor介绍)(代码片段)

文章目录五种IO模型一、什么是IO二、同步与异步阻塞与非阻塞三、同步阻塞IO模型四、同步非阻塞IO模型示例:将fd修改为非阻塞模式五、信号驱动IO模型六、异步IO模型七、多路复用IO模型实现方式一、selectI.fd_set结构体II.time... 查看详情

socket-demo的实现(代码片段)

...方案TCP粘包/拆包1.问题说明2.解决思路3.demo方案客户端或服务端掉线检测功能1.实现思路2.代码实现客户端身份获知、强制身份验证1.实现思路2.代码实现socket异常处理与垃圾线程回收1.实现思路2.代码实现项目结构参考前言最近公... 查看详情

用unix/c实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)(代码片段)

用Unix/C实现基于自动扩/减容线程池+epoll反应堆模型的服务器框架前言服务器端源码客户端源码自定义库helper.c和helper.hhelper.chelper.hMakefile文件使用前言由于作者本人最近在忙期末复习(KPI压力,害),目前暂时... 查看详情

libevent源码分析:epoll后端实现

epoll后端机制的实现代码在epoll.c文件中。1/*2*Copyright2000-2007NielsProvos<[email protected]>3*Copyright2007-2012NielsProvos,NickMathewson4*5*Redistributionanduseinsourceandbinaryforms,withorwithout6*mod 查看详情

nginx与epoll

...首先要了解nginx的请求处理机制为了响应客户端或者对端服务器的请求,服务器一般需要拥有并行或者并发能力,即同时或者同时段可以响应客户端的请求,一般的做法有:多进程的方式,缺点是进程数量过多的时候,内存等系... 查看详情

使用epoll方法,用c/c++实现一个ftp服务器

...,晚点补全教程编译环境:ubuntu16.04编译命令(先编译执行服务端):g++serv.cpp-oserv.out              ./serv.out     客户端:g++client.cpp-oserv.cpp        ./client.out 可以实现三种命令:get<filename>... 查看详情

epoll模型

Linux2.6内核epoll介绍   先介绍2本书《TheLinuxNetworkingArchitecture--DesignandImplementationofNetworkProtocolsintheLinuxKernel》,以2.4内核讲解LinuxTCP/IP实现,相当不错.作为一个现实世界中的实现,很多时候你必须作很多权衡,这时候参... 查看详情

selectpoll和epoll机制

...select、poll和epoll的区别  3、利用select实现IO多路复用TCP服务端  4、select应用于read函数超时非阻塞方式  5、深入理解select、poll和epoll及区别  6、epoll机制详解  7、彻底搞懂epoll高效运行的原理(推荐) 查看详情

多路io复用模型--select,poll,epoll(代码片段)

...果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率,不应在select上投入更多精力intselect(intnfds,fd_set*readfds,fd_s 查看详情

基于线程池消息队列和epoll模型实现client-server并发架构(代码片段)

...点击量就有几十万甚至上百万,这么多请求一下子涌入到服务器,服务器需要对这么多的请求逐个进行消化掉,假如服务器一秒的处理能力就几万,那么剩下的不能及时得到处理的这些请求作何处理?总不能让用户界面一直等着... 查看详情

io模型及select,poll,epoll和kqueue的区别

(一)首先,介绍几种常见的I/O模型及其区别,如下:blockingI/OnonblockingI/OI/Omultiplexing(selectandpoll)signaldrivenI/O(SIGIO)asynchronousI/O(thePOSIXaio_functions)—————异步IO模型最大的特点是完成后发回通知。阻塞与否,取决于实现IO交换的... 查看详情