【报错处理】ib_write_bw报错Couldn‘t allocate MR处理办法?为什么root能通非root不通?(ulimit -l; /etc/security/limits.conf`)

快速回忆

ulimit -l  #查看限制是否为unlimited

vim /etc/security/limits.conf #该文件中添加限制参数:对于非root用户:
*                hard    memlock         unlimited
*                soft    memlock         unlimited

现象

在root能够正常执行ib_write_bw,但是在普通用户无法执行。如果是同一台设备client和server报错相同。
报错:
Couldn’t allocate MR
failed to create mr
Failed to create MR
Couldn’t create IB resources
在这里插入图片描述

现象2:
ib_write_bw指定-s小包的时候没问题。
在这里插入图片描述

根因

shell启动命令受限于ulimit,限制了memory lock的最大值数量。ib_write_bw默认启动是65536的size。ulimit默认限制阈值是64KB。由于ib_write_bw在启动前reg mr的过程会pin mem,这里的pin mem就是锁住内存。
解决办法:将内存锁定限制修改为unlimited

实操

查看方式

ulimit -a #查看各种限制
ulimit -l #查看memory lock限制

设置方式

临时设置:ulimit -l 1048576 单位KB,并且这汇总方式无法指定为unlimited
默认设置:vim /etc/security/limits.conf,修改默认值,该文件中添加限制参数:
对于非root用户:

*                hard    memlock         unlimited
*                soft    memlock         unlimited

对于root用户:

root             hard    memlock         unlimited
root             soft    memlock         unlimited

修改后重新启动一个shell,默认创建后就支持

其他

  • 以后遇到Couldn’t allocate MR,可以先设置-s 1 来查看是否可以通。

后记

ulimit是针对每个shell进程的,系统创建shell的时候会根据 /etc/security/limits.conf中来设置默认的限制值。ulimit修改的也是当前shell的。另外要熟悉rdma的mem内存原理,知道锁内存的情况,结合ulimit就打通,从而进行设置和解决无法alloc MR的问题。

在使用 `insmod` 加载 `module_ping_package_count.ko` 模块时提示 `Cannot allocate memory` 错误,常与系统资源不足或模块配置问题有关。以下是可能的原因及解释: 1. **内存不足** 系统可用内存不足会导致内核无法为模块分配所需的内存空间。这种情况可能发生在系统运行大量进程或存在内存泄漏时。内核模块加载过程需要一定量的连续物理内存,若内存碎片化严重或内存总量不足,将导致分配失败[^1]。 2. **模块大小过大** 如果模块本身体积较大,或者模块内部定义了大量符号、结构体,可能导致内核在加载时无法找到足够大的连续内存块。这种情况尤其常见于调试版本的模块或包含大量调试信息的模块[^1]。 3. **内核内存限制** Linux 内核对可分配的内存大小有一定的限制,尤其是对于某些特定的内存分配请求(如 `GFP_KERNEL` 标志)。如果模块请求的内存超过当前允许的范围,也会导致分配失败。可以过调整内核参数或优化模块设计来缓解此类问题[^1]。 4. **符号表或依赖项过多** 模块的符号表如果过于庞大,或者模块依赖的其他模块尚未加载,也可能导致内存分配失败。模块加载器需要为模块及其依赖项建立符号解析表,若依赖关系复杂或符号数量过多,会增加内存负担[^1]。 5. **硬件驱动或固件问题** 如果模块依赖于特定硬件驱动或固件(如网卡驱动),而相关驱动未正确加载或存在兼容性问题,也可能导致内存分配失败。例如,某些驱动可能在初始化阶段尝试分配硬件相关的内存资源,若失败则会连锁影响模块加载[^2]。 6. **内核版本不兼容** 如果模块是为不同版本的内核编译的,可能存在结构体布局或内存管理机制的差异,导致加载时无法正确分配内存。确保模块与当前运行的内核版本兼容是解决此类问题的关键[^1]。 7. **系统调用限制或安全策略** 某些系统可能启用了安全模块(如 SELinux 或 AppArmor),限制了模块加载时的内存分配行为。此外,系统调用的权限设置不当也可能导致 `insmod` 无法正常分配内存[^1]。 ### 示例:检查模块依赖关系 ```bash modinfo module_ping_package_count.ko ``` ### 示例:查看系统内存使用情况 ```bash free -h ``` ### 示例:查看内核日志以获取更多错误信息 ```bash dmesg | grep -i module ``` 过上述方法可以进一步诊断具体原因。如果问题仍然存在,建议检查模块源代码中的内存分配逻辑,确保没有不必要的内存消耗或资源泄漏。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值