Thesis
URPC(Unified Remote Procedure Call)是灵衢(Lingqu)内存语义开发包 UMDK 的核心组件之一,它在 UB 总线提供的原始内存语义(URMA)之上,构建了一套完整的远程过程调用协议栈。URPC 并非简单地在 RDMA 动词层封装一层 RPC,而是在 传输模式抽象、流控与内存管理、协议状态机、安全加密 和 多场景传输加速 五个维度上做了系统性的增量创新。
URPC 的设计哲学:UB 提供的是"内存语义原语"(register/unregister/import/read/write/atomic),URPC 在此之上构建的是"函数调用语义"——包括请求-响应协议、参数引用传递、流控窗口、保活探测和多模态传输。这不是 transport 的简单封装,而是一个完整的 protocol stack。
Executive Summary
URPC 在 URMA(统一内存语义层)之上构建了四个核心子系统,形成完整的高性能 RPC 能力:
graph TB
subgraph Layer4["Layer 4: URPC Framework"]
API["Public API
urpc_init / urpc_func_call
urpc_func_poll / urpc_func_return"] CP["Control Plane
cp.c | channel lifecycle"] DP["Data Plane
dp.c | REQ/ACK/RSP protocol"] FUNC["Function Registry
func.c | sync/async handler"] end subgraph Layer3["Layer 3: UMQ"] UMQ_API["UMQ API
umq_create / umq_enqueue
umq_post / umq_poll"] UB_MODE["UB Mode
64KB native"] UB_PLUS["UB_PLUS Mode
10MB reverse pull"] IPC["IPC Mode
shared memory"] FC["Flow Control
window-based credit"] end subgraph Layer2["Layer 2: URMA"] URMA_API["URMA API
register / import / jetty
post_send / poll_jfc"] end subgraph Layer1["Layer 1: UB Hardware"] HW["UB Drivers
ubcore / ubus / udma
physical bus transport"] end API --> CP API --> DP API --> FUNC CP --> UMQ_API DP --> UMQ_API FUNC --> UMQ_API UMQ_API --> UB_MODE UMQ_API --> UB_PLUS UMQ_API --> IPC UB_MODE --> URMA_API UB_PLUS --> URMA_API IPC --> URMA_API FC --> UB_MODE URMA_API --> HW style Layer4 fill:#e8eef8,stroke:#163e7a style Layer3 fill:#e8f5e9,stroke:#0f5d44 style Layer2 fill:#fff8e1,stroke:#bf8b2c style Layer1 fill:#f3e5f5,stroke:#7b1fa2
urpc_init / urpc_func_call
urpc_func_poll / urpc_func_return"] CP["Control Plane
cp.c | channel lifecycle"] DP["Data Plane
dp.c | REQ/ACK/RSP protocol"] FUNC["Function Registry
func.c | sync/async handler"] end subgraph Layer3["Layer 3: UMQ"] UMQ_API["UMQ API
umq_create / umq_enqueue
umq_post / umq_poll"] UB_MODE["UB Mode
64KB native"] UB_PLUS["UB_PLUS Mode
10MB reverse pull"] IPC["IPC Mode
shared memory"] FC["Flow Control
window-based credit"] end subgraph Layer2["Layer 2: URMA"] URMA_API["URMA API
register / import / jetty
post_send / poll_jfc"] end subgraph Layer1["Layer 1: UB Hardware"] HW["UB Drivers
ubcore / ubus / udma
physical bus transport"] end API --> CP API --> DP API --> FUNC CP --> UMQ_API DP --> UMQ_API FUNC --> UMQ_API UMQ_API --> UB_MODE UMQ_API --> UB_PLUS UMQ_API --> IPC UB_MODE --> URMA_API UB_PLUS --> URMA_API IPC --> URMA_API FC --> UB_MODE URMA_API --> HW style Layer4 fill:#e8eef8,stroke:#163e7a style Layer3 fill:#e8f5e9,stroke:#0f5d44 style Layer2 fill:#fff8e1,stroke:#bf8b2c style Layer1 fill:#f3e5f5,stroke:#7b1fa2
总体架构图
flowchart TB
subgraph UserApp["用户应用层"]
APP["Application
AI Training / Storage / Inference"] end subgraph URPC_Framework["URPC Framework Layer (~40K lines)"] direction TB subgraph CP["控制面 cp.c"] SERVER["Server Manager
listen / accept"] CLIENT["Client Manager
connect / attach"] KA["Keepalive
timer / probe"] end subgraph DP["数据面 dp.c"] PROTO["Protocol
REQ / ACK / RSP"] QUEUE_OPS["Queue Ops
send / post / poll"] EXT["Ext Ops
plugin interface"] end subgraph CH["通道 channel.c"] CHANNEL["Channel
req_entry_table
func_tbl
server_nodes"] end end subgraph UMQ["UMQ Layer (~20K lines)"] direction TB subgraph TRANS["传输模式"] UB["UB
64KB"] UBPLUS["UB_PLUS
10MB"] IPC["IPC
shared mem"] UBMM["UBMM
UB shared"] end subgraph FC["流控"] WIN["Window
local_rx_posted
remote_rx_window"] IMM["Immediate Data
IMM_TYPE_FLOW_CONTROL"] end subgraph BUF["缓冲区"] POOL["Buffer Pool
small / middle
big / huge"] end end subgraph URMA["URMA Layer"] URMA_CORE["URMA Core
register_seg / import_seg
create_jetty / bind_jetty
post_send / poll_jfc"] end subgraph HW["UB Hardware"] DRIVER["UB Drivers
ubcore / ubus / udma"] end APP --> SERVER APP --> CLIENT SERVER --> CHANNEL CLIENT --> CHANNEL CHANNEL --> PROTO PROTO --> QUEUE_OPS QUEUE_OPS --> UB QUEUE_OPS --> UBPLUS QUEUE_OPS --> IPC QUEUE_OPS --> UBMM UB --> URMA_CORE UBPLUS --> URMA_CORE IPC --> URMA_CORE UBMM --> URMA_CORE WIN --> UB IMM --> UB POOL --> UB POOL --> UBPLUS URMA_CORE --> DRIVER style URPC_Framework fill:#e3f2fd,stroke:#163e7a style UMQ fill:#e8f5e9,stroke:#0f5d44 style URMA fill:#fff8e1,stroke:#bf8b2c style HW fill:#f3e5f5,stroke:#7b1fa2
AI Training / Storage / Inference"] end subgraph URPC_Framework["URPC Framework Layer (~40K lines)"] direction TB subgraph CP["控制面 cp.c"] SERVER["Server Manager
listen / accept"] CLIENT["Client Manager
connect / attach"] KA["Keepalive
timer / probe"] end subgraph DP["数据面 dp.c"] PROTO["Protocol
REQ / ACK / RSP"] QUEUE_OPS["Queue Ops
send / post / poll"] EXT["Ext Ops
plugin interface"] end subgraph CH["通道 channel.c"] CHANNEL["Channel
req_entry_table
func_tbl
server_nodes"] end end subgraph UMQ["UMQ Layer (~20K lines)"] direction TB subgraph TRANS["传输模式"] UB["UB
64KB"] UBPLUS["UB_PLUS
10MB"] IPC["IPC
shared mem"] UBMM["UBMM
UB shared"] end subgraph FC["流控"] WIN["Window
local_rx_posted
remote_rx_window"] IMM["Immediate Data
IMM_TYPE_FLOW_CONTROL"] end subgraph BUF["缓冲区"] POOL["Buffer Pool
small / middle
big / huge"] end end subgraph URMA["URMA Layer"] URMA_CORE["URMA Core
register_seg / import_seg
create_jetty / bind_jetty
post_send / poll_jfc"] end subgraph HW["UB Hardware"] DRIVER["UB Drivers
ubcore / ubus / udma"] end APP --> SERVER APP --> CLIENT SERVER --> CHANNEL CLIENT --> CHANNEL CHANNEL --> PROTO PROTO --> QUEUE_OPS QUEUE_OPS --> UB QUEUE_OPS --> UBPLUS QUEUE_OPS --> IPC QUEUE_OPS --> UBMM UB --> URMA_CORE UBPLUS --> URMA_CORE IPC --> URMA_CORE UBMM --> URMA_CORE WIN --> UB IMM --> UB POOL --> UB POOL --> UBPLUS URMA_CORE --> DRIVER style URPC_Framework fill:#e3f2fd,stroke:#163e7a style UMQ fill:#e8f5e9,stroke:#0f5d44 style URMA fill:#fff8e1,stroke:#bf8b2c style HW fill:#f3e5f5,stroke:#7b1fa2
数据流向
sequenceDiagram
participant C as Client App
participant CP as dp.c (Client)
participant Q as Queue (Jetty)
participant U as URMA (UB Bus)
participant QS as Queue (Jetty)
participant SP as dp.c (Server)
participant S as Server App
C->>CP: urpc_func_call()
Note over CP: 1. channel_get()
2. RR select queues
3. req_entry_get()
4. fill REQ header
5. optional encrypt CP->>Q: queue->ops->send() Q->>U: urma_post_jetty_send_wr() U->>QS: hardware transport QS->>SP: urma_poll_jfc() Note over SP: 6. process_rx_cr()
7. urpc_func_exec()
8. sync_handler() SP->>S: user function executes S-->>SP: return result SP->>QS: urpc_func_return() QS->>U: urma_post_jetty_send_wr() U->>Q: hardware transport Q->>CP: urma_poll_jfc() Note over CP: 9. process_tx_msg()
10. user callback CP-->>C: callback(rsps, err)
2. RR select queues
3. req_entry_get()
4. fill REQ header
5. optional encrypt CP->>Q: queue->ops->send() Q->>U: urma_post_jetty_send_wr() U->>QS: hardware transport QS->>SP: urma_poll_jfc() Note over SP: 6. process_rx_cr()
7. urpc_func_exec()
8. sync_handler() SP->>S: user function executes S-->>SP: return result SP->>QS: urpc_func_return() QS->>U: urma_post_jetty_send_wr() U->>Q: hardware transport Q->>CP: urma_poll_jfc() Note over CP: 9. process_tx_msg()
10. user callback CP-->>C: callback(rsps, err)
模块依赖图
flowchart TD
subgraph API["Public API"]
URPC_API["urpc_framework_api.h"]
UMQ_API["umq_api.h"]
end
subgraph Framework["URPC Framework"]
CP["cp.c | 3,014 lines
init / server / client"] DP["dp.c | 2,094 lines
func_call / func_poll"] CH["channel.c | 1,471 lines
channel_alloc / req_entry"] QUEUE["queue_send_recv.c | 1,533 lines
create / bind / delete"] JETTY["jetty_public_func.c | 1,533 lines
send / post / poll"] PROVIDER["provider_ops_jetty.c
jetty provider"] FUNC["func.c
register / exec"] KA["keepalive_task.c | 922 lines"] CRYPTO["crypto.c
SSL/TLS / AES"] end subgraph UMQ["UMQ Subsystem"] UMQ_UB["umq_ub.c | 2,163 lines
bind / send / read"] UMQ_IMPL["umq_ub_impl.c | 1,485 lines
buf_alloc / enqueue"] FC["umq_ub_flow_control.c
window management"] IMM["umq_ub_imm_data.h
immediate protocol"] end subgraph URMA["URMA Layer"] URMA_CORE["urma_api.h
register / import / jetty
post / poll"] end URPC_API --> CP URPC_API --> DP URPC_API --> FUNC DP --> CH DP --> QUEUE CH --> QUEUE QUEUE --> JETTY JETTY --> PROVIDER CP --> KA CP --> CRYPTO UMQ_API --> UMQ_UB UMQ_API --> UMQ_IMPL UMQ_UB --> FC UMQ_UB --> IMM PROVIDER --> URMA_CORE UMQ_IMPL --> URMA_CORE style API fill:#e8eef8,stroke:#163e7a style Framework fill:#e3f2fd,stroke:#163e7a style UMQ fill:#e8f5e9,stroke:#0f5d44 style URMA fill:#fff8e1,stroke:#bf8b2c
init / server / client"] DP["dp.c | 2,094 lines
func_call / func_poll"] CH["channel.c | 1,471 lines
channel_alloc / req_entry"] QUEUE["queue_send_recv.c | 1,533 lines
create / bind / delete"] JETTY["jetty_public_func.c | 1,533 lines
send / post / poll"] PROVIDER["provider_ops_jetty.c
jetty provider"] FUNC["func.c
register / exec"] KA["keepalive_task.c | 922 lines"] CRYPTO["crypto.c
SSL/TLS / AES"] end subgraph UMQ["UMQ Subsystem"] UMQ_UB["umq_ub.c | 2,163 lines
bind / send / read"] UMQ_IMPL["umq_ub_impl.c | 1,485 lines
buf_alloc / enqueue"] FC["umq_ub_flow_control.c
window management"] IMM["umq_ub_imm_data.h
immediate protocol"] end subgraph URMA["URMA Layer"] URMA_CORE["urma_api.h
register / import / jetty
post / poll"] end URPC_API --> CP URPC_API --> DP URPC_API --> FUNC DP --> CH DP --> QUEUE CH --> QUEUE QUEUE --> JETTY JETTY --> PROVIDER CP --> KA CP --> CRYPTO UMQ_API --> UMQ_UB UMQ_API --> UMQ_IMPL UMQ_UB --> FC UMQ_UB --> IMM PROVIDER --> URMA_CORE UMQ_IMPL --> URMA_CORE style API fill:#e8eef8,stroke:#163e7a style Framework fill:#e3f2fd,stroke:#163e7a style UMQ fill:#e8f5e9,stroke:#0f5d44 style URMA fill:#fff8e1,stroke:#bf8b2c
关键洞察
mindmap
root((URPC Key Insights))
Architecture
Layered abstraction
ops interface polymorphism
feature flags optional
Concurrency
tx_ctx double release
req_entry hash + linear probe
rwlock separation
atomic vs non-atomic
Control In-band
immediate data encoding
flow control window
memory import protocol
UB_PLUS reverse pull
Resource Sharing
JFR/JFC ref_cnt
slab allocator
huge pool for 10MB
Production Features
Keepalive probe
SSL/TLS + AES-GCM
300K concurrent channels
DFX stats/perf
| 洞察 | 说明 |
|---|---|
| 四层动态分发 | dp.c → queue_ops → send_recv_send → urma_post → bondp_post |
| 带内控制 | 利用 immediate 数据编码流控、内存导入、反向拉取等控制协议 |
| 并发安全 | tx_ctx 双次释放、req_entry hash+线性探测、读写锁分离 |
| 资源复用 | JFR/JFC 通过 ref_cnt 在多个队列间共享 |
| 用户可选 | 每一层增量功能都是可选的(feature flag) |