brpc
文章平均质量分 90
KIDGINBROOK
这个作者很懒,什么都没留下…
展开
-
brpc源码学习(十)- RDMA通信
目录整体流程初始化内存池建立连接基于polling模式的收发数据事件通知模式因为kernel bypass和zero copy,使得rdma相对tcp有着显著的优势:低时延,高带宽,cpu消耗少,因此brpc也支持了使用rdma进行通信。使用的方法很简单,client端只需要设置ChannelOptions.use_rdma = true,server端只需要设置ServerOptions.use_rdma = true整体流程接下来首先以polling + 共享原创 2022-04-25 17:12:25 · 2836 阅读 · 3 评论 -
brpc源码学习(九)- 内存池ObjectPool
brpc为了优化在高并发场景下malloc和free的性能,引入了ObjectPool和ResourcePool,这两个类基本一样,只不过返回的一个是T*,一个是ID,所以接下来以ObjectPool为例分析一下ObjectPool使用非常简单,假如有个自定义的无参数构造的类TestClass,那么创建一个TestClass实例的方法为TestClass* a = get_object<TestClass>(),归还则只需要return_object(a)先介绍下ObjectPool原创 2021-09-10 11:54:58 · 1100 阅读 · 1 评论 -
brpc源码学习(八)- client端请求server整体流程
还是以上篇的demo为例看下brpc client端请求server是怎样的流程,为了方便,这里再贴下demo的代码,首先是proto的定义然后就是client端请求逻辑可以看到使用还是很方便的,channel init,填充request,调用service,然后就可以访问server端返回的response了。然后放一张官网的图,对整体流程有个大概印象channel继承自google::protobuf::RpcChannel,channel就相当于client,代表了和se原创 2021-03-24 14:30:17 · 2636 阅读 · 13 评论 -
brpc源码学习(七)- 无锁mpsc队列ExecutionQueue
ExecutionQueue是一个无锁的mpsc队列,主要逻辑其实就是brpc的client端发送数据时多线程向同一个fd写入数据,后来单独抽出来成为ExecutionQueue,官方文档中描述基本功能如下:异步有序执行: 任务在另外一个单独的线程中执行, 并且执行顺序严格和提交顺序一致,任务提交是wait-free的 Multi Producer: 多个线程可以同时向一个ExecutionQueue提交任务 支持cancel一个已经提交的任务 支持stop 支持高优任务插队,且执行顺序也会严格原创 2021-01-25 13:51:40 · 2382 阅读 · 1 评论 -
brpc源码学习(六)- brpc server 端整体流程
brpc的使用比较容易上手,以官方demo为例,因为brpc的数据序列化依赖protobuf,所以首先需要定义个proto然后继承EchoService并实现Echo方法然后是整体流程启动还是比较简单的,定义server,AddService,然后Start即可首先放一张官网的图,陷入细节前先有个大概印象然后看下AddService然后是AddServiceInternal首先判断注册的service中是否有method,如果没有则直接返回;然后调用Ini原创 2021-01-05 17:04:11 · 4004 阅读 · 4 评论 -
brpc源码学习(五)-IOBuf
目录BlockBlockRefIOBuf主要apitls优化IOPortalprotobuf接口首先放上官方介绍:brpc使用butil::IOBuf作为一些协议中的附件或http body的数据结构,它是一种非连续零拷贝缓冲,在其他项目中得到了验证并有出色的性能。IOBuf的接口和std::string类似,但不相同。以及官方ppt的这张图从上到下结构分别为IOBuf,BlockRef和Block。Block首先看下Block的结构,bl..原创 2020-12-22 16:10:26 · 3480 阅读 · 0 评论 -
brpc源码学习(四)- bthread调度执行总体流程
bthread调度整体流程如下图所示全局单例task_control有多个task_group,每个task_group内有两个执行队列_rq和_remote_rq,执行队列中存放着待执行的bthread。TaskGroup对应一个pthread,初始化函数如下,创建rq和remote_rq,创建main_stack和main_tid;main_tid代表主流程,后面会具体讲main_stack和main_tid的作用TaskControl是一个单例,下面是初始化的过程,主要..原创 2020-08-06 13:45:39 · 2069 阅读 · 0 评论 -
brpc源码学习(三)- WorkStealingQueue
每个bthread_worker都有自己的work_steal_queue,bthread_worker会从自己queue里pop数据进行处理,如果自己的queue为空,则尝试去其他bthread_worker的queue中steal,所以当前queue不会发生pop和push并发的情况;可能发生并发的情况为,steal和steal,steal和push,steal和pop;为了避免锁的开销,brpc设计了lock-free的WorkStealingQueue。work steal queue的p.原创 2020-06-03 19:50:17 · 806 阅读 · 0 评论 -
brpc源码学习(二)-bthread的创建与切换
brpc引入m:n的线程模型,固定的内核线程调度运行大量的bthread以避免内核线程上下文切换带来的开销。bthread类似协程,即用户态线程,bthread的切换不会陷入内核,不会进行一系列内存同步等耗时操作,因此bthread的切换在100-200ns,相比内核线程的微秒级别有着数量级的提升。为了实现协程需要协程栈,协程的初始化,以及协程间的切换,下面来逐一分析这几个过程。首先看下协程栈的结构,如下,context指向协程栈顶,stacktype表示栈的类型(大小),storage为栈空间原创 2020-05-29 15:36:57 · 3807 阅读 · 4 评论 -
brpc源码学习(一)-butex
由于brpc中引入了bthread,如果在bthread中使用了mutex,那么将会挂起当前pthread,导致该bthread_worker无法执行其他bthread,因此类似pthread和futex的关系,brpc引入butex来实现bthread粒度的挂起和唤醒。首先看下butex中使用到的FastPthreadMutex,FastPthreadMutex是基于futex实现的pthread粒度的锁,当竞争不激烈时,lock和unlock操作都是通过修改一个用户态的atomic来实现,只有当竞争激原创 2020-05-19 17:26:54 · 3651 阅读 · 4 评论