roce是网卡的一部分

roce分为软件实现的roce和硬件实现的roce,硬件roce就是在普通网卡中添加一个模块,其中pf和vf 都可以使用roce
由于roce是网卡的一部分,因此roce在初始化的时候是包含在网卡初始化中的过程中,例如下面这个roce就会注册
自己的初始化函数到网卡驱动中
static const struct hnae3_client_ops hns_roce_hw_v2_ops = {
	.init_instance = hns_roce_hw_v2_init_instance,
	.uninit_instance = hns_roce_hw_v2_uninit_instance,
};

static struct hnae3_client hns_roce_hw_v2_client = {
	.name = "hns_roce_hw_v2",
	.type = HNAE3_CLIENT_ROCE,
	.ops = &hns_roce_hw_v2_ops,
};

static int __init hns_roce_hw_v2_init(void)
{
	return hnae3_register_client(&hns_roce_hw_v2_client);
}
执行hnae3_register_client 后,就把roce的初始化函数添加到网卡驱动中
int hnae3_register_client(struct hnae3_client *client)
{
	struct hnae3_client *client_tmp;
	struct hnae3_ae_dev *ae_dev;
	int ret = 0;

	mutex_lock(&hnae3_common_lock);
	/* one system should only have one client for every type */
#检查一下roce是否已经加入到网口的初始化列表中,如果已经加入了,则不能重复加载,直接退出
	list_for_each_entry(client_tmp, &hnae3_client_list, node) {
		if (client_tmp->type == client->type)
			goto exit;
	}
#把client加到入到网卡中
	list_add_tail(&client->node, &hnae3_client_list);
#为网卡的每个口都添加roce的client
	/* initialize the client on every matched port */
	list_for_each_entry(ae_dev, &hnae3_ae_dev_list, node) {
		/* if the client could not be initialized on current port, for
		 * any error reasons, move on to next available port
		 */
		ret = hnae3_match_n_instantiate(client, ae_dev, true);
		if (ret)
			dev_err(&ae_dev->pdev->dev,
				"match 

}
将roce添加到网卡驱动中后,就会调用ib_register_device来注册roce驱动
这个函数第一个参数是要注册的device,一般在注册之前会将这个device 结构体的成员变量填充好。
int ib_register_device(struct ib_device *device,
		       int (*port_callback)(struct ib_device *,
					    u8, struct kobject *))
{
	int ret;
	struct ib_client *client;
	struct ib_udata uhw = {.outlen = 0, .inlen = 0};
	struct device *parent = device->dev.parent;

	WARN_ON_ONCE(device->dma_device);
#看这个设备是否提供dma操作的函数,这里dma操作分为一致性dma和流式dma
	if (device->dev.dma_ops) {
		/*
		 * The caller provided custom DMA operations. Copy the
		 * DMA-related fields that are used by e.g. dma_alloc_coherent()
		 * into device->dev.
		 */
		device->dma_device = &device->dev;
		if (!device->dev.dma_mask) {
			if (parent)
				device->dev.dma_mask = parent->dma_mask;
			else
				WARN_ON_ONCE(true);
		}
		mutex_lock(&device_mutex);
#ib 设备申请name
	if (strchr(device->name, '%')) {
		ret = alloc_name(device->name);
		if (ret)
			goto out;
	}
#检查device是否提供基础的roce功能
	if (ib_device_check_mandatory(device)) {
		ret = -EINVAL;
		goto out;
	}
#读取port和key
	ret = read_port_immutable(device);
	if (ret) {
		pr_warn("Couldn't create per port immutable data %s\n",
			device->name);
		goto out;
	}

	ret = setup_port_pkey_list(device);
	if (ret) {
		pr_warn("Couldn't create per port_pkey_list\n");
		goto out;
	}
#为ib设备建立cache
	ret = ib_cache_setup_one(device);
	if (ret) {
		pr_warn("Couldn't set up InfiniBand P_Key/GID cache\n");
		goto port_cleanup;
	}
#注册cgroup
	ret = ib_device_register_rdmacg(device);
	if (ret) {
		pr_warn("Couldn't register device with rdma cgroup\n");
		goto cache_cleanup;
	}
#查询设备的hw和attrs信息
	memset(&device->attrs, 0, sizeof(device->attrs));
	ret = device->query_device(device, &device->attrs, &uhw);
	if (ret) {
		pr_warn("Couldn't query the device attributes\n");
		goto cg_cleanup;
	}
#注册sysfs信息
	ret = ib_device_register_sysfs(device, port_callback);
	if (ret) {
		pr_warn("Couldn't register device %s with driver model\n",
			device->name);
		goto cg_cleanup;
	}

	device->reg_state = IB_DEV_REGISTERED;
#增加context
	list_for_each_entry(client, &client_list, list)
		if (!add_client_context(device, client) && client->add)
			client->add(device);

	device->index = __dev_new_index();
	down_write(&lists_rwsem);
#所有的roce设备都放在&device_list 中
	list_add_tail(&device->core_list, &device_list);
	up_write(&lists_rwsem);
	mutex_unlock(&device_mutex);
	return 0;

}

 

<think>嗯,用户想了解ROCE端节点的配置或相关问题。首先,我需要回忆一下ROCE的基本概念。ROCE全称是RDMA over Converged Ethernet,允许通过以太网进行远程直接内存访问,这对于低延迟高吞吐量的应用很重要。用户可能是在部署或优化数据中心网络时遇到了问题,需要配置端节点或者解决常见问题。 接下来,我应该考虑ROCE的两种版本,v1v2。v1是基于以太网链路层的,而v2支持IP层,可以在三层网络中使用。配置端节点时,需要确认网卡是否支持ROCE,并且启用RDMA功能。例如,在Linux系统中,可以使用mlx5驱动相应的固件。同时,确保固件驱动版本兼容,这是常见的问题点。 然后是网络配置方面,QoS设置很关键,尤其是PFC(优先级流量控制)ECN(显式拥塞通知)。正确的优先级映射能避免拥塞,保证ROCE流量优先传输。用户可能需要配置DSCP标记,确保交换机端口信任这些标记,并配置相应的队列。此外,MTU大小也需要调整,因为RoCEv2使用更大的帧,通常设为9000字节的巨帧。 问题排查部分,常见的丢包或延迟过高可能由网络拥塞、配置错误或硬件不支持引起。需要检查PFC是否启用,ECN配置是否正确,以及路径MTU是否一致。另外,NIC固件过旧或驱动问题也会导致性能下降,所以保持更新很重要。 用户提供的引用中提到了RoCE QoS配置Overlay网络的设置,这可能涉及到VXLAN封装流量分类。需要确保在Overlay网络中,ROCE流量得到正确优先处理,可能需要在主机交换机上设置合适的流量规则,比如使用tc过滤器。同时,验证配置是否生效,可以通过生成ROCEv2流量并监控性能指标。 最后,用户可能需要了解如何验证配置是否正确,比如使用perftest工具测试延迟吞吐量,或者使用ethtool检查网卡状态。生成相关问题的时候,应该涵盖配置步骤、常见问题、性能优化验证方法等方面,帮助用户全面理解ROCE端节点的配置故障排除。</think>### ROCE端节点配置及常见问题 #### 一、ROCE端节点基础配置 1. **硬件要求** - 网卡需支持RDMA功能(如Mellanox ConnectX系列)并启用RoCE模式 - 操作系统安装`libibverbs`、`librdmacm`等RDMA库 - 验证命令:`ibv_devinfo`查看网卡RDMA能力[^1] 2. **协议栈配置** ```bash # 启用RDMA服务 systemctl start rdma # 设置MTU(推荐9000字节) ip link set dev eth0 mtu 9000 # 配置RoCEv2优先级映射 cma_roce_mode -d mlx5_0 -p 3 -m 2 ``` #### 二、关键配置参数 $$ \text{Throughput} = \frac{\text{Window Size}}{\text{RTT}} \times \sqrt{\text{Loss Rate}} $$ - **DSCP标记**:为RoCE流量分配独立优先级(通常DSCP 48) - **流控制**:启用PFC(Priority Flow Control)避免拥塞丢包[^2] - **ECN配置**:通过`sysctl -w net.ipv4.tcp_ecn=1`开启显式拥塞通知 #### 三、常见问题排查 | 现象 | 检测方法 | 解决方案 | |------|----------|----------| | 高延迟 | `perftest`测试 | 检查PFC配置MTU一致性 | | 连接失败 | `ibping`测试 | 验证子网管理器(opensm)状态 | | 吞吐量低 | `ethtool -S` | 更新NIC固件驱动 | #### 四、高级配置示例 ```python # Python ROCE示例(使用pyverbs库) import pyverbs.cm_enums as ce ctx = pyverbs.Context(name='mlx5_0') pd = pyverbs.PD(ctx) cq = pyverbs.CQ(ctx, cqe=100) qp = pyverbs.QP(pd, ce.IBV_QPT_UD, cq) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值