RDMA内核态通信测试krping学习

krping模块是一个内核可加载模块,它实现了客户机/服务器ping/pong程序,这个模块仅仅为了测试内核rdma的API(单边的READ和Write;双边的SEND和RECEIVE)。该模块允许通过一个名为/proc/krping的/proc条目建立连接并运行ping/pong测试。这种简单的机制允许并发地启动多个内核线程,并避免了对用户空间应用程序的需要。
krping的项目链接,目前更新到的内核版本为5.5:
https://github.com/larrystevenwise/krping

krping的主要流程如下图所示:
在这里插入图片描述
主要是以下3步:
1.在开始数据传输前,client会先将ping data写入到事先准备好的start buff中
2. server会主动发起rdma read将ping data从start buff中读取到自己的rdma buff中
3.将buff中的ping data rdma write 到 client的rdma buff中. 至此一次完整的rdma ping-pong数据传输就完成了

工作过程如下图所示:
在这里插入图片描述
结合代码来说:
1.client 通过 send-recv 模式 将 start buf (client会写入原始的ping data) 的地址, 发放给server进行rdma read的rkey, 每次传递给对端的payload大小

static void krping_format_send(struct krping_cb *cb, u64 buf)
{struct krping_rdma_info *info = &cb->send_buf;u32 rkey;if (!cb->server || cb->wlat || cb->rlat || cb->bw) {//发放给server进行rdma read的rkeyrkey = krping_rdma_rkey(cb, buf, !cb->server_invalidate);//start buf (client会写入原始的ping data) 的地址info->buf = htonll(buf);info->rkey = htonl(rkey);//传递给对端的payload大小info->size = htonl(cb->size);DEBUG_LOG("RDMA addr %llx rkey %x len %d\n",(unsigned long long)buf, rkey, cb->size);}
}//post_send
ret = ib_post_send(cb->qp, &cb->sq_wr, &bad_wr);

2.server 在recv操作的completion里, server获取到client传递过来的 start buf的总线地址(DMA分配的) , 还有操作start buf 的rkey, 以及start buf的大小

P("read from recvq\n");
ret = ib_post_recv(cb->qp, &cb->rq_wr, &bad_wr);
if (ret) {printk(KERN_ERR PFX "ib_post_recv failed: %d\n", ret);goto err2;
}krping_cq_event_handler:case IB_WC_RECV:DEBUG_LOG("recv completion\n");cb->stats.recv_bytes += sizeof(cb->recv_buf);cb->stats.recv_msgs++;if (cb->wlat || cb->rlat || cb->bw) {P("call server_recv\n");ret = server_recv(cb, &wc);} else {P("call client recv\n");ret = cb->server ? server_recv(cb, &wc) :client_recv(cb, &wc);}if (ret) {printk(KERN_ERR PFX "recv wc error: %d\n", ret);goto error;}ret = ib_post_recv(cb->qp, &cb->rq_wr, &bad_wr);if (ret) {printk(KERN_ERR PFX "post recv error: %d\n", ret);goto error;}wake_up_interruptible(&cb->sem);break;static int server_recv(struct krping_cb *cb, struct ib_wc *wc)
{if (wc->byte_len != sizeof(cb->recv_buf)) {printk(KERN_ERR PFX "Received bogus data, size %d\n", wc->byte_len);return -1;}cb->remote_rkey = ntohl(cb->recv_buf.rkey);cb->remote_addr = ntohll(cb->recv_buf.buf);cb->remote_len  = ntohl(cb->recv_buf.size);DEBUG_LOG("Received rkey %x addr %llx len %d from peer\n",cb->remote_rkey, (unsigned long long)cb->remote_addr, cb->remote_len);if (cb->state <= CONNECTED || cb->state == RDMA_WRITE_COMPLETE)cb->state = RDMA_READ_ADV;elsecb->state = RDMA_WRITE_ADV;return 0;
}

3.server 构造rdma读请求, 开始从client的start buf中读取ping data

P("setup rdma_sq_wr and reset rkey\n");
cb->rdma_sq_wr.rkey = cb->remote_rkey; //设置rkey
cb->rdma_sq_wr.remote_addr = cb->remote_addr; //设置为client的start buff地址
cb->rdma_sq_wr.wr.sg_list->length = cb->remote_len; //
cb->rdma_sgl.lkey = krping_rdma_rkey(cb, cb->rdma_dma_addr, !cb->read_inv); //设置rdma_sgl的lkey
cb->rdma_sq_wr.wr.next = NULL; /* 发起一个INV Read */
if (cb->read_inv) {P("send read with inv cmd\n");cb->rdma_sq_wr.wr.opcode = IB_WR_RDMA_READ_WITH_INV;
} else {P("send read cmd\n");cb->rdma_sq_wr.wr.opcode = IB_WR_RDMA_READ;//链上一个opcode=local inv类型的WRcb->rdma_sq_wr.wr.next = &inv;memset(&inv, 0, sizeof inv);inv.opcode = IB_WR_LOCAL_INV;inv.ex.invalidate_rkey = cb->reg_mr->rkey;inv.send_flags = IB_SEND_FENCE;
}//post send wr list到qp
ret = ib_post_send(cb->qp, &cb->rdma_sq_wr.wr, &bad_wr);
if (ret) {printk(KERN_ERR PFX "post send error %d\n", ret);break;
}
cb->rdma_sq_wr.wr.next = NULL;wait_event_interruptible(cb->sem, cb->state >= RDMA_READ_COMPLETE);

4.server 收到 rdma read 的WC之后, 就会主动调度等待队列里的进程

case IB_WC_RDMA_READ:DEBUG_LOG("rdma read completion\n");cb->stats.read_bytes += cb->rdma_sq_wr.wr.sg_list->length;cb->stats.read_msgs++;cb->state = RDMA_READ_COMPLETE;wake_up_interruptible(&cb->sem);break;

5.server从client rdma读取到ping data后, 会再次通过send-recv的方式发送一个go-ahead消息给client, 通知阻塞的client继续工作

//等待wc
ret = wait_event_interruptible(cb->sem, cb->state >= RDMA_WRITE_COMPLETE);
if (cb->state != RDMA_WRITE_COMPLETE) {printk(KERN_ERR PFX "wait for RDMA_WRITE_COMPLETE state %d\n",cb->state);break;
}//重置状态为connected
cb->state = CONNECTED;if (cb->server && cb->server_invalidate) {cb->sq_wr.ex.invalidate_rkey = cb->remote_rkey;cb->sq_wr.opcode = IB_WR_SEND_WITH_INV;DEBUG_LOG("send-w-inv rkey 0x%x\n", cb->remote_rkey);
} //post send to qp
ret = ib_post_send(cb->qp, &cb->sq_wr, &bad_wr);
if (ret) {printk(KERN_ERR PFX "post send error %d\n", ret);break;
}
DEBUG_LOG("server posted go ahead\n");

6.client 收到 go-ahead消息的 WC

case IB_WC_RECV:DEBUG_LOG("recv completion\n");cb->stats.recv_bytes += sizeof(cb->recv_buf);cb->stats.recv_msgs++;if (cb->wlat || cb->rlat || cb->bw) {P("call server_recv\n");ret = server_recv(cb, &wc);} else {P("call client recv\n");ret = cb->server ? server_recv(cb, &wc) :client_recv(cb, &wc);}if (ret) {printk(KERN_ERR PFX "recv wc error: %d\n", ret);goto error;}//ret = ib_post_recv(cb->qp, &cb->rq_wr, &bad_wr);if (ret) {printk(KERN_ERR PFX "post recv error: %d\n", ret);goto error;}wake_up_interruptible(&cb->sem);break;static int client_recv(struct krping_cb *cb, struct ib_wc *wc)
{if (wc->byte_len != sizeof(cb->recv_buf)) {printk(KERN_ERR PFX "Received bogus data, size %d\n", wc->byte_len);return -1;}if (cb->state == RDMA_READ_ADV)cb->state = RDMA_WRITE_ADV;elsecb->state = RDMA_WRITE_COMPLETE;return 0;
}

krping的使用方法:

Server:

# modprobe rdma_krping
# echo "server,addr=192.168.69.127,port=9999" >/proc/krping

client:

# modprobe rdma_krping
# echo "client,addr=192.168.69.127,port=9999,count=100" >/proc/krping

参考资料
github上的krping项目:https://github.com/larrystevenwise/krping
其他博客:https://www.cnblogs.com/dennis-wong/p/16954934.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch8 - 基本操作

前言 本文记录 ES 的一些基本操作&#xff0c;就是对官方文档的一些整理&#xff0c;按自己的习惯重新排版&#xff0c;凑合着看。官方的更详细&#xff0c;建议看官方的。 下文以 books 为索引名举例。 新增 添加单个文档 (没有索引会自动创建) POST books/_doc {"n…

服务器总是宕机问题记录

博主介绍&#xff1a; 22届计科专业毕业&#xff0c;来自湖南&#xff0c;主要是在CSDN记录一些自己在Java开发过程中遇到的一些问题&#xff0c;欢迎大家一起讨论学习&#xff0c;也欢迎大家的批评指正。 文章目录 背景调整总结 背景 2核2G的服务器&#xff0c;服务器安装了t…

计算机网络:物理层中的数字传输系统全景概览解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Django之Celery篇(三)

一、任务交给Celery Django任务交给Celery的方法和普通使用Celery任务的调用基本无区别,只是将执行代码的放到到View视图中 而获取结果,往往并不能把结果和第1次请求一起响应,若想获取结果是通过第2次请求获取结果 代码如下: from django.http import HttpResponsefrom …

华为ensp中vrrp虚拟路由器冗余协议 原理及配置命令

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言————— VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议&#xff0…

[数据集][目标检测]高质量铁路轨道缺陷检测数据集VOC+YOLO格式1050张6类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1050 标注数量(xml文件个数)&#xff1a;1050 标注数量(txt文件个数)&#xff1a;1050 标注…

【机器学习】基于变色龙算法优化的BP神经网络分类预测(SSA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】变色龙优化算法&#xff08;CSA)原理及实现 2.设计与实现 数据集&#xff1a; 数据集样本总数2000 多输入多输出&#xff1a;样本特征24&#xff…

集成学习 | 集成学习思想:Boosting思想 | XGBoost算法、LightGBM算法

目录 一. XGBoost 算法1. XGBoost 算法流程2. XGBoost 算法评价 二. LightGBM 算法2. LightGBM 算法优势 上一篇文章中&#xff0c;我们了解了Boosting思想的两种算法&#xff1a;Adboost和GBDT&#xff1b;其中对于GBDT算法&#xff0c;存在两种改进&#xff0c;即&#xff1a…

javaWeb奶茶商城前后台系统

一、简介 在当前数字化时代&#xff0c;电子商务已成为人们生活中不可或缺的一部分。为了满足用户对奶茶的需求&#xff0c;我设计并实现了一个基于JavaWeb的奶茶商城前后台系统。该系统涵盖了用户前台和管理员后台两大模块&#xff0c;包括登录注册、商品展示、购物车管理、订…

【ARXIV2402】MambaIR

这个工作首次将 Mamba 引入到图像修复任务&#xff0c;关于为什么 Mamba 可以用于图像修复&#xff0c;作者有非常详细的解释&#xff1a;一路向北&#xff1a;性能超越SwinIR&#xff01;MambaIR: 基于Mamba的图像复原基准模型 作者认为Mamba可以理解为RNN和CNN的结合&#xf…

【测试开发学习历程】计算机编程语言

前言&#xff1a; 学习完数据库&#xff0c;我们便要进入到编程语言的内容当中了。 这里先对编程语言写出大致的分类&#xff0c; 在这之后&#xff0c;我们会以Python为重点&#xff0c; 开始测试开发为重点的编程语言学习。 目录 1 计算机编程语言的发展 2 语言的分类…

JAVA 学习记录(1)

1.函数 (1)String.join(";", messages); ";" 表示分隔符&#xff0c;输出的结果&#xff1a; message; (2) Double.parseDouble(valueString); 它返回由字符串参数表示的双精度值。 (3) Double.valueOf((Float) value; float 类型的数值转化为double类…

计数组合【2024蓝桥杯0基础】-学习笔记

文章目录 计数原理排列数组合数组合数性质例题分析代码复现 例题2状态分析代码复现 常见的排列组合问题圆排列代码复现 第二类斯特林数 感悟 计数原理 排列数 组合数 组合数性质 例题分析 代码复现 def ksm(a, b, c):ans 1%cwhile b ! 0:if b % 2 0:ans ans * a %ca a * …

java面向对象编程基础

对象&#xff1a; java程序中的对象&#xff1a; 本质上是一种特殊的数据结构 对象是由类new出来的&#xff0c;有了类就可以创建对象 对象在计算机的执行原理&#xff1a; student s1new student();每次new student(),就是在堆内存中开辟一块内存区域代表一个学生对象s1变…

K3 计划订单投放时,将“关联物料”传递到采购和生产订单的“组部件”字段

参考K/3 WISE 中MRP计算投放过程中 销售订单自定义字段怎么携带到任务单这篇文章&#xff0c;进行优化。 在表ICMrpDestBills下增加触发器&#xff0c;代码如下 CREATE TRIGGER [dbo].[ICMrpDestBills_update]ON [dbo].[ICMrpDestBills]AFTER INSERT,UPDATE AS BEGINSET NO…

查询正在运行的Top SQL的脚本(建议收藏)

这篇文章提供了一些现成的SQL脚本&#xff0c;通过查询V$SQLSTATS视图找到正在运行的TOP SQL&#xff0c;用于后续的优化。建议大家收藏&#xff0c;需要查询TOP SQL时直接复制和粘贴即可。 之前的一篇文章解释了为什么要使用V$SQLSTATS视图。 当数据库表现出各种不同的性能问…

javaSwing推箱子游戏

一、简介 策略性游戏可以锻炼人的思维能力还能缓解人的压力&#xff0c;使人们暂时忘却生活当中的烦恼&#xff0c;增强人们的逻辑思维能力&#xff0c;游戏的艺术美也吸引着越来越多的玩家和厂商&#xff0c;寓教于乐&#xff0c;在放松人们心情的同时还可以活跃双手。在人类…

Docker数据卷与网络模式

华子目录 数据卷注意数据卷操作查看镜像&#xff0c;容器&#xff0c;数据卷所占空间 Docker的网络模式查看指定容器的网络模式bridge模式none模式host模式container模式 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;它绕过UFS&#xff0c;可以提供很多有…

Open CASCADE学习|显示文本

目录 1、修改代码 Viewer.h&#xff1a; Viewer.cpp&#xff1a; 2、显示文本 OpenCasCade 你好啊 霜吹花落 1、修改代码 在文章《Open CASCADE学习|显示模型》基础上&#xff0c;增加部分代码&#xff0c;实现对文本显示的支持&#xff0c;具体如下&#xff1a; Viewer…

从数据页的角度看 B+ 树

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 大家背八股文的时候&#xff0c;都知道 MySQL 里 InnoDB 存储引擎是采用 B 树来组织数据的。 这点没错&#xff0c;但是大家知道 B 树里的节点里存放的是什么呢&#xff1f;查询数据的过程又是怎样的&am…