preftest(Performance Test)是一组基于uverbs编写的测试工具集,旨在用作性能微基准。这些测试可以用作硬件或软件调优以及功能测试。
uverbs是RDMA(Remote Direct Memory Access)的一种编程接口,它提供了底层、高效的编程接口,可以控制RDMA网络适配器中的硬件资源、创建和管理RDMA操作队列等功能,同时verbs接口也提供了一些原子操作、随机访问、远程直接内存访问等工具,从而实现了高效的、无锁的、直接内存访问 。
该测试工具集包含了带宽和延迟基准测试,例如:
ib_send_bw
和 ib_send_lat
ib_read_bw
和 ib_read_lat
ib_write_bw
和 ib_write_lat
ib_atomic_bw
和 ib_atomic_lat
raw_ethernet_bw
和 raw_ethernet_lat
在克隆完仓库后,perftest的目录就会出现在你当前的目录下。
克隆仓库举例:
git clone <URL>
git clone https://github.com/linux-rdma/perftest.git
在执行完克隆后,执行以下命令:
cd perftest/
./autogen.sh
./configure
如果想在特定的目录中安装,可以使用–prefix=,例如:./configure --prefix=
make
make install
基准测试使用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。
基准测试生成操作的合成流,这对于硬件和软件基准测试和分析非常有用。基准测试不是为模拟任何实际的应用流量而设计的。实际的应用流量可能受到许多参数的影响,因此仅基于这些基准测试的结果可能无法预测。
原始以太网接口基准测试:
前提条件:
服务器:使用 ./
命令启动服务器,其中
是测试的名称,
是一些选项参数。
客户端:使用 ./
命令启动客户端,其中
是测试的名称,
是一些选项参数,
是服务器的IP地址。
注意事项:
可以是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=
:在端口 上监听或连接到端口(默认为 18515)。-R, --rdma_cm
:使用 rdma_cm 连接 QPs 并在这些 QPs 上运行测试。-z, --com_rdma_cm
:与 rdma_cm 模块通信以交换数据 - 使用常规 QPs。-m, --mtu=
:QP MTU 大小(默认为从 ibv_devinfo 获取的活动 MTU)。-c, --connection=
:连接类型 RC/UC/UD/XRC/DC/SRD(默认为 RC)。-d, --ib-dev=
:使用 IB 设备 (默认为找到的第一个设备)。-i, --ib-port=
:使用 IB 设备的网络端口 (默认为 1)。-s, --size=
:要交换的消息大小(默认为 1)。-a, --all
:从 2 运行到 2^23。-n, --iters=
:交换次数(至少为 100,默认为 1000)。-x, --gid-index=
:测试使用来自命令的 GID 和 GID 索引。-V, --version
:显示版本号。-e, --events
:在 CQ 事件上休眠(默认为轮询)。-F, --CPU-freq
:即使 cpufreq_ondemand 模块失败也不会失败。-I, --inline_size=
:以内联模式发送的最大消息大小。-u, --qp-timeout=
:QP 超时 = (4 uSec)*(2^timeout)(默认为 14)。-S, --sl=
:服务级别(默认为 0)。-r, --rx-depth=
:接收队列深度(默认为 600)。-C, --report-cycles
:以 CPU 周期为单位报告时间。-H, --report-histogram
:打印所有结果(默认:仅摘要结果)。-U, --report-unsorted
:打印未排序的结果(默认已排序)。-b, --bidirectional
:测量双向带宽(默认为单向)。-N, --no peak-bw
:取消峰值带宽计算(默认包括峰值带宽)。-Q, --cq-mod
:在 完成后生成 Cqe。-t, --tx-depth=
:发送队列的大小(默认为 128)。-O, --dualport
:在双端口模式下运行测试(2 QPs)。两个端口都必须处于活动状态(默认关闭)。-D, --duration=
:以秒为单位运行测试的持续时间。-f, --margin=
:在持续时间内测量结果,结果必须在边缘范围内(默认为 2)。-l, --post_list=
:发送 WQEs 的列表大小为 (而不是单个帖子)。--recv_post_list=
:接收 WQEs 的列表大小为 (而不是单个帖子)。-q, --qp=
:进程中运行的 QP 数量(默认为 1)。--run_infinitely
:在用户中断之前一直运行测试,每 5 秒打印一次结果。-r, --rx-depth=
:接收队列的大小(默认为 BW 测试中的 512)。-g, --mcg=
:向附加了 -M, --MGID=
:在多播中,使用 -A, --atomic_type=
:原子操作的类型,可选值为 {CMP_AND_SWAP,FETCH_AND_ADD}。-o, --outs=
:未完成的读/原子请求的数量,也在 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 必须被选中)。