brpc internal
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
futex_wait_private(value, expect) #atomic 系统调用原语 Parkinglot封装, wait signal
避免全局竞争的方法:
很多个parkinglot, 进行worker分组, 改成局部竞争, 只唤醒组内部分worker
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。
运行
- eventDispatcher:run EPOLLIN epoll bthread
- 当前线程起一个bthread, read/cut messages 这样没有专门的io线程, 避免全局竞争, 如果某个callback阻塞, 其他线程会吧read/cut 偷走继续运行
- 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的更多相关文章
- 尝试brpc来升级rpc服务,测试应用过程
照着官方文档来,不过在mac下还是有些小坑 对熟悉c++的人来说很小儿科,但对c++相对比较外行 (只知道基本语法和部分数据结构)的人,还是作不到开箱即用 首先编译```If you need to ...
- myeclipse 内存不够用报错PermGen space 和 An internal error has occurred.
最近项目中又增加了新的模块,项目的代码又多了不少.运行的时候总是报如下错误 Exception in thread "http-apr-80-exec-6" java.lang.O ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- idea报错:error java compilation failed internal java compiler error
idea下面报如下问题 error java compilation failed internal java compiler error 解决办法:Setting->Compiler-> ...
- AutoMapper对internal访问级别属性的映射
最近在使用DDD重新搭建公司内部OA的架构,具体情况搭好了应该会写一下,这里说的是今天遇到的问题. 先简单说一下相关的几个部分: 1.聚合.聚合分成了两个模块:一个包含审批单据等估计至少今年不会怎么变 ...
- Tcl internal variables
Tcl internal variables eryar@163.com 在Tcl中内置了一些变量,并赋予了一定的功能.内置变量列表如下: 变量名称 功能描述 argc 指命令行参数的个数. argv ...
- c++ builder 2010 错误 F1004 Internal compiler error at 0x9740d99 with base 0x9
今天遇到一个奇怪的问题,拷贝项目后,在修改,会出现F1004 Internal compiler error at 0x9740d99 with base 0x9 ,不管怎么改,删除改动,都没用,关闭 ...
- ORA-00600: internal error code, arguments: [4194]
使用PlateSpin复制出来的一数据库服务器(Oracle 10g)在启动数据库实例时遇到"ORA-00600: internal error code, arguments: [4194 ...
- 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 是因为目标板的芯片处于休眠 ...
- HTTP 错误 500.21 - Internal Server Error 解决方案
不久前重新安装了Windows7,在安装了VS2010 开发平台之后,将网站发布到IIS,访问发生如下错误: HTTP 错误 500.21 - Internal Server Error处理程序“Ni ...
随机推荐
- BFF层聚合查询服务异步改造及治理实践 | 京东云技术团队
首先感谢王晓老师的[接口优化的常见方案实战总结]一文总结,恰巧最近在对稳健理财BFF层聚合查询服务优化治理,针对文章内的串行改并行章节进行展开,分享下实践经验,主要涉及原同步改异步的过程.全异步化后衍 ...
- Hybrid 实验
实验拓扑 实验需求 按图示给各 PC 配置 IP 地址 PC1属于 VLAN 10 : PC2 与 PC5 属于 VLAN 20:PC4属于 VLAN 30 实现全网互通 实验步骤 1.配置链路聚合 ...
- ChatGPT教我用200行代码写一个简版Vue框架 - OpenTiny
AI 是未来最好的老师 最近,我正在准备一份关于 Vue 基础的学习材料.期间我突发奇想:能否利用现在热门的 ChatGPT 帮我创建学习内容?其实 Vue 本身不难学,特别是基础用法,但是,如果你想 ...
- 一次性掌握innodb引擎如何解决幻读和不可重复读
了解mysql的都知道,在mysql的RR(可重复)隔离级别下解决了幻读和不可重复.你知道RR下是怎么解决的吗,很多人会回答是通过MVCC和next-key解决的,具体是怎么解决的,今天来重点分析下. ...
- C++ 核心指南之资源管理(中)
C++ 核心指南(C++ Core Guidelines)是由 Bjarne Stroustrup.Herb Sutter 等顶尖 C++ 专家创建的一份 C++ 指南.规则及最佳实践.旨在帮助大家正 ...
- 文献精读1:SpikTransformer
Spikformer code source(pku):GitHub - ZK-Zhou/spikformer: ICLR 2023, Spikformer: When Spiking Neural ...
- 2023-07-05:爱丽丝和鲍勃继续他们的石子游戏 许多堆石子 排成一行,每堆都有正整数颗石子 piles[i] 游戏以谁手中的石子最多来决出胜负。 爱丽丝和鲍勃轮流进行,爱丽丝先开始。最初,
2023-07-05:爱丽丝和鲍勃继续他们的石子游戏 许多堆石子 排成一行,每堆都有正整数颗石子 piles[i] 游戏以谁手中的石子最多来决出胜负. 爱丽丝和鲍勃轮流进行,爱丽丝先开始.最初,M = ...
- AcWing 第87场周赛题解
T1 移动棋子 算出数值为 \(1\) 的点离 \((3, 3)\) 的距离即可. #include <iostream> #include <cstring> #includ ...
- .Net FrameWork下面如何生成AOT呢?
前言 其实AOT预编译,在.Net FrameWorker1.0里面就有了.它叫做Ngen,只不过当时叫做生成本机映像,实际上还是一个东西,也就是预编译.本篇来看下. 概括 1.介绍 现在的现代化的. ...
- 图解 Vue 响应式原理
Vue 初始化 模板渲染 组件渲染 为了便于理解,本文将从以下两个方面进行探索: 从 Vue 初始化,到首次渲染生成 DOM 的流程. 从 Vue 数据修改,到页面更新 DOM 的流程. Vue 初始 ...