HRPC在Polaris存储系统中的应用

作者:H3C-Navigator日期:9/30/2025

摘要

通信是分布式系统的基石。本文旨在介绍Polaris分布式存储系统的专用通信机制HRPC。介绍HRPC作为系统的一个基础组件,是如何结合系统内存池管理,协程等其他组件,为存储系统上层应用打造一个高效的低时延高并发高带宽的通信框架。

HRPC是什么

HRPC是Polaris分布式存储系统用于消息传输的专用网络通信模块。HRPC将上层多种类型请求消息进行封装,使用RDMA进行快速数据传输。HRPC对业务层提供了简单易用的高效异步消息通信接口,同时屏蔽了底层网络不同传输层的差异。在支持RDMA等较新网络传输技术的同时,也兼容传统的TCP网络。以下是HRPC在系统中的位置:

RDMA简介

分布式存储通过网络将各个独立的存储节点互联组成集群,并通过网络对外提供服务。网络是影响分布式集群整体性能的一个重要因素。数据读写、复制、恢复、再平衡等关键行为,以及各组件间各端口的心跳检测和通信,无一不受到网络的影响。随着节点网络带宽的提升,尤其是进入100G+的时代,传统的TCP/IP软硬件架构及应用存在着网络传输和数据处理的延迟过大、存在多次数据拷贝和中断处理、以及复杂的TCP/IP协议处理等问题。为了解决传统TCP/IP协议在网络传输时所引入的较高时延和对服务器资源的过度消耗等问题,采用RDMA技术是当下一种理想的选择。

RDMA(Remote Direct Memory Access,远程直接内存访问)是一种为了解决网络传输中服务器端数据处理延迟而产生的技术。RDMA技术实现了在网络传输过程中两个节点之间数据缓冲区数据的直接传递。在本节点可以直接将数据通过网络传送到远程节点的内存中,具备零拷贝、内核旁路和CPU卸载三个标志性的技术特点,数据平面工作由RDMA硬件网卡完成,同时做到了高带宽、低时延、低CPU开销。下图是TCP/IP和RDMA的IO栈流程差异示意图:

当前RDMA技术的实现方式主要有InfiniBand、RoCE、iWARP三种:

• IB(InfiniBand):基于InfiniBand 架构的RDMA 技术,由IBTA(InfiniBand Trade Association)

提出。InfiniBand是专为RDMA设计的网络,主要应用在HPC领域,其有一整套完整的框架和链路层到传输层规范,架构较为封闭,需要用专用的硬件设备搭建一套独立的组网。

• RoCE(RDMA over Converged Ethernet):基于以太网的RDMA 技术,由IBTA 提出。

包括RoCE v1和RoCE v2。RoCE v1基于以太网链路层封装IB报文,适用于单个二层网络。由于缺乏三层路由功能,因此RoCE v1的应用较为有限。RoCE v2在RoCE v1的基础上进行了改进,采用以太网的UDP协议对IB协议报文进行封装。这使得RoCE v2具备了三层路由能力和更好的扩展性。当前RoCE v2的应用更为广泛。

• iWARP(Internet Wide Area RDMA Protocal):基于TCP/IP 协议的RDMA 技术,由IETF 标准定义。基于TCP协议实现的iWARP协议能在有损网络场景中提供比RoCE更好的可靠性。但相对的,TCP协议的连接机制和可靠性保障机制会带来大量的开销,这导致iWARP性能比RoCE和IB协议更低。

RDMA虽然是一种高效的网络传输技术,但要用好并不容易,并不是将传统socket编程接口进行简单替换即可。相比传统socket,RDMA编程更接近底层硬件。特别是在当前闪存介质普及的情况下,要完全发挥RDMA与新型存储设备的性能优势,需要从整体框架上进行RDMA适配,将IO路径上各模块联动优化才是分布式存储追求极致性能之路。

HRPC针对RDMA网络和NVMe SSD ,对IO栈上各模块进行了相应的优化设计,以实现低延迟高并发的高效通信。

IO内存零拷贝

RDMA是网卡直接在两个节点间进行数据传输。对于RDMA网卡来说,需要知道两端进行读写的内存地址,而且需要是物理地址。在RDMA技术中,这通过注册MR内存实现。简单来说,就是在RDMA传输数据前本地和远端的内存都需要注册成MR内存,此MR注册过程将告诉网卡虚拟地址和物理地址的映射关系,以及一些内存访问权限信息。

HRPC充分利用了RDMA的内存注册机制,整个IO路径过程中使用内存池中的内存,实现全流程零拷贝。内存池模块在进程初始化的时候将大页内存创建出多种粒度的memory pool,并提前注册好MR。业务模块需要发起数据传输前,按需申请需要的内存,此内存可以直接交给RDMA网卡访问。当网卡完成RDMA操作后,此块内存将直接交给业务模块使用。经过各模块处理,再通过RDMA发送出去,全程不需要对数据进行内存拷贝,减少了系统开销并大幅降低了延迟。

同时,利用RDMA支持本地处理多个分散/聚集条目,即读取多个内存缓冲区并将它们作为一个流发送或获取一个流并将其写入多个内存缓冲区。memory pool内存池支持Scatter/gather entries 分散/聚集条目。 HRPC和应用模块通过传递Scatter/gather list完成不同IO粒度的内存访问。

单双边传输结合

HRPC对上层实现了基于事务的消息处理机制(Message based transactions) 。数据作为离散消息而不是作为流处理,这消除了应用程序将流分离为不同消息/事务的需要。

在使用RDMA操作数据传输时,通常有使用双边传输和单边传输两种方式。双边传输是一种消息语义,而单边传输则是内存语义。HRPC选择了更为灵活的单双边传输结合的方式。

双边传输(SEND/RECV)与传统Socket网络传输类似,发送端使用RDMA SEND发送数据,接收端使用RDMA RECV接收数据。但是在发送端发起RDMA SEND操作之前,接收端需要准备好接收数据的内存区并发起RDMA RECV操作,否则就会发送失败。因此双方需要约定一次传输最大的数据大小,一般在在创建RDMA连接时协商,接收端以该大小准备接收内存区,发送端以该大小对大请求进行切分。使用双边RDMA SEND/RECV的限制在于当请求小于约定大小时存在接收端内存浪费的现象,而请求大于约定大小时需要发送端切分多次传输并在接收端重组,增加了CPU开销和延迟。

在单双边结合的传输方式下,双边SEND/RECV用于控制类消息传输,而实际数据则是通过单边RDMA READ/WRITE来完成。在实际场景中每次需要传输的数据大小不是固定的,所以发起单边操作前需要先协商好数据长度和相应的内存区信息。 其方式为先使用双边SEND/RECV操作把待传输数据的内存地址、大小、rkey等控制信息进行传输,然后根据传输类型选择单边READ或WRITE操作完成实际数据的传输,最后使用双边SEND/RECV操作发送Reply结果。单双边结合传输的方式具有灵活适应各种大小请求的特点,尤其在传输大请求时具有明显优势,只需要一次单边操作即可将数据全部传输。

异步I/O及协程调度

分布式存储系统在节点间存在大量的消息收发过程,一个op操作需要远端告知处理结果,在等待远端回应处理结果的这段时间,本端将处于异步等待的过程。为了高效利用cpu,HRPC实现的是一套异步I/O消息收发机制。异步I/O是一种编程模型,它允许程序在等待I/O操作完成的同时继续执行其他任务,而不会被阻塞。异步I/O可以实现高效的并发处理和响应性能。同时,Polaris分布式存储IO栈均采用协程模型。HRPC和业务的协程调度机制相配合,实现了一套高效的并发处理机制。

协程(ULT)是一种比线程更加轻量级的存在,协程可以理解为一个特殊的函数,这个函数可以在某个地方挂起去执行别的函数,并且可以返回挂起处继续执行。一个线程内可以由多个协程来交互运行,但是多个协程的运行是串行的,也就是说同一时刻只有一个协程在运行。当一个协程运行时,其它的协程会被挂起。协程不被操作系管理,而是在用户态执行,完全由程序所控制,根据调度策略,通过协作(而不是抢占)来进行切换。在IO密集型场景下,协程的调度开销比线程小,能够快速实现调度,尽可能的提升CPU利用率。因此,很适合当前这种异步编程模型。下一代存储基于多核CPU,利用多线程+协程的方式,充分利用CPU,可以获得极高的性能。

NUMA亲和

现代服务器基本上都具备多NUMA架构。在多NUMA架构中,每个NUMA具有本地内存,也可以访问跨NUMA内存。访问本地内存比访问其他NUMA内存时延更低,开销更小,因此对内存的访问效率会直接影响存储系统的性能。HRPC采用分组技术,每个分组创建1组独立的网络分组资源,包括RDMA连接资源,网络线程资源等。有2种粒度的分组策略:

策略1:每个NUMA上创建1组独立的网络分组资源。

策略2:每个物理CPU创建1组独立的网络分组资源。

网络分组创建后,上层业务实例可以根据自己的实例数,均分这些网络分组。跟某个网络分组关联的所有业务实例将和对应的网络资源运行在同一个NUMA里,如图,以8个NUMA为例:

总结

RDMA的编程模式与传统TCP/IP相比有很大的不同,不管是内存使用机制,还是数据操作逻辑都发生了很大的变化。使用RDMA可以减少在内核协议栈处理和内存拷贝等开销,从而大幅降低数据在网络上传输的延迟,但实际数据访问需要经过软件栈多个模块的处理,这其中可能存在数据拷贝和同步等开销,当存储设备的访问延迟和网络传输延迟都达到10us级别时,这些软件栈上的开销对整体性能的影响变得愈发明显。

从TCP/IP网络通信切换到RDMA通信不仅仅是数据收发网络接口的简单替换,而是需要进行整体的软件架构的优化设计,使IO路径上各模块契合RDMA的特点整体联动,才能充分发挥RDMA的优势,并与NVMe SSD等高性能低延迟设备结合,取得存储性能的突破。HRPC作为Polaris分布式存储的高性能通信框架,不仅在网络传输上,在IO内存拷贝,CPU调度等方面也都做了大量的优化。为Polaris分布式存储实现高性能奠定了坚实的基础。


HRPC在Polaris存储系统中的应用》 是转载文章,点击查看原文


相关推荐


2026最新版Node.js下载安装及环境配置教程【保姆级教程】
城沐小巷9/30/2025

本文介绍了Node.js的安装和环境配置全过程。首先从官网下载对应系统的安装包,按照向导完成安装后测试版本确认安装成功。接着在安装目录下创建node_global和node_cache文件夹,通过npm命令配置路径。最后设置环境变量,包括创建NODE_PATH变量和修改Path变量。测试阶段通过全局安装express模块验证配置是否成功,并提供了常见错误的解决方法。全文包含详细的操作步骤和配图说明,适合Node.js初学者完成环境搭建。


如何在项目中选择使用HTTP还是WebSocket?
歪歪10010/2/2025

HTTP和WebSocket的选择取决于通信模式和业务需求。HTTP适用于客户端主动请求、低频交互的场景,如数据查询、表单提交和静态资源加载,具有简单、兼容性好的优势。WebSocket适合需要服务器主动推送、高频实时交互的应用,如聊天、实时监控和在线游戏,支持双向通信。实际项目中可混合使用,HTTP处理普通请求,WebSocket负责实时模块。决策时需考虑服务器推送需求、数据更新频率、交互模式和开发成本,灵活选用合适技术。


Java四舍五入的艺术掌握精确浮点数处理的秘密
bendan012342025/10/2

在编程过程中,浮点数的处理一直是一个棘手的问题。无论是在财务计算、科学计算,还是游戏开发中,浮点数的精度都可能对最终结果产生重要影响。而在Java编程语言中,四舍五入操作是一项非常常见的需求。如何精确地处理浮点数,避免不必要的误差呢?本文将深入探讨Java中的四舍五入技巧,帮助开发者更好地掌握浮点数的精确处理。 1. 为什么浮点数有误差? ?? 浮点数的存储方式决定了它的精度。在计算机中,浮点数通常采用IEEE 754标准进行存储,这种存储方式无法精确表示某些十进制数。这就导致了在进


线程池
karry_k2025/10/2

线程池 线程池就是一种池化技术,用于预先创建并管理一组线程,避免频繁创建和销毁线程的开销,提高性能和响应速度。 他的几个关键配置包括:核心线程、最大线程数、空闲存活时间、工作队列、拒绝策略 五大线程池、七个参数、四个拒绝策略 线程池相关参数解释 corePoolSize:核心线程数,即线程池中始终保持的线程数量。 maximumPoolSize:最大线程数,即线程池中允许的最大线程数量。 keepAliveTime:线程空闲时间,超过这个时间的非核心线程会被销毁。 workQueue:任务队列


Elasticsearch MCP 服务器:与你的 Index 聊天如何在 Linux,MacOS 及 Windows 上进行安装 ElasticsearchKibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana
Elastic 中国社区官方博客2025/10/3

访问外部知识在提升 LLM 响应能力的现代 AI 工作流中起着关键作用。但高效管理 context、确保 AI agents 之间的通信,以及扩展工具以协同工作并非易事。这就是 Model Context Protocol (MCP) 的作用所在。 Model Context Protocol 是一个开放标准,使开发者能够在他们的数据源和 AI 驱动的工具之间建立安全的双向连接。其架构非常直接:开发者可以通过 MCP servers 暴露他们的数据,或者构建连接这些服务器的 AI 应用(MCP


资深面试题之MySQL问题及解答(二)
360_go_php2025/10/4

​ MySQL 是一款广泛使用的开源数据库管理系统,其提供了许多强大的功能,如事务管理、索引优化以及高级查询支持等。在面试中,面试官通常会通过一些高级 MySQL 问题来测试候选人对数据库管理、性能优化、事务隔离等方面的理解。以下是一些常见的 MySQL 资深面试问题及其解答。 ​编辑--- 21. MySQL 里记录货币用什么字段类型好? 在 MySQL 中,记录货币类型的数据建议使用 DECIMAL 或 NUMERIC 类型。DECIMAL 类型用于存储精确的数字,特别是对于涉及小数的货币数


Python 的内置函数 ascii
IMPYLH2025/10/5

Python 内建函数列表 > Python 的内置函数 ascii ascii()函数是Python提供的一个小巧但强大的工具,它能够将任何对象转换为只包含ASCII字符的表示形式,非ASCII字符会被转义。这个函数在调试、日志记录、数据序列化等场景中特别有用,尤其是在需要确保输出只包含可打印ASCII字符的环境中。 ascii 的函数原型: def ascii(obj): ''' 转换为字符串(调用对象的 `__repr__` 方法),非 ASCII 字符将被转义


Vue 组件与插件的区别详解
excel2025/10/7

在 Vue 的开发体系中,“组件 (Component)” 与 “插件 (Plugin)” 是两个经常被提及的概念。它们都能提升开发效率与系统可维护性,但用途与设计目标截然不同。本文将通过定义、作用、实现方式与使用场景等方面,对两者进行系统梳理与对比。 一、组件是什么? 1. 定义回顾 组件是一种将图形或非图形的逻辑抽象为独立单元的开发模式。在 Vue 中,每一个 .vue 文件都可以被视为一个组件。 简单来说,组件就是一个具有独立逻辑与界面的可复用模块。 2. 组件的优势 降低系统耦合度


CentOS安装Jenkins
何中应2025/10/8

说明:之前介绍过用 Docker 的方式部署 Jenkins,本文介绍通过安装包的方式部署最新版的 Jenkins 在云服务器上安装Jenkins 第一步:准备工作 安装 Jenkins 的前提,是需要服务器有 JDK、Maven 和 Git 环境,如下: 这几个环境,参看上面的文章进行安装,最新版的 Jenkins 需要 JDK17 或 JDK21,Maven 最好装 3+ 第二步:安装启动 找一个合适的目录,下载 Jenkins 安装包 wget https://mirro


某大厂跳动面试:计算机网络相关问题解析与总结
360_go_php2025/10/10

​ 在参加像字节跳动这样的互联网公司面试时,计算机网络的知识是一个常见的考察点。以下是一些常见的计算机网络面试问题和详细解答,在面试中打下坚实的基础。 1. HTTPS通信过程 HTTPS (HyperText Transfer Protocol Secure) 是一种安全的 HTTP 协议,通过 TLS/SSL 加密实现数据的保密性和完整性。HTTPS 的通信过程包括以下几个步骤:​编辑 客户端发起连接:客户端向服务器发送请求,使用 HTTPS 协议。 服务器响应:服务器返回其 SSL/T

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0