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

总体架构图

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

数据流向

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)

模块依赖图

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

关键洞察

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)