RDMA性能测试工具集preftest_README
文章目录
- 1 概述
- 2 安装
- 3 测试方法说明
- 4 测试说明
- 5 运行测试
- 所有测试的通用选项
- 延迟测试选项
- 带宽测试选项
- ib_send_lat(发送延迟测试)和 ib_send_bw(发送带宽测试)的选项
- ib_atomic_lat(原子延迟测试)和 ib_atomic_bw(原子带宽测试)的选项
- 原始以太网发送带宽测试的选项
测试工具: https://github.com/linux-rdma/perftest
1 概述
preftest(Performance Test)是一组基于uverbs编写的测试工具集,旨在用作性能微基准。这些测试可以用作硬件或软件调优以及功能测试。
uverbs是RDMA(Remote Direct Memory Access)的一种编程接口,它提供了底层、高效的编程接口,可以控制RDMA网络适配器中的硬件资源、创建和管理RDMA操作队列等功能,同时verbs接口也提供了一些原子操作、随机访问、远程直接内存访问等工具,从而实现了高效的、无锁的、直接内存访问 。
该测试工具集包含了带宽和延迟基准测试,例如:
- Send----
ib_send_bw
和ib_send_lat
- RDMA Read----
ib_read_bw
和ib_read_lat
- RDMA Write----
ib_write_bw
和ib_write_lat
- RDMA Atomic----
ib_atomic_bw
和ib_atomic_lat
- Native Ethernet (when working with MOFED2)----
raw_ethernet_bw
和raw_ethernet_lat
2 安装
在克隆完仓库后,perftest的目录就会出现在你当前的目录下。
克隆仓库举例:
git clone <URL>
git clone https://github.com/linux-rdma/perftest.git
在执行完克隆后,执行以下命令:
-
cd perftest/
-
./autogen.sh
-
./configure
如果想在特定的目录中安装,可以使用–prefix=,例如:./configure --prefix=
-
make
-
make install
3 测试方法说明
基准测试使用CPU周期计数器获取时间戳,而无需上下文切换。然而,某些CPU架构(例如,英特尔80486或更早的PPC)并不具备这种功能。
延迟基准测试测量往返时间,但报告一半作为单向延迟。这意味着结果可能不适用于非对称配置。
在所有单向带宽基准测试中,客户端测量带宽。在双向带宽基准测试中,每个端测量它发起的流量的带宽,并在测量周期结束时,服务器将结果报告给客户端,客户端将它们组合在一起。
延迟测试报告最小、中位数和最大延迟结果。与平均延迟测量相比,中位数延迟通常对高延迟变化更不敏感。通常,由于预热效应,测量的第一个值是最大值。
长采样周期对测量精度影响非常有限。默认值为1000次迭代,这已经相当不错了。请注意,程序会保留与迭代次数成比例的内存占用的数据结构。设置非常高的迭代次数可能会对被测设备的性能产生负面影响,而这些影响与实际测试无关。如果必须使用高迭代次数,建议使用-N标志(No Peak)。
带宽基准测试可以运行多次迭代,也可以固定持续时间运行。使用-D标志指示测试运行指定的秒数。–run_infinitely标志指示程序一直运行,直到用户中断,并每5秒打印一次测量到的带宽。
延迟基准测试中的“-H”选项可以输出结果的直方图。请参考xgraph、ygraph、r-base(http://www.r-project.org/)、PSPP或其他统计分析程序。
重要提示:当在Infiniband链路上运行基准测试时,必须在开始基准测试之前在交换机或链路中的节点之一上运行子网管理器。
测试的架构包括:i686、x86_64和ia64。
4 测试说明
基准测试生成操作的合成流,这对于硬件和软件基准测试和分析非常有用。基准测试不是为模拟任何实际的应用流量而设计的。实际的应用流量可能受到许多参数的影响,因此仅基于这些基准测试的结果可能无法预测。
- ib_send_lat:使用发送事务进行延迟测试
- ib_send_bw:使用发送事务进行带宽测试
- ib_write_lat:使用RDMA写事务进行延迟测试
- ib_write_bw:使用RDMA写事务进行带宽测试
- ib_read_lat:使用RDMA读事务进行延迟测试
- ib_read_bw:使用RDMA读事务进行带宽测试
- ib_atomic_lat:使用原子事务进行延迟测试
- ib_atomic_bw:使用原子事务进行带宽测试
原始以太网接口基准测试:
- raw_ethernet_send_lat:在原始以太网接口上进行延迟测试
- raw_ethernet_send_bw:在原始以太网接口上进行带宽测试
5 运行测试
前提条件:
- 内核版本为2.6
- (内核模块)与libibverbs匹配
- (内核模块)与librdmacm匹配
- (内核模块)与libibumad匹配
- (内核模块)与libmath (lm)匹配
- (Linux内核模块)与pciutils (lpci)匹配。
服务器:使用 ./<test name> <options>
命令启动服务器,其中 <test name>
是测试的名称,<options>
是一些选项参数。
客户端:使用 ./<test name> <options> <server IP address>
命令启动客户端,其中 <test name>
是测试的名称,<options>
是一些选项参数,<server IP address>
是服务器的IP地址。
注意事项:
-
<server address>
可以是IPv4或IPv6地址。如果配置了IPoIB,可以使用 IPoIB 地址。IPoIB(Internet Protocol over InfiniBand),指利用物理IB网络(包括服务器上的IB卡、IB连接线、IB交换机等)通过IP协议进行连接,并进行数据传输。
它提供了基于RDMA之上的IP网络模拟层,允许应用无修改的运行在InfiniBand网络上。但是,IPoIB性能比RDMA通信方式性能要低,大多数应用都会采用RDMA方式获取高带宽低延时的收益,少数的关键应用会采用IPoIB方式通信。
-
--help
选项可以列出可用的选项。
重要提示:必须将相同的选项传递给服务器和客户端。
所有测试的通用选项
-h, --help
:显示帮助信息。-p, --port=<port>
:在端口 上监听或连接到端口(默认为 18515)。-R, --rdma_cm
:使用 rdma_cm 连接 QPs 并在这些 QPs 上运行测试。-z, --com_rdma_cm
:与 rdma_cm 模块通信以交换数据 - 使用常规 QPs。-m, --mtu=<mtu>
:QP MTU 大小(默认为从 ibv_devinfo 获取的活动 MTU)。-c, --connection=<type>
:连接类型 RC/UC/UD/XRC/DC/SRD(默认为 RC)。-d, --ib-dev=<dev>
:使用 IB 设备 (默认为找到的第一个设备)。-i, --ib-port=<port>
:使用 IB 设备的网络端口 (默认为 1)。-s, --size=<size>
:要交换的消息大小(默认为 1)。-a, --all
:从 2 运行到 2^23。-n, --iters=<iters>
:交换次数(至少为 100,默认为 1000)。-x, --gid-index=<index>
:测试使用来自命令的 GID 和 GID 索引。-V, --version
:显示版本号。-e, --events
:在 CQ 事件上休眠(默认为轮询)。-F, --CPU-freq
:即使 cpufreq_ondemand 模块失败也不会失败。-I, --inline_size=<size>
:以内联模式发送的最大消息大小。-u, --qp-timeout=<timeout>
:QP 超时 = (4 uSec)*(2^timeout)(默认为 14)。-S, --sl=<sl>
:服务级别(默认为 0)。-r, --rx-depth=<dep>
:接收队列深度(默认为 600)。
延迟测试选项
-C, --report-cycles
:以 CPU 周期为单位报告时间。-H, --report-histogram
:打印所有结果(默认:仅摘要结果)。-U, --report-unsorted
:打印未排序的结果(默认已排序)。
带宽测试选项
-b, --bidirectional
:测量双向带宽(默认为单向)。-N, --no peak-bw
:取消峰值带宽计算(默认包括峰值带宽)。-Q, --cq-mod
:在 完成后生成 Cqe。-t, --tx-depth=<dep>
:发送队列的大小(默认为 128)。-O, --dualport
:在双端口模式下运行测试(2 QPs)。两个端口都必须处于活动状态(默认关闭)。-D, --duration=<sec>
:以秒为单位运行测试的持续时间。-f, --margin=<sec>
:在持续时间内测量结果,结果必须在边缘范围内(默认为 2)。-l, --post_list=<list size>
:发送 WQEs 的列表大小为 (而不是单个帖子)。
--recv_post_list=<list size>
:接收 WQEs 的列表大小为 (而不是单个帖子)。-q, --qp=<num of qp's>
:进程中运行的 QP 数量(默认为 1)。
--run_infinitely
:在用户中断之前一直运行测试,每 5 秒打印一次结果。
ib_send_lat(发送延迟测试)和 ib_send_bw(发送带宽测试)的选项
-r, --rx-depth=<dep>
:接收队列的大小(默认为 BW 测试中的 512)。-g, --mcg=<num_of_qps>
:向附加了 <num_of_qps> 个 QPs 的多播组发送消息。-M, --MGID=<multicast_gid>
:在多播中,使用 <multicast_gid> 作为组 MGID。
ib_atomic_lat(原子延迟测试)和 ib_atomic_bw(原子带宽测试)的选项
-A, --atomic_type=<type>
:原子操作的类型,可选值为 {CMP_AND_SWAP,FETCH_AND_ADD}。-o, --outs=<num>
:未完成的读/原子请求的数量,也在 READ 测试中使用。
原始以太网发送带宽测试的选项
-B, --source_mac
:源 MAC 地址,格式为 XX:XX:XX:XX:XX:XX(默认使用 GID 的 MAC 地址)。-E, --dest_mac
:目标 MAC 地址,格式为 XX:XX:XX:XX:XX:XX,必须输入。-J, --server_ip
:服务器 IP 地址,格式为 X.X.X.X(用于发送带有 IP 头的包)。-j, --client_ip
:客户端 IP 地址,格式为 X.X.X.X(用于发送带有 IP 头的包)。-K, --server_port
:服务器 UDP 端口号(用于发送带有 UDP 头的包)。-k, --client_port
:客户端 UDP 端口号(用于发送带有 UDP 头的包)。-Z, --server
:选择当前计算机的服务器端(–server/–client 必须被选中)。-P, --client
:选择当前计算机的客户端端(–server/–client 必须被选中)。
相关文章:
RDMA性能测试工具集preftest_README
文章目录 1 概述2 安装3 测试方法说明4 测试说明5 运行测试所有测试的通用选项延迟测试选项带宽测试选项ib_send_lat(发送延迟测试)和 ib_send_bw(发送带宽测试)的选项ib_atomic_lat(原子延迟测试)和 ib_at…...

墨天轮专访星环科技刘熙:“向量热”背后的冷思考,Hippo如何打造“先发”优势?
导读: 深耕技术研发数十载,坚持自主可控发展路。星环科技一路砥砺前行、坚持创新为先,建设了全面的产品矩阵,并于2022年作为首个独立基础软件产品公司成功上市。星环科技在今年的向星力•未来技术大会上发布了分布式向量数据库Tra…...
逆向-beginners之非递归
/* * 非递归 */ void f() { } void main() { f(); } #if 0 /* * intel */ 0000000000001129 <f>: 1129: f3 0f 1e fa endbr64 112d: 55 push %rbp 112e: 48 89 e5 mov %rsp,%…...
Spring for Apache Kafka概述和简单入门
一、概述 Spring for Apache Kafka 的高级概述以及底层概念和可运行的示例代码。 二、准备工作 注意:进行工作开始之前至少要有一个 Apache Kafka 环境 2.1、依赖 使用 Spring Boot<dependency><groupId>org.springframework.kafka</groupId><artifact…...

基于SSM+Vue的医院医患管理系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...

再次理解Android账号管理体系
目录 ✅ 0. 需求 📂 1. 前言 🔱 2. 使用 2.1 账户体系前提 2.2 创建账户服务 2.3 操作账户-增删改查 💠 3. 源码流程 ✅ 0. 需求 试想,自己去实现一个账号管理体系,该如何做呢? ——————————…...

如何在Blender中压缩/减小GLTF模型的大小
GLTF 如何在Blender中压缩/减小GLTF模型的大小 Blender是一款功能强大的开源软件,旨在创建3D图形,动画和视觉效果。它支持多种文件格式的导入和导出,包括GLB,GLTF,DAE,OBJ,ABC,USD…...
IntelliJ IDEA使用_Plugin插件推荐
官网插件库:https://plugins.jetbrains.com/search 代码规范检测:Alibaba Java Coding Guidelines码云:Giteemybatis插件:MyBatisX多颜色括号:Rainbow Brackets操作快捷键提示:Key Promoter X力扣ÿ…...
Ajax fetch navigator.sendBeacon 三个的区别
Ajax、fetch 和 navigator.sendBeacon 是用于发送网络请求的不同方法。 Ajax: Ajax 是一种传统的用于发送异步请求的技术。它使用 XMLHttpRequest 对象来发送数据和接收响应。通过创建 XMLHttpRequest 对象,你可以通过调用其 open() 方法指定请求的类型和 URL&#…...
map-reduce执行过程
Map阶段 Map 阶段是 MapReduce 框架中的一个重要阶段,它负责将输入数据转换为中间数据。Map 阶段由一个或多个 Map 任务组成,每个 Map 任务负责处理输入数据的一个子集。 执行步骤 Map 阶段的过程可以分为以下几个大步骤: 输入数据分配&a…...
技术人员怎样提升对业务的理解
技术服务于业务。 一个技术人员想要走得更远,不能仅局限于技术,需要对自己所从事的业务领域有不断深入和全面的理解。 所谓业务领域,就是大家平常自我介绍,不会仅简单说我是搞C的,我是搞JAVA的,而是游戏后台…...

【分布式】分布式事务:2PC
分布式事务的问题可以分为两部分: 并发控制 concurrency control原子提交 atomic commit 分布式事务问题的产生场景:一份数据被分片存在多台服务器上,那么每次事务处理都涉及到了多台机器。 可序列化(并发控制)&…...

回归与聚类算法系列④:岭回归
目录 1. 背景 2. 数学模型 3. 特点 4. 应用领域 5. 岭回归与其他正则化方法的比较 6、API 7、代码 8、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数…...

idea配置git(gitee)并提交(commit)推送(push)
Intellij Idea VCS | 版本控制 - 知乎 IDEA项目上传到gitee仓库_idea上传代码到gitee_robin19712的博客-CSDN博客 git程序下载国内镜像地址: https://registry.npmmirror.com/binary.html?pathgit-for-windows/v2.42.0.windows.2/ 解压后放到固定路径:…...

(19)Task异步:任务创建,返回值,异常捕捉,任务取消,临时变量
一、Task任务的创建 1、用四种方式创建,界面button,info各一。 程序代码 private void BtnStart_Click(object sender, EventArgs e){Task t new Task(() >{DisplayMsg($"[{Environment.CurrentManagedThreadId}]new Task.---1");});t.Start()…...

设备树的理解与运用
设备树: 本质是一个文件,包含很多节点,每个节点里边是对设备属性的描述(包括GPIO,时钟,中断等等),其中节点(node)和属性(property)就是设备树最重…...

【AIGC】提示词 Prompt 分享
提示词工程是什么? Prompt engineering(提示词工程)是指在使用语言模型进行生成性任务时,设计和调整输入提示(prompts)以改善模型生成结果的过程。它是一种优化技术,旨在引导模型产生更加准确、…...
【Axure视频教程】取整函数
今天教大家在Axure里如何使用三种不同的取整函数,包括向上取整、向下取整和四舍五入取整。具体效果可以参考下方视频。该教程从0开始制作,手把手教学,无论是新手小白还是有一定基础的同学,都可以学习的哦。 【视频教程——试看版…...
MySQL清空表
当我们需要清空一个表中的所有行时,除了使用 DELETE * FROM table 还可以使用 TRUNCATE TABLE 语句。 如果想要清空一个表, TRUNCATE TABLE 语句比 DELETE语句更加有效。 TRUNCATE TABLE 语法 TRUNCATE TABLE 的语法很简单,如下:…...

使用IDEA创建Vue3通过Vite实现工程化
1、创建Vite项目的分步说明 IntelliJ IDEA与Vite构建工具集成,改善了前端开发体验。Vite 由一个开发服务器和一个构建命令组成。构建服务器通过本机 ES 模块提供源文件。生成命令将代码与汇总捆绑在一起,汇总预配置为输出高度优化的静态资产以供生产。In…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...