brpc internal

article/2025/8/29 19:56:22

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 stopwait until signaledwork stealing from othersched_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 stopcheck each bucket for new tasksbuild a heap (remove deleted tasks)pop first task from heaprun if timeoutcal the next timeoutfutex_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.


http://chatgpt.dhexx.cn/article/QLvh3fie.shtml

相关文章

brpc学习:bvar

一.介绍 bvar是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing,相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销,也快于竞争频繁的原子操作。 brpc…

c++ http服务器之Apache工具ab压力测试(nginx与brpc)

系列服务器开发 文章目录 系列服务器开发前言一、ab是什么?二、ab测试实例nginx1.nginx环境准备与安装2.ab测试nginx本身的性能3.ab测试基于brpc的http服务器性能 三、ab实战之常见问题解决总结 前言 一、ab是什么? ab全称为:apache bench&a…

brpc源码学习(五)-IOBuf

目录 Block BlockRef IOBuf 主要api tls优化 IOPortal protobuf接口 首先放上官方介绍: brpc使用butil::IOBuf作为一些协议中的附件或http body的数据结构,它是一种非连续零拷贝缓冲,在其他项目中得到了验证并有出色的性能。IOBuf的接…

BRPC学习

一 源码地址:GitHub - apache/incubator-brpc: brpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. "brpc"…

brpc源码解析(四)—— Bthread机制

目录 一、概述二、启动入口函数三、内部启动函数四、worker工作入口五、总结 Bthread是brpc用到的一个线程库,也是brpc的核心之一,默认情况下,包括用户代码在内的绝大部分代码都是运行在bthread里的,bthread也是brpc实现高性能的基…

Springboot集成Brpc

本文代码可在总结处自取。 1、为什么要写这篇文章 最近自己做的业务在和C团队对接,双方需要指定接口与传输协议。原本是直接使用http协议传输json数据,对双方来说都比较简单可接受。但是json数据传输效率实在令人堪忧,导致我们不得不另寻其道…

brpc源码学习(六)- brpc server 端整体流程

brpc的使用比较容易上手,以官方demo为例,因为brpc的数据序列化依赖protobuf,所以首先需要定义个proto 然后继承EchoService并实现Echo方法 然后是整体流程 启动还是比较简单的,定义server,AddService,然后S…

brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程

目录 1.往Server里添加Service(业务代码)2.设置服务器参数3.启动服务器 平时的工作用到了baidu-rpc搭建rpc服务,作为戈君大神的大作,在没有开源的时候,这个c 的rpc框架在厂内就已经好评颇多,无论是性能、文…

brpc初步学习

一.BRPC介绍 BRPC百度开源的一个rpc框架,它具有以下特性: 基于protobuf接口的RPC框架,也提供json等其他数据格式的支持囊括baidu内部所有RPC协议,支持多种第三方协议模块化设计,层次清晰,很容易添加自定义…

brpc介绍、编译与使用

brpc又称为baidu-rpc,是百度开发一款“远程过程调用”网络框架。目前该项目已在github上开源——https://github.com/brpc/brpc。(转载请指明出于breaksoftware的csdn博客) 据目前公开的资料,我们发现百度内部从2010年开始&#x…

NB-IOT与物联网

1. 物联网的技术格局 短距离(智能家居/穿戴等) --- zigbee, wifi, BLE 长距离 (LPWA 低功耗广域) --- LORA, NB-IOT 关于LORA大致了解了一下情况 . Lora 其实已经是一个很成熟的技术方案. 国外已经大范围使用,国内也有不少公司在基于LORA运营物联网系统. LORA的系统结构…

lora和nbiot的相同点,它们之间有何区别和联系?

在物联网无线数据传输中,有诸多方式可以选择,包括蓝牙、WIFI、FSK、ASK/OOK、Lora、Zigbee、NB-iot、Z-Wave.等, 其中lora 和NBIot 是自2016年来比较热门的两个无线通讯方式。 我们今天就和大家简单的聊聊Lora 和NBiot。 我是在2016年接触…

NB-IOT开发|nbiot开发教程《三》AT指令类模组驱动-STM32实现AT指令状态机

嵌入式开发中我们要时刻保持代码的高效与整洁看之前,先点赞 好习惯,要养成 一、前言 嵌入式开发中我们要时刻保持代码的高效与整洁。在第一节中“NB-IOT开发|nbiot开发教程《一》AT指令类模组驱动解析”我们说到AT指令模组最好的驱动-状态机。本节我们就…

基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)

一、前言 当前的场景是,在高速公路上部署温度采集设备,在高速路地表安装温度检测传感器,检测当前路段的路面实际温度。一段高速路上有多个地点需要采集温度数据。 采集温度数据需要上传到云平台进行数据存储,并且通过可视化界面展示温度变化曲线,支持查询最近几天的温度信…

NB-IoT的优势是什么?

NB-IoT的优势 : • 强链接:在同一基站的情况下,NB-IoT可以比现有无线技术提供50-100倍的接入数。一个扇区能够支持10万个连接,支持低延时敏感度、超低的设备成本、低设备功耗和优化的网络架构。举例来说,受限于带宽&a…

MN316_OPEN(NBIOT)物联网模块环境搭建

因为项目的需要,这里要使用NBIOT,踩了一些坑,这里总结一下! 编译 官方给的SDK如下: 按照说明,在该目录下直接运行如下指令:".\build.bat dlvs_h0 demo"即可成功编译,但是我编译的时候不成功,报错如下: 最后发现是因为我的目录太深的原因造成的,把"MN316_Op…

stm32毕业设计 NBIOT远程通信系统

文章目录 1 简介2 NBIOT 简介2.1 NBIOT 的特点2.2 NBIOT 的优点2.3 NBIOT能做什么 NBIOT 模块使用4 实现效果5 STM32 驱动NBIOT模块6 最后 1 简介 Hi,大家好,NBIOT是近几年不比较火的远程通信模块,是物联网的重要技术,今天学长向…

NB-IoT技术实战开发 ----- NB-IoT介绍

一.1------初识NB-IoT 1、NB-IoT介绍2、 物联网技术发展2.1有线物联网2.2 无线网络网 3、为什么需要NB-IOT4、NB-IOT优势5、NB-IOT解决方案亮点和价值5.1 广覆盖5.2 低功耗5.3低成本5.4 大连接 6、NB-IOT的应用1.智能抄表2.智能停车3.宠物跟踪4.else 1、NB-IoT介绍 NB-----Na…

【物联网】LoRa vs NBIoT

LoRa (Long Range) VS NB-IoT(Narrow Band Internet of Things) LoRa和NB-IoT是什么 通常物联网设备分为三类: 无需移动性,大数据量,需较宽频段;移动性强&#xff0…

物联网协议之NBIOT

什么是NBIOT 在物联网行业目前常用的网络通信技术主要有以下这些: nbiot属于一种LTE网络,LTE网络是目前主流的通信网络,覆盖完整、技术成熟,未来大量物联网设备都需要在LTE网络中实现通讯功能。Cat.X这个值是用来衡量用户终端设…