blob: 6519ae3f9fcd7cc75276fc5c336c803a5b56966e [file] [view]
# UBRing: 高性能共享内存 RPC
UBRing brpc 中的高性能 RPC 实现,它利用共享内存进行进程间通信(IPC)。它支持本地共享内存(POSIX IPC)和远端共享内存(ubs-mem)两种模式,提供微秒到纳秒级的进程间通信延迟。
## 技术背景
传统的 RPC 框架通常使用网络套接字进行通信,由于内核参与、上下文切换和数据拷贝等原因,会引入显著的开销。UBRing 通过使用共享内存作为通信介质来解决这个问题,允许进程之间直接内存访问,最小化内核干预。
UBRing 的主要优势:
- **超低延迟**:微秒级 RPC 延迟
- **高吞吐量**:每秒数百万次 RPC 调用
- **减少数据拷贝**:进程间直接内存访问
- **跨平台支持**:支持 Linux macOS
## 支持的共享内存后端
UBRing 支持两种共享内存后端,通过 `ub_shm_type` 参数控制:
### 1. POSIX IPC 共享内存 (ub\_shm\_type = 1)
这是默认模式,使用标准 POSIX 共享内存进行本地 IPC。同一机器上的进程可以通过共享内存区域直接通信。
### 2. UBS-Mem 远端共享内存 (ub\_shm\_type = 2)
此模式使用 ubs-memUnified Block Storage Memory),这是来自 openEuler 的开源远端共享内存框架。它支持机架内节点之间的共享内存通信,类似于 RDMA 但部署要求更简单。
**UBS-Mem 开源地址**: <https://atomgit.com/openeuler/ubs-mem>
**所需库文件**:
- `libubsm_sdk.so` - UBS-Mem SDK 库(安装路径:`/usr/local/ubs_mem/lib/libubsm_sdk.so`
- UBS-Mem 通过 `dlopen()` 动态加载该库,并使用 `ubsmem_initialize()``ubsmem_create_region()``ubsmem_shmem_allocate()``ubsmem_shmem_map()` 等函数
**UBS-Mem 关键函数**:
- `ubsmem_init_attributes()` - 初始化 UBS-Mem 属性
- `ubsmem_initialize()` - 初始化 UBS-Mem
- `ubsmem_finalize()` - 释放 UBS-Mem
- `ubsmem_create_region()` - 创建共享内存区域
- `ubsmem_shmem_allocate()` - 分配共享内存
- `ubsmem_shmem_map()` - 将共享内存映射到本地地址空间
- `ubsmem_shmem_unmap()` - 解除共享内存映射
- `ubsmem_shmem_deallocate()` - 释放共享内存
- `ubsmem_destroy_region()` - 销毁共享内存区域
### 未来扩展
该架构设计支持未来扩展 CXLCompute Express Link)基于的远端共享内存,实现更灵活的分布式内存共享。
## 构建配置
### 使用 CMake 构建
要构建带有 UBRing 支持的 brpc,请使用以下命令:
```bash
# 构建 brpc 并启用 UBRing 支持
cd /path/to/brpc
cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DWITH_UBRING:BOOL=ON
cmake --build build -j 8
# 构建 ubring_performance 示例
cd /path/to/brpc/example/ubring_performance
cmake -B build
cmake --build build -j 8
```
### 使用 Bazel 构建
使用 Bazel 构建带有 UBRing 支持的 brpc
```bash
# 构建 brpc 并启用 UBRing 支持
cd /path/to/brpc
bazel build //... --define=with_ubring=true
# 构建 ubring_performance 示例
bazel build //example/ubring_performance/...
```
### 选择共享内存后端
共享内存后端通过 `--ub_shm_type` 参数控制:
```bash
# 使用 POSIX IPC(默认)
./your_program --ub_shm_type=1
# 使用 UBS-Mem
./your_program --ub_shm_type=2
```
## 性能测试
### 示例: ubring\_performance
brpc `example/ubring_performance/` 目录提供了性能测试示例。
#### 构建示例
```bash
cd example/ubring_performance
mkdir -p build && cd build
cmake ..
make
```
#### 运行服务端
```bash
# 使用 POSIX IPC
./ubring_performance_server --ub_shm_type=1
# 使用 UBS-Mem
./ubring_performance_server --ub_shm_type=2
```
#### 运行客户端
```bash
# 使用 POSIX IPC
./ubring_performance_client --ub_shm_type=1 --server=127.0.0.1:8000
# 使用 UBS-Mem
./ubring_performance_client --ub_shm_type=2 --server=<remote_ip>:8000
```
#### 测试选项
| 选项 | 描述 | 默认值 |
| --------------- | ------------------------- | -------------- |
| `--ub_shm_type` | 共享内存类型 (1=IPC, 2=UBS-Mem) | 1 |
| `--server` | 服务端地址 | 127.0.0.1:8000 |
| `--thread_num` | 客户端线程数 | 1 |
| `--request_num` | 每线程请求总数 | 1000000 |
| `--timeout_ms` | 请求超时时间(毫秒) | 1000 |
## 架构概述
```mermaid
graph TD
subgraph 客户端进程
A[Client]
end
subgraph 服务端进程
B[Server]
end
subgraph 共享内存层
C[SHM Manager]
D[IPC Backend]
E[UBS-Mem Backend]
end
A -->|直接内存访问| C
B -->|直接内存访问| C
C --> D
C --> E
style A fill:#636,color:#fff,stroke:#333,stroke-width:2px
style B fill:#369,color:#fff,stroke:#333,stroke-width:2px
style C fill:#396,color:#fff,stroke:#333,stroke-width:2px
```
### 架构细节
UBRing 架构包含以下组件:
1. **客户端/服务端进程**: 通过共享内存通信的应用进程
2. **SHM Manager**: 共享内存操作的中央管理器 (`shm_mgr.cpp`)
3. **IPC Backend**: 用于本地通信的 POSIX 共享内存实现
4. **UBS-Mem Backend**: 用于跨节点通信的远端共享内存实现
## 实现细节
### 共享内存管理
共享内存管理器 (`shm_mgr.cpp`) 为不同的共享内存后端提供统一接口:
- **初始化**: `ShmMgrInit()` - 初始化共享内存子系统
- **本地分配**: `ShmLocalMalloc()` - 分配本地共享内存
- **远端分配**: `ShmRemoteMalloc()` - 分配远程节点可访问的共享内存
- **释放**: `ShmFree()` - 释放共享内存资源
### 定时器管理
UBRing 使用高精度定时器系统 (`timer_mgr.cpp`) 进行连接管理和超时处理,支持 epollLinux)和 kqueuemacOS)。
## 参考资料
- [UBRing 特性提案](https://github.com/apache/brpc/issues/3226)
- [UBRing 技术讨论](https://github.com/apache/brpc/discussions/3217)
- [UBS-Mem 开源项目](https://atomgit.com/openeuler/ubs-mem)
## 相关文档
- [UB Client](ub_client.md) - 访问 UB 服务
- [RDMA 支持](rdma.md) - 远程直接内存访问