☰
060、RDMA编程进阶:共享接收队列(SRQ)
2026/10/15 6:34:35 网站建设 项目流程

一、从一次诡异的丢包说起

去年做分布式存储项目,集群跑着跑着突然出现间歇性连接断开。排查了三天,网卡固件、交换机流控、驱动版本全查了一遍,最后发现是QP数量爆炸导致内存碎片化,接收缓冲区分配失败。当时每个连接都独立创建接收队列,128个节点互相建连,光QP就开了上万个,每个QP的接收WQE(工作队列元素)预分配了64个,结果内存碎片把内核搞崩了。

这个坑让我彻底意识到:在高密度连接场景下,每个QP独立维护接收队列是种奢侈。SRQ(Shared Receive Queue)就是用来解决这个问题的——让多个QP共享同一组接收缓冲区,内存占用直接降一个数量级。

二、SRQ到底省在哪

先看传统做法:每个QP创建时都要分配接收WQE和对应的缓冲区。假设你有1000个QP,每个QP预分配128个接收WQE,每个WQE关联4KB缓冲区,光接收侧就要吃掉1000×128×4KB=512MB内存。而且这些缓冲区大部分时间都在空转——连接空闲时,预分配的WQE就是浪费。

SRQ的思路很简单:所有QP共用一组接收WQE。你只需要创建1个SRQ,分配比如4096个WQE,然后把这1000个QP都关联到这个SRQ上。内存从512MB降到16MB,节省了97%。更关键的是,接收缓冲区利用率大幅提升——某个QP突发流量时,可以借用其他QP空闲的WQE,不会因为单个QP的WQE耗尽而丢包。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询