brpc 内部实现

thread model

pthread 1:1atomic cache同步降低性能

fiber n:1 -> nginx 多核难以扩展, 用户不能做阻塞操作.

context 存储contextualStack

bthread_make_fcontext (boost::context)手动切换线程上下文->函数栈, 寄存器

bthread_jump_fcontext 将context解包, 恢复上下文

防止栈溢出: 1. mprotect to add a guarding page (并发bthread 过多会导致mmap失败)

2.use mmap to alloc page-aligned memory

schedule 每一个pthread有一个taskgroup

basic-> run_queue(FIFO)

remotetaskqueue->备份二级队列, 向队列中提交不在btrhead中创建的任务

taskgroup逻辑

while not stop
wait until signaled
work stealing from other
sched_to(that_bthread)
work stealing
  1. futex_wait_private(value, expect) #atomic 系统调用原语 Parkinglot封装, wait signal

  2. 避免全局竞争的方法:

    很多个parkinglot, 进行worker分组, 改成局部竞争, 只唤醒组内部分worker

  3. workstealingqueue: 从这个队列里偷

TaskControl
  • 单例管理所有的taskgroups
  • 如果bthread在non-worker的pthreads中创建的时候, task_control选择一个taskgroup, 把这个btrhead写到remoteTaskQueue中
  • signal-task 唤醒通知一部分worker来偷
  • steal-task 从所有taskgroup中偷, 避免饿死
bthread执行优先级

local queue->remote queue->other worker local queue->other worker remote taskqueue

bthread_t

32bit 版本号(防止aba问题) + 32bit slot id(resourcepool中的下标)->taskMeta bthread的管理结构

start_foreground ->set_mained(ready_to_run + sched_to) 直接跑新的, 正在跑的放队尾

start_background ->ready_to_run

阻塞操作

yield -> 把当前运行环境空出来, 加到queue尾

usleep()->把当前任务从runqueue pop 定时加到remote_queue

bthread_id
  • client端, 标记每个requestid用来区分response
  • 保证rpc context 线程安全
  • 用来cancel rpc
  • 防止ABA问题
  • 具体来说,bthread_id解决的问题有:

    • 在发送RPC过程中response回来了,处理response的代码和发送代码产生竞争。
  • 设置timer后很快触发了,超时处理代码和发送代码产生竞争。

  • 重试产生的多个response同时回来产生的竞争。

  • 通过correlation_id在O(1)时间内找到对应的RPC上下文,而无需建立从correlation_id到RPC上下文的全局哈希表。
  • 取消RPC。
运行
  1. eventDispatcher:run EPOLLIN epoll bthread
  2. 当前线程起一个bthread, read/cut messages 这样没有专门的io线程, 避免全局竞争, 如果某个callback阻塞, 其他线程会吧read/cut 偷走继续运行
  3. callback 业务函数

对于每个fd, 最多有一个I和O bthread

注意:

在brpc中加mutex锁, brpc请求下游模块, 没有worker资源处理下游返回的read..无法释放mutex锁

buffer management->IOBuf

IOBuf->BlockRef->Block 三层结构

非连续的存储, 每个block引用计数, 避免频繁new, 使用cache in TLSData

timer keeping

定时器分桶, 每个结构要存的: task_list, mutex, _nearest_run_time 无锁无竞争

拿到所有定时器时, _nearset_run_time建一个全局堆

while not stop
check each bucket for new tasks
build a heap (remove deleted tasks)
pop first task from heap
run if timeout
cal the next timeout
futex_wait_private(如果有更紧急的timer插入, 会唤醒timer线程)

Memory management 专用分配, 固定size

BlockGroup / Block / T 类似于buddy 算法

resourceid = group_idex + block_offset + slot_offset

I/O model

naming & load balancer

  • control reverse 观察者模式, 服务器变化后,由naming调用lb中 add, remove, reset三个接口
  • DoublyBufferedData, TLS lock每次读前台时, 后台切换时, 从每个线程lock一个锁, 读完之后切换

Bvar & sampling

每个写bvar的时候, 只写tls . 读的时候combine.

brpc internal的更多相关文章

  1. 尝试brpc来升级rpc服务,测试应用过程

    照着官方文档来,不过在mac下还是有些小坑 对熟悉c++的人来说很小儿科,但对c++相对比较外行 (只知道基本语法和部分数据结构)的人,还是作不到开箱即用 首先编译```If you need to ...

  2. myeclipse 内存不够用报错PermGen space 和 An internal error has occurred.

    最近项目中又增加了新的模块,项目的代码又多了不少.运行的时候总是报如下错误 Exception in thread "http-apr-80-exec-6" java.lang.O ...

  3. swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明

    关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...

  4. idea报错:error java compilation failed internal java compiler error

    idea下面报如下问题 error java compilation failed internal java compiler error 解决办法:Setting->Compiler-> ...

  5. AutoMapper对internal访问级别属性的映射

    最近在使用DDD重新搭建公司内部OA的架构,具体情况搭好了应该会写一下,这里说的是今天遇到的问题. 先简单说一下相关的几个部分: 1.聚合.聚合分成了两个模块:一个包含审批单据等估计至少今年不会怎么变 ...

  6. Tcl internal variables

    Tcl internal variables eryar@163.com 在Tcl中内置了一些变量,并赋予了一定的功能.内置变量列表如下: 变量名称 功能描述 argc 指命令行参数的个数. argv ...

  7. c++ builder 2010 错误 F1004 Internal compiler error at 0x9740d99 with base 0x9

    今天遇到一个奇怪的问题,拷贝项目后,在修改,会出现F1004 Internal compiler error at 0x9740d99 with base 0x9 ,不管怎么改,删除改动,都没用,关闭 ...

  8. ORA-00600: internal error code, arguments: [4194]

    使用PlateSpin复制出来的一数据库服务器(Oracle 10g)在启动数据库实例时遇到"ORA-00600: internal error code, arguments: [4194 ...

  9. MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL

    MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL   是因为目标板的芯片处于休眠 ...

  10. HTTP 错误 500.21 - Internal Server Error 解决方案

    不久前重新安装了Windows7,在安装了VS2010 开发平台之后,将网站发布到IIS,访问发生如下错误: HTTP 错误 500.21 - Internal Server Error处理程序“Ni ...

随机推荐

  1. 使用android studio发布android与flutter混合开发项目

    一.生成androd签名证书 Android studio的Build > Grenerate Signed Bundle 选择apk 点击Create New 录入对应的签名信息:点击确定 对 ...

  2. drf——全局处理异常、接口文档、jwt介绍、based64编码与解码

    全局异常处理原理 # 对于前端来讲,后端即便报错,也要返回统一的格式,前端便于处理 {code:999,msg:'系统异常,请联系系统管理员'} # 只要三大认证,视图类的方法出了异常,都会执行一个函 ...

  3. jQuery实时显示日期、时间

    jQuery实时显示日期.时间 html: <span id="time"></span> js: <script src="Js/jque ...

  4. day09-SpringCloud Sleuth+Zipkin-链路追踪

    SpringCloud Sleuth+Zipkin-链路追踪 官网:spring-cloud/spring-cloud-sleuth: Distributed tracing for spring c ...

  5. 【python爬虫实战】用python爬取爱奇艺电视剧十大榜单的全部数据!

    目录 一.爬取目标 二.讲解代码 三.查看结果 四.视频演示 五.附完整源码 一.爬取目标 本次爬取的目标是,爱奇艺电视剧类目下的10个榜单:电视剧风云榜-爱奇艺风云榜 ​ 可以看到,这10个榜单包含 ...

  6. 旧版Vue配置API_ROOT,开发、生产地址切换

    1 目录 config/dev.env.js1 'use strict' 2 const merge = require('webpack-merge') 3 const prodEnv = requ ...

  7. CHATGPT制作AI绘画

    CHATGPT是一种基于机器学习和自然语言处理技术的人工智能应用.它可以生成自然语言文本,并且可以通过训练来学习各种不同的技能. 其中,CHATGPT制作AI绘画指的是将CHATGPT应用于绘画领域, ...

  8. 温故知新,signalR、RSA加密、ConcurrentQueue队列

    这是一个用户密码异步加解密的Demo,包含了RSA非对称加密,ConcurrentQueue线程安全队列使用,signalR实时推送加解密信息等内容. 说在前面的话 距离上次更新已然快过去一年了,这中 ...

  9. IoTOS-v1.2.1接入J-IM(t-io)后台通知App

    IoTOS v1.2.1 一.登录页增加可修改轮播 登录页增加可修改数据轮播: 首页轮播图由背景图片.标题.介绍.按钮一.按钮二(可配置跳转地址打开方式)组合而成 二.登录页增加常用运营商平台& ...

  10. 玩转AI二维码:揭秘我的漂亮二维码生成秘诀

    这几天我又生成了很多漂亮的二维码图片,有了一些感受和想法,特总结此文,分享给大家.需要图片参数的同学可直接看文章最后,我生成了100多张不同风格的图片. 先看效果,喜欢的可以继续读下去. 背景 在这篇 ...