{"id":123444,"date":"2026-11-07T08:25:19","date_gmt":"2026-11-07T00:25:19","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/123444.html"},"modified":"2026-11-07T08:25:19","modified_gmt":"2026-11-07T00:25:19","slug":"minio%e6%ba%90%e7%a0%81%e6%b7%b1%e5%ba%a6%e8%a7%a3%e8%af%bb-%e7%ac%ac11%e7%ab%a0%e7%ac%ac2%e8%8a%82-rdma-%e4%bc%a0%e8%be%93%e5%b1%82%e5%ae%9e%e7%8e%b0-rdma-%e8%bf%9e%e6%8e%a5%e7%ae%a1%e7%90%86","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/123444.html","title":{"rendered":"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb-\u7b2c11\u7ae0\u7b2c2\u8282-RDMA-\u4f20\u8f93\u5c42\u5b9e\u73b0-RDMA-\u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261107002517-6aee6fedd86a0.png\" alt=\"\u5c01\u9762\u56fe\u7247\" \/><\/p>\n<h2>MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb &#8211; \u7b2c11\u7ae0\u7b2c2\u8282&#xff1a;RDMA \u4f20\u8f93\u5c42\u5b9e\u73b0\u2014\u2014RDMA \u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801\u5206\u6790<\/h2>\n<p>\u672c\u6587\u6df1\u5165\u5206\u6790 rdma-transport.go \u4e2d RDMA \u4f20\u8f93\u5c42\u7684\u5b8c\u6574\u5b9e\u73b0&#xff0c;\u5305\u62ec\u8fde\u63a5\u7ba1\u7406\u3001\u6570\u636e\u4f20\u8f93\u548c\u9519\u8bef\u5904\u7406\u3002<\/p>\n<h3>\u672c\u6587\u5bfc\u822a<\/h3>\n<ul>\n<li>\u8fde\u63a5\u7ba1\u7406\u67b6\u6784<\/li>\n<li>\u8fde\u63a5\u521b\u5efa\u6d41\u7a0b<\/li>\n<li>\u6570\u636e\u4f20\u8f93\u5b9e\u73b0<\/li>\n<li>\u5185\u5b58\u6ce8\u518c\u4e0e\u7f13\u5b58<\/li>\n<li>\u9519\u8bef\u5904\u7406\u4e0e\u6062\u590d<\/li>\n<li>\u6027\u80fd\u76d1\u63a7<\/li>\n<\/ul>\n<hr \/>\n<h3>\u8fde\u63a5\u7ba1\u7406\u67b6\u6784<\/h3>\n<h4>\u8fde\u63a5\u7ba1\u7406\u6838\u5fc3\u63a5\u53e3<\/h4>\n<p><span class=\"token comment\">\/\/ cmd\/rdma-transport.go<\/span><\/p>\n<p><span class=\"token comment\">\/\/ RDMA \u8fde\u63a5\u63a5\u53e3<\/span><br \/>\n<span class=\"token keyword\">type<\/span> RDMAConnection <span class=\"token keyword\">interface<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8fde\u63a5\u72b6\u6001<\/span><br \/>\n    <span class=\"token function\">IsConnected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">bool<\/span><br \/>\n    <span class=\"token function\">GetState<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> ConnectionState<\/p>\n<p>    <span class=\"token comment\">\/\/ \u6570\u636e\u4f20\u8f93<\/span><br \/>\n    <span class=\"token function\">Send<\/span><span class=\"token punctuation\">(<\/span>data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span><br \/>\n    <span class=\"token function\">Recv<\/span><span class=\"token punctuation\">(<\/span>buffer <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token function\">Write<\/span><span class=\"token punctuation\">(<\/span>key <span class=\"token builtin\">uint64<\/span><span class=\"token punctuation\">,<\/span> offset <span class=\"token builtin\">int64<\/span><span class=\"token punctuation\">,<\/span> size <span class=\"token builtin\">int64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span><br \/>\n    <span class=\"token function\">Read<\/span><span class=\"token punctuation\">(<\/span>key <span class=\"token builtin\">uint64<\/span><span class=\"token punctuation\">,<\/span> buffer <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> size <span class=\"token builtin\">int64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5f02\u6b65\u64cd\u4f5c<\/span><br \/>\n    <span class=\"token function\">AsyncSend<\/span><span class=\"token punctuation\">(<\/span>data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>SendRequest<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token function\">AsyncRecv<\/span><span class=\"token punctuation\">(<\/span>buffer <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>RecvRequest<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5b8c\u6210\u7b49\u5f85<\/span><br \/>\n    <span class=\"token function\">Wait<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;-<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5173\u95ed\u8fde\u63a5<\/span><br \/>\n    <span class=\"token function\">Close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8fde\u63a5\u72b6\u6001<\/span><br \/>\n<span class=\"token keyword\">type<\/span> ConnectionState <span class=\"token builtin\">int<\/span><\/p>\n<p><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    ConnectionStateIdle ConnectionState <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">iota<\/span><br \/>\n    ConnectionStateConnecting<br \/>\n    ConnectionStateActive<br \/>\n    ConnectionStateClosing<br \/>\n    ConnectionStateError<br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ RDMA \u4f20\u8f93\u5c42\u5b9e\u73b0<\/span><br \/>\n<span class=\"token keyword\">type<\/span> RDMATransport <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8bbe\u5907\u4e0a\u4e0b\u6587<\/span><br \/>\n    ctx <span class=\"token operator\">*<\/span>ibv_context<\/p>\n<p>    <span class=\"token comment\">\/\/ \u7aef\u53e3\u4fe1\u606f<\/span><br \/>\n    port <span class=\"token builtin\">int<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ QP \u8868<\/span><br \/>\n    qpTable <span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">string<\/span><span class=\"token punctuation\">]<\/span>QPTable<\/p>\n<p>    <span class=\"token comment\">\/\/ \u8fde\u63a5\u8868<\/span><br \/>\n    connections <span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">string<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">*<\/span>RDMAConnection<\/p>\n<p>    <span class=\"token comment\">\/\/ \u5185\u5b58\u6c60<\/span><br \/>\n    memoryPool <span class=\"token operator\">*<\/span>MemoryPool<\/p>\n<p>    <span class=\"token comment\">\/\/ CQ (Completion Queue)<\/span><br \/>\n    cq ibv_cq<\/p>\n<p>    <span class=\"token comment\">\/\/ \u7edf\u8ba1\u4fe1\u606f<\/span><br \/>\n    stats RDMAStats<\/p>\n<p>    <span class=\"token comment\">\/\/ \u9501<\/span><br \/>\n    mu sync<span class=\"token punctuation\">.<\/span>RWMutex<\/p>\n<p>    <span class=\"token comment\">\/\/ \u505c\u6b62\u901a\u9053<\/span><br \/>\n    stopCh <span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ QP \u8868&#xff08;Queue Pair \u8868&#xff09;<\/span><br \/>\n<span class=\"token keyword\">type<\/span> QPTable <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u672c\u5730 QP<\/span><br \/>\n    local <span class=\"token operator\">*<\/span>ibv_qp<\/p>\n<p>    <span class=\"token comment\">\/\/ \u8fdc\u7a0b QP<\/span><br \/>\n    remote <span class=\"token operator\">*<\/span>ibv_qp<\/p>\n<p>    <span class=\"token comment\">\/\/ \u53d1\u9001\u961f\u5217<\/span><br \/>\n    sendQ <span class=\"token keyword\">chan<\/span> <span class=\"token operator\">*<\/span>SendRequest<\/p>\n<p>    <span class=\"token comment\">\/\/ \u63a5\u6536\u961f\u5217<\/span><br \/>\n    recvQ <span class=\"token keyword\">chan<\/span> <span class=\"token operator\">*<\/span>RecvRequest<\/p>\n<p>    <span class=\"token comment\">\/\/ \u5b8c\u6210\u961f\u5217<\/span><br \/>\n    cq ibv_cq<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u8fde\u63a5\u7ba1\u7406\u5668<\/h4>\n<p><span class=\"token comment\">\/\/ cmd\/rdma-transport.go<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8fde\u63a5\u7ba1\u7406\u5668<\/span><br \/>\n<span class=\"token keyword\">type<\/span> ConnectionManager <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6d3b\u8dc3\u8fde\u63a5\u6c60<\/span><br \/>\n    activeConnections <span class=\"token operator\">*<\/span>ConnectionPool<\/p>\n<p>    <span class=\"token comment\">\/\/ \u7a7a\u95f2\u8fde\u63a5\u6c60<\/span><br \/>\n    idleConnections <span class=\"token operator\">*<\/span>ConnectionPool<\/p>\n<p>    <span class=\"token comment\">\/\/ \u6700\u5927\u8fde\u63a5\u6570<\/span><br \/>\n    maxConnections <span class=\"token builtin\">int<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8fde\u63a5\u8d85\u65f6<\/span><br \/>\n    timeout time<span class=\"token punctuation\">.<\/span>Duration<\/p>\n<p>    <span class=\"token comment\">\/\/ \u9501<\/span><br \/>\n    mu sync<span class=\"token punctuation\">.<\/span>RWMutex<\/p>\n<p>    <span class=\"token comment\">\/\/ \u7edf\u8ba1<\/span><br \/>\n    stats ConnectionStats<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521b\u5efa\u8fde\u63a5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>cm <span class=\"token operator\">*<\/span>ConnectionManager<span class=\"token punctuation\">)<\/span> <span class=\"token function\">CreateConnection<\/span><span class=\"token punctuation\">(<\/span>endpoint <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u68c0\u67e5\u6700\u5927\u8fde\u63a5\u6570<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> cm<span class=\"token punctuation\">.<\/span>activeConnections<span class=\"token punctuation\">.<\/span><span class=\"token function\">Size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> cm<span class=\"token punctuation\">.<\/span>maxConnections <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> errMaxConnectionsExceeded<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u89e3\u6790\u7aef\u70b9<\/span><br \/>\n    host<span class=\"token punctuation\">,<\/span> port<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">parseEndpoint<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u521b\u5efa RDMA \u8bbe\u5907\u4e0a\u4e0b\u6587<\/span><br \/>\n    ctx<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">createRDMAContext<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 4. \u67e5\u627e\u76ee\u6807 IP<\/span><br \/>\n    addr<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> net<span class=\"token punctuation\">.<\/span><span class=\"token function\">ResolveIPAddr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;ipv4&#034;<\/span><span class=\"token punctuation\">,<\/span> host<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 5. \u521b\u5efa QP (Queue Pair)<\/span><br \/>\n    qp<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">createQueuePair<\/span><span class=\"token punctuation\">(<\/span>ctx<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 6. \u521d\u59cb\u5316 QP \u72b6\u6001<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">initializeQP<\/span><span class=\"token punctuation\">(<\/span>qp<span class=\"token punctuation\">,<\/span> addr<span class=\"token punctuation\">,<\/span> port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 7. \u521b\u5efa\u8fde\u63a5\u5bf9\u8c61<\/span><br \/>\n    conn <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>RDMAConnection<span class=\"token punctuation\">{<\/span><br \/>\n        ctx<span class=\"token punctuation\">:<\/span>   ctx<span class=\"token punctuation\">,<\/span><br \/>\n        qp<span class=\"token punctuation\">:<\/span>    qp<span class=\"token punctuation\">,<\/span><br \/>\n        addr<span class=\"token punctuation\">:<\/span>  addr<span class=\"token punctuation\">,<\/span><br \/>\n        port<span class=\"token punctuation\">:<\/span>  port<span class=\"token punctuation\">,<\/span><br \/>\n        state<span class=\"token punctuation\">:<\/span> ConnectionStateConnecting<span class=\"token punctuation\">,<\/span><br \/>\n        sendQ<span class=\"token punctuation\">:<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token operator\">*<\/span>SendRequest<span class=\"token punctuation\">,<\/span> <span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        recvQ<span class=\"token punctuation\">:<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token operator\">*<\/span>RecvRequest<span class=\"token punctuation\">,<\/span> <span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        done<span class=\"token punctuation\">:<\/span>  <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 8. \u6dfb\u52a0\u5230\u6d3b\u8dc3\u8fde\u63a5\u6c60<\/span><br \/>\n    cm<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    cm<span class=\"token punctuation\">.<\/span>activeConnections<span class=\"token punctuation\">.<\/span><span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">,<\/span> conn<span class=\"token punctuation\">)<\/span><br \/>\n    cm<span class=\"token punctuation\">.<\/span>stats<span class=\"token punctuation\">.<\/span>TotalConnections<span class=\"token operator\">&#043;&#043;<\/span><br \/>\n    cm<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 9. \u542f\u52a8\u5f02\u6b65\u6536\u53d1<\/span><br \/>\n    <span class=\"token keyword\">go<\/span> cm<span class=\"token punctuation\">.<\/span><span class=\"token function\">asyncSendLoop<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">go<\/span> cm<span class=\"token punctuation\">.<\/span><span class=\"token function\">asyncRecvLoop<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> conn<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u8fde\u63a5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>cm <span class=\"token operator\">*<\/span>ConnectionManager<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetConnection<\/span><span class=\"token punctuation\">(<\/span>endpoint <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    cm<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">RLock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">defer<\/span> cm<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">RUnlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 1. \u4ece\u6d3b\u8dc3\u8fde\u63a5\u67e5\u627e<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> conn<span class=\"token punctuation\">,<\/span> ok <span class=\"token operator\">:&#061;<\/span> cm<span class=\"token punctuation\">.<\/span>activeConnections<span class=\"token punctuation\">.<\/span><span class=\"token function\">Get<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> ok <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">IsConnected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> conn<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u4ece\u7a7a\u95f2\u8fde\u63a5\u67e5\u627e<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> conn<span class=\"token punctuation\">,<\/span> ok <span class=\"token operator\">:&#061;<\/span> cm<span class=\"token punctuation\">.<\/span>idleConnections<span class=\"token punctuation\">.<\/span><span class=\"token function\">Get<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> ok <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">IsConnected<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            cm<span class=\"token punctuation\">.<\/span>activeConnections<span class=\"token punctuation\">.<\/span><span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">,<\/span> conn<span class=\"token punctuation\">)<\/span><br \/>\n            cm<span class=\"token punctuation\">.<\/span>idleConnections<span class=\"token punctuation\">.<\/span><span class=\"token function\">Remove<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> conn<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">true<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u8fde\u63a5\u4e0d\u5b58\u5728\u6216\u5df2\u65ad\u5f00<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">false<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5173\u95ed\u8fde\u63a5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>cm <span class=\"token operator\">*<\/span>ConnectionManager<span class=\"token punctuation\">)<\/span> <span class=\"token function\">CloseConnection<\/span><span class=\"token punctuation\">(<\/span>endpoint <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    cm<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">defer<\/span> cm<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    conn<span class=\"token punctuation\">,<\/span> ok <span class=\"token operator\">:&#061;<\/span> cm<span class=\"token punctuation\">.<\/span>activeConnections<span class=\"token punctuation\">.<\/span><span class=\"token function\">Get<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token operator\">!<\/span>ok <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> errConnectionNotFound<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 1. \u505c\u6b62\u5f02\u6b65\u5faa\u73af<\/span><br \/>\n    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u5173\u95ed QP<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>qp<span class=\"token punctuation\">.<\/span><span class=\"token function\">Close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u79fb\u52a8\u5230\u7a7a\u95f2\u6c60\u6216\u9500\u6bc1<\/span><br \/>\n    conn<span class=\"token punctuation\">.<\/span>state <span class=\"token operator\">&#061;<\/span> ConnectionStateIdle<br \/>\n    cm<span class=\"token punctuation\">.<\/span>idleConnections<span class=\"token punctuation\">.<\/span><span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">,<\/span> conn<span class=\"token punctuation\">)<\/span><br \/>\n    cm<span class=\"token punctuation\">.<\/span>stats<span class=\"token punctuation\">.<\/span>TotalConnections<span class=\"token operator\">&#8212;<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>\u8fde\u63a5\u521b\u5efa\u6d41\u7a0b<\/h3>\n<h4>\u5b8c\u6574\u8fde\u63a5\u521b\u5efa\u6d41\u7a0b<\/h4>\n<p><span class=\"token comment\">\/\/ cmd\/rdma-transport.go<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5b8c\u6574\u8fde\u63a5\u521b\u5efa\u6d41\u7a0b<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">*<\/span>RDMATransport<span class=\"token punctuation\">)<\/span> <span class=\"token function\">connectToEndpoint<\/span><span class=\"token punctuation\">(<\/span>endpoint <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u89e3\u6790\u7aef\u70b9<\/span><br \/>\n    host<span class=\"token punctuation\">,<\/span> port<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">parseEndpoint<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u521b\u5efa RDMA \u8bbe\u5907\u4e0a\u4e0b\u6587<\/span><br \/>\n    dev<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> t<span class=\"token punctuation\">.<\/span><span class=\"token function\">findRDAMDevice<\/span><span class=\"token punctuation\">(<\/span>host<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u6253\u5f00\u8bbe\u5907<\/span><br \/>\n    ctx<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> dev<span class=\"token punctuation\">.<\/span><span class=\"token function\">Open<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    t<span class=\"token punctuation\">.<\/span>ctx <span class=\"token operator\">&#061;<\/span> ctx<\/p>\n<p>    <span class=\"token comment\">\/\/ 4. \u83b7\u53d6\u7aef\u53e3\u4fe1\u606f<\/span><br \/>\n    portAttr<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetPortAttr<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 5. \u521b\u5efa Protection Domain<\/span><br \/>\n    pd<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">CreateProtectionDomain<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 6. \u521b\u5efa Completion Queue<\/span><br \/>\n    cq<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">CreateCompletionQueue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    t<span class=\"token punctuation\">.<\/span>cq <span class=\"token operator\">&#061;<\/span> cq<\/p>\n<p>    <span class=\"token comment\">\/\/ 7. \u521b\u5efa Queue Pair (QP)<\/span><br \/>\n    qp<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> pd<span class=\"token punctuation\">.<\/span><span class=\"token function\">CreateQueuePair<\/span><span class=\"token punctuation\">(<\/span>ibvQPT_RC<span class=\"token punctuation\">,<\/span> <span class=\"token number\">128<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">128<\/span><span class=\"token punctuation\">,<\/span> cq<span class=\"token punctuation\">,<\/span> cq<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 8. \u67e5\u8be2 GID (Global Identifier)<\/span><br \/>\n    gid<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetGID<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 9. \u521b\u5efa RD address handle<\/span><br \/>\n    rkey<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> pd<span class=\"token punctuation\">.<\/span><span class=\"token function\">CreateRKey<\/span><span class=\"token punctuation\">(<\/span>qp<span class=\"token punctuation\">,<\/span> ibvAccess_LOCAL_WRITE<span class=\"token operator\">|<\/span><br \/>\n        ibvAccess_REMOTE_WRITE<span class=\"token operator\">|<\/span>ibvAccess_REMOTE_READ<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 10. \u521d\u59cb\u5316 QP \u72b6\u6001<\/span><br \/>\n    qpAttr <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>ibv_qp_attr<span class=\"token punctuation\">{<\/span><br \/>\n        AttrMask<span class=\"token punctuation\">:<\/span> ibvQpAttrPathMtu <span class=\"token operator\">|<\/span> ibvQpAttrRoute <span class=\"token operator\">|<\/span> ibvQpAttrQkey<span class=\"token punctuation\">,<\/span><br \/>\n        PathMtu<span class=\"token punctuation\">:<\/span>  portAttr<span class=\"token punctuation\">.<\/span>ActiveMtu<span class=\"token punctuation\">,<\/span><br \/>\n        Qkey<span class=\"token punctuation\">:<\/span>     <span class=\"token number\">0x00000001<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        Route<span class=\"token punctuation\">:<\/span> <span class=\"token operator\">&amp;<\/span>ibv_route<span class=\"token punctuation\">{<\/span><br \/>\n            Gid<span class=\"token punctuation\">:<\/span>       gid<span class=\"token punctuation\">,<\/span><br \/>\n            Port<span class=\"token punctuation\">:<\/span>      t<span class=\"token punctuation\">.<\/span>port<span class=\"token punctuation\">,<\/span><br \/>\n            DLid<span class=\"token punctuation\">:<\/span>      portAttr<span class=\"token punctuation\">.<\/span>Lid<span class=\"token punctuation\">,<\/span><br \/>\n            SL<span class=\"token punctuation\">:<\/span>        <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            TrafficClass<span class=\"token punctuation\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            HopLimit<span class=\"token punctuation\">:<\/span>  <span class=\"token number\">64<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> qp<span class=\"token punctuation\">.<\/span><span class=\"token function\">ModifyState<\/span><span class=\"token punctuation\">(<\/span>qpAttr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 11. \u8f6c\u6362 QP \u72b6\u6001\u5230 RTR (Ready to Receive)<\/span><br \/>\n    rtrAttr <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>ibv_qp_attr<span class=\"token punctuation\">{<\/span><br \/>\n        State<span class=\"token punctuation\">:<\/span>   ibvStateRTR<span class=\"token punctuation\">,<\/span><br \/>\n        PathMtu<span class=\"token punctuation\">:<\/span> portAttr<span class=\"token punctuation\">.<\/span>ActiveMtu<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> qp<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetAttr<\/span><span class=\"token punctuation\">(<\/span>rtrAttr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 12. \u8f6c\u6362 QP \u72b6\u6001\u5230 RTS (Ready to Send)<\/span><br \/>\n    rtsAttr <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>ibv_qp_attr<span class=\"token punctuation\">{<\/span><br \/>\n        State<span class=\"token punctuation\">:<\/span>  ibvStateRTS<span class=\"token punctuation\">,<\/span><br \/>\n        Timeout<span class=\"token punctuation\">:<\/span> <span class=\"token number\">14<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        RetryCnt<span class=\"token punctuation\">:<\/span> <span class=\"token number\">7<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        RnrRetry<span class=\"token punctuation\">:<\/span> <span class=\"token number\">7<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        SqPsn<span class=\"token punctuation\">:<\/span>   <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> qp<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetAttr<\/span><span class=\"token punctuation\">(<\/span>rtsAttr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 13. \u521b\u5efa\u8fde\u63a5\u5bf9\u8c61<\/span><br \/>\n    conn <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>RDMAConnection<span class=\"token punctuation\">{<\/span><br \/>\n        ctx<span class=\"token punctuation\">:<\/span>  ctx<span class=\"token punctuation\">,<\/span><br \/>\n        qp<span class=\"token punctuation\">:<\/span>   qp<span class=\"token punctuation\">,<\/span><br \/>\n        rkey<span class=\"token punctuation\">:<\/span> rkey<span class=\"token punctuation\">,<\/span><br \/>\n        state<span class=\"token punctuation\">:<\/span> ConnectionStateActive<span class=\"token punctuation\">,<\/span><br \/>\n        sendQ<span class=\"token punctuation\">:<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token operator\">*<\/span>SendRequest<span class=\"token punctuation\">,<\/span> <span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        recvQ<span class=\"token punctuation\">:<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token operator\">*<\/span>RecvRequest<span class=\"token punctuation\">,<\/span> <span class=\"token number\">128<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        done<span class=\"token punctuation\">:<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 14. \u6dfb\u52a0\u5230\u8fde\u63a5\u7ba1\u7406\u5668<\/span><br \/>\n    t<span class=\"token punctuation\">.<\/span>connections<span class=\"token punctuation\">[<\/span>endpoint<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> conn<\/p>\n<p>    <span class=\"token comment\">\/\/ 15. \u542f\u52a8\u5f02\u6b65\u5904\u7406<\/span><br \/>\n    <span class=\"token keyword\">go<\/span> t<span class=\"token punctuation\">.<\/span><span class=\"token function\">processSendQueue<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">go<\/span> t<span class=\"token punctuation\">.<\/span><span class=\"token function\">processRecvQueue<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> conn<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>QP \u72b6\u6001\u8f6c\u6362\u6d41\u7a0b<\/h4>\n<p>  #mermaid-svg-8sb1mjUDJidfnXwY{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8sb1mjUDJidfnXwY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8sb1mjUDJidfnXwY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8sb1mjUDJidfnXwY .error-icon{fill:#552222;}#mermaid-svg-8sb1mjUDJidfnXwY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8sb1mjUDJidfnXwY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8sb1mjUDJidfnXwY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8sb1mjUDJidfnXwY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8sb1mjUDJidfnXwY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8sb1mjUDJidfnXwY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8sb1mjUDJidfnXwY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8sb1mjUDJidfnXwY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8sb1mjUDJidfnXwY .marker.cross{stroke:#333333;}#mermaid-svg-8sb1mjUDJidfnXwY svg{font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8sb1mjUDJidfnXwY p{margin:0;}#mermaid-svg-8sb1mjUDJidfnXwY defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-8sb1mjUDJidfnXwY g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-8sb1mjUDJidfnXwY g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-8sb1mjUDJidfnXwY g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-8sb1mjUDJidfnXwY g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-8sb1mjUDJidfnXwY g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-8sb1mjUDJidfnXwY .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-8sb1mjUDJidfnXwY .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-8sb1mjUDJidfnXwY .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-8sb1mjUDJidfnXwY .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-8sb1mjUDJidfnXwY .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-8sb1mjUDJidfnXwY .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-8sb1mjUDJidfnXwY .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-8sb1mjUDJidfnXwY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8sb1mjUDJidfnXwY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8sb1mjUDJidfnXwY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8sb1mjUDJidfnXwY .edgeLabel .label text{fill:#333;}#mermaid-svg-8sb1mjUDJidfnXwY .label div .edgeLabel{color:#333;}#mermaid-svg-8sb1mjUDJidfnXwY .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-8sb1mjUDJidfnXwY .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-8sb1mjUDJidfnXwY .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-8sb1mjUDJidfnXwY .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-8sb1mjUDJidfnXwY .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-8sb1mjUDJidfnXwY .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8sb1mjUDJidfnXwY .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8sb1mjUDJidfnXwY #statediagram-barbEnd{fill:#333333;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8sb1mjUDJidfnXwY .cluster-label,#mermaid-svg-8sb1mjUDJidfnXwY .nodeLabel{color:#131300;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-8sb1mjUDJidfnXwY .note-edge{stroke-dasharray:5;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-note text{fill:black;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram-note .nodeLabel{color:black;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagram .edgeLabel{color:red;}#mermaid-svg-8sb1mjUDJidfnXwY #dependencyStart,#mermaid-svg-8sb1mjUDJidfnXwY #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-8sb1mjUDJidfnXwY .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8sb1mjUDJidfnXwY :root{&#8211;mermaid-font-family:\\&#8221;trebuchet ms\\&#8221;,verdana,arial,sans-serif;}<\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u521b\u5efa QP<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u8f6c\u6362\u5230 RTR<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u8f6c\u6362\u5230 RTS<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u9519\u8bef<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u5173\u95ed\u8fde\u63a5<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/p>\n<p>\u91cd\u7f6e<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"edgeLabel\"><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>StateINIT<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>StateRTR<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>StateRTS<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>StateERR<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>Ready to Receive\u63a5\u6536\u6570\u636e\u51c6\u5907<\/p>\n<p><\/span><\/p>\n<p>         <span class=\"nodeLabel\"><\/p>\n<p>Ready to Send\u53d1\u9001\u6570\u636e\u51c6\u5907<\/p>\n<p><\/span><\/p>\n<h3>\u6570\u636e\u4f20\u8f93\u5b9e\u73b0<\/h3>\n<h4>Send \u64cd\u4f5c<\/h4>\n<p><span class=\"token comment\">\/\/ cmd\/rdma-transport.go<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Send \u8bf7\u6c42<\/span><br \/>\n<span class=\"token keyword\">type<\/span> SendRequest <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6570\u636e\u7f13\u51b2\u533a<\/span><br \/>\n    data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5185\u5b58\u533a\u57df\u4fe1\u606f<\/span><br \/>\n    rkey <span class=\"token builtin\">uint64<\/span><br \/>\n    lkey <span class=\"token builtin\">uint64<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5b8c\u6210\u56de\u8c03<\/span><br \/>\n    done <span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u9519\u8bef<\/span><br \/>\n    err <span class=\"token builtin\">error<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Send \u6570\u636e<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Send<\/span><span class=\"token punctuation\">(<\/span>data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u68c0\u67e5\u8fde\u63a5\u72b6\u6001<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> conn<span class=\"token punctuation\">.<\/span>state <span class=\"token operator\">!&#061;<\/span> ConnectionStateActive <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> errConnectionNotActive<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u6ce8\u518c\u5185\u5b58<\/span><br \/>\n    mr<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">RegisterMemory<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">defer<\/span> conn<span class=\"token punctuation\">.<\/span>ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">DeregisterMemory<\/span><span class=\"token punctuation\">(<\/span>mr<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u521b\u5efa Send Request<\/span><br \/>\n    req <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>SendRequest<span class=\"token punctuation\">{<\/span><br \/>\n        data<span class=\"token punctuation\">:<\/span> data<span class=\"token punctuation\">,<\/span><br \/>\n        rkey<span class=\"token punctuation\">:<\/span> mr<span class=\"token punctuation\">.<\/span>Key<span class=\"token punctuation\">,<\/span><br \/>\n        lkey<span class=\"token punctuation\">:<\/span> mr<span class=\"token punctuation\">.<\/span>LKey<span class=\"token punctuation\">,<\/span><br \/>\n        done<span class=\"token punctuation\">:<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 4. \u53d1\u9001\u5230\u53d1\u9001\u961f\u5217<\/span><br \/>\n    <span class=\"token keyword\">select<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">case<\/span> conn<span class=\"token punctuation\">.<\/span>sendQ <span class=\"token operator\">&lt;-<\/span> req<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u53d1\u9001\u6210\u529f&#xff0c;\u7b49\u5f85\u5b8c\u6210<\/span><br \/>\n        <span class=\"token operator\">&lt;-<\/span>req<span class=\"token punctuation\">.<\/span>done<br \/>\n        <span class=\"token keyword\">return<\/span> req<span class=\"token punctuation\">.<\/span>err<br \/>\n    <span class=\"token keyword\">case<\/span> <span class=\"token operator\">&lt;-<\/span>conn<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> errConnectionClosed<br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5904\u7406\u53d1\u9001\u961f\u5217<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">*<\/span>RDMATransport<span class=\"token punctuation\">)<\/span> <span class=\"token function\">processSendQueue<\/span><span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> req <span class=\"token operator\">:&#061;<\/span> <span class=\"token keyword\">range<\/span> conn<span class=\"token punctuation\">.<\/span>sendQ <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 1. \u6784\u5efa Work Request<\/span><br \/>\n        wr <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>ibv_send_wr<span class=\"token punctuation\">{<\/span><br \/>\n            Op<span class=\"token punctuation\">:<\/span>     ibvOpSend<span class=\"token punctuation\">,<\/span><br \/>\n            Srqn<span class=\"token punctuation\">:<\/span>   <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            DmaLkey<span class=\"token punctuation\">:<\/span> req<span class=\"token punctuation\">.<\/span>lkey<span class=\"token punctuation\">,<\/span><br \/>\n            DmaRkey<span class=\"token punctuation\">:<\/span> req<span class=\"token punctuation\">.<\/span>rkey<span class=\"token punctuation\">,<\/span><br \/>\n            RemoteAddr<span class=\"token punctuation\">:<\/span> <span class=\"token function\">uint64<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>remoteAddr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            DmaLen<span class=\"token punctuation\">:<\/span>   <span class=\"token function\">uint32<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">len<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            CompFlags<span class=\"token punctuation\">:<\/span> ibvCompFlagSignaled<span class=\"token punctuation\">,<\/span><br \/>\n            Done<span class=\"token punctuation\">:<\/span>    req<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">,<\/span><br \/>\n            Err<span class=\"token punctuation\">:<\/span>     <span class=\"token operator\">&amp;<\/span>req<span class=\"token punctuation\">.<\/span>err<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 2. \u53d1\u9001\u5230 WQ (Work Queue)<\/span><br \/>\n        badWr<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>qp<span class=\"token punctuation\">.<\/span><span class=\"token function\">PostSend<\/span><span class=\"token punctuation\">(<\/span>wr<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            req<span class=\"token punctuation\">.<\/span>err <span class=\"token operator\">&#061;<\/span> err<br \/>\n            <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 3. \u5982\u679c\u6709\u574f\u8bf7\u6c42&#xff0c;\u5904\u7406\u9519\u8bef<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> badWr <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            req<span class=\"token punctuation\">.<\/span>err <span class=\"token operator\">&#061;<\/span> fmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Errorf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;send failed, bad wr&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Recv \u64cd\u4f5c<\/span><br \/>\n<span class=\"token keyword\">type<\/span> RecvRequest <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u63a5\u6536\u7f13\u51b2\u533a<\/span><br \/>\n    buffer <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5185\u5b58\u533a\u57df\u4fe1\u606f<\/span><br \/>\n    lkey <span class=\"token builtin\">uint64<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5b8c\u6210\u56de\u8c03<\/span><br \/>\n    done <span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u63a5\u6536\u5b57\u8282\u6570<\/span><br \/>\n    bytesRead <span class=\"token builtin\">int<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u9519\u8bef<\/span><br \/>\n    err <span class=\"token builtin\">error<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Recv \u6570\u636e<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Recv<\/span><span class=\"token punctuation\">(<\/span>buffer <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u68c0\u67e5\u8fde\u63a5\u72b6\u6001<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> conn<span class=\"token punctuation\">.<\/span>state <span class=\"token operator\">!&#061;<\/span> ConnectionStateActive <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> errConnectionNotActive<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u6ce8\u518c\u5185\u5b58<\/span><br \/>\n    mr<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">RegisterMemory<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">defer<\/span> conn<span class=\"token punctuation\">.<\/span>ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">DeregisterMemory<\/span><span class=\"token punctuation\">(<\/span>mr<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u521b\u5efa Recv Request<\/span><br \/>\n    req <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>RecvRequest<span class=\"token punctuation\">{<\/span><br \/>\n        buffer<span class=\"token punctuation\">:<\/span> buffer<span class=\"token punctuation\">,<\/span><br \/>\n        lkey<span class=\"token punctuation\">:<\/span>   mr<span class=\"token punctuation\">.<\/span>LKey<span class=\"token punctuation\">,<\/span><br \/>\n        done<span class=\"token punctuation\">:<\/span>   <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 4. \u53d1\u9001\u5230\u63a5\u6536\u961f\u5217<\/span><br \/>\n    <span class=\"token keyword\">select<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">case<\/span> conn<span class=\"token punctuation\">.<\/span>recvQ <span class=\"token operator\">&lt;-<\/span> req<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u63a5\u6536\u6210\u529f&#xff0c;\u7b49\u5f85\u5b8c\u6210<\/span><br \/>\n        <span class=\"token operator\">&lt;-<\/span>req<span class=\"token punctuation\">.<\/span>done<br \/>\n        <span class=\"token keyword\">return<\/span> req<span class=\"token punctuation\">.<\/span>bytesRead<span class=\"token punctuation\">,<\/span> req<span class=\"token punctuation\">.<\/span>err<br \/>\n    <span class=\"token keyword\">case<\/span> <span class=\"token operator\">&lt;-<\/span>conn<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> errConnectionClosed<br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5904\u7406\u63a5\u6536\u961f\u5217<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">*<\/span>RDMATransport<span class=\"token punctuation\">)<\/span> <span class=\"token function\">processRecvQueue<\/span><span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> req <span class=\"token operator\">:&#061;<\/span> <span class=\"token keyword\">range<\/span> conn<span class=\"token punctuation\">.<\/span>recvQ <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 1. \u6784\u5efa Receive Work Request<\/span><br \/>\n        wr <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>ibv_recv_wr<span class=\"token punctuation\">{<\/span><br \/>\n            Op<span class=\"token punctuation\">:<\/span>     ibvOpRecv<span class=\"token punctuation\">,<\/span><br \/>\n            Lkey<span class=\"token punctuation\">:<\/span>   req<span class=\"token punctuation\">.<\/span>lkey<span class=\"token punctuation\">,<\/span><br \/>\n            DmaLen<span class=\"token punctuation\">:<\/span> <span class=\"token function\">uint32<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">len<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>buffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            Done<span class=\"token punctuation\">:<\/span>   req<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">,<\/span><br \/>\n            Err<span class=\"token punctuation\">:<\/span>    <span class=\"token operator\">&amp;<\/span>req<span class=\"token punctuation\">.<\/span>err<span class=\"token punctuation\">,<\/span><br \/>\n            BytesRead<span class=\"token punctuation\">:<\/span> <span class=\"token operator\">&amp;<\/span>req<span class=\"token punctuation\">.<\/span>bytesRead<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 2. \u53d1\u9001\u5230 RQ (Receive Queue)<\/span><br \/>\n        badWr<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>qp<span class=\"token punctuation\">.<\/span><span class=\"token function\">PostRecv<\/span><span class=\"token punctuation\">(<\/span>wr<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            req<span class=\"token punctuation\">.<\/span>err <span class=\"token operator\">&#061;<\/span> err<br \/>\n            <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 3. \u5982\u679c\u6709\u574f\u8bf7\u6c42&#xff0c;\u5904\u7406\u9519\u8bef<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> badWr <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            req<span class=\"token punctuation\">.<\/span>err <span class=\"token operator\">&#061;<\/span> fmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Errorf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;recv failed, bad wr&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u5f02\u6b65\u4f20\u8f93\u5b9e\u73b0<\/h4>\n<p><span class=\"token comment\">\/\/ cmd\/rdma-transport.go<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5f02\u6b65\u53d1\u9001<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">AsyncSend<\/span><span class=\"token punctuation\">(<\/span>data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>SendRequest<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u6ce8\u518c\u5185\u5b58<\/span><br \/>\n    mr<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">RegisterMemory<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u521b\u5efa\u8bf7\u6c42<\/span><br \/>\n    req <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>SendRequest<span class=\"token punctuation\">{<\/span><br \/>\n        data<span class=\"token punctuation\">:<\/span> data<span class=\"token punctuation\">,<\/span><br \/>\n        rkey<span class=\"token punctuation\">:<\/span> mr<span class=\"token punctuation\">.<\/span>Key<span class=\"token punctuation\">,<\/span><br \/>\n        lkey<span class=\"token punctuation\">:<\/span> mr<span class=\"token punctuation\">.<\/span>LKey<span class=\"token punctuation\">,<\/span><br \/>\n        done<span class=\"token punctuation\">:<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u53d1\u9001\u5230\u53d1\u9001\u961f\u5217&#xff08;\u975e\u963b\u585e&#xff09;<\/span><br \/>\n    <span class=\"token keyword\">select<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">case<\/span> conn<span class=\"token punctuation\">.<\/span>sendQ <span class=\"token operator\">&lt;-<\/span> req<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> req<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n    <span class=\"token keyword\">case<\/span> <span class=\"token operator\">&lt;-<\/span>conn<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> errConnectionClosed<br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5f02\u6b65\u63a5\u6536<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">AsyncRecv<\/span><span class=\"token punctuation\">(<\/span>buffer <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>RecvRequest<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u6ce8\u518c\u5185\u5b58<\/span><br \/>\n    mr<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>ctx<span class=\"token punctuation\">.<\/span><span class=\"token function\">RegisterMemory<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u521b\u5efa\u8bf7\u6c42<\/span><br \/>\n    req <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>RecvRequest<span class=\"token punctuation\">{<\/span><br \/>\n        buffer<span class=\"token punctuation\">:<\/span> buffer<span class=\"token punctuation\">,<\/span><br \/>\n        lkey<span class=\"token punctuation\">:<\/span>   mr<span class=\"token punctuation\">.<\/span>LKey<span class=\"token punctuation\">,<\/span><br \/>\n        done<span class=\"token punctuation\">:<\/span>   <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u53d1\u9001\u5230\u63a5\u6536\u961f\u5217&#xff08;\u975e\u963b\u585e&#xff09;<\/span><br \/>\n    <span class=\"token keyword\">select<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">case<\/span> conn<span class=\"token punctuation\">.<\/span>recvQ <span class=\"token operator\">&lt;-<\/span> req<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> req<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n    <span class=\"token keyword\">case<\/span> <span class=\"token operator\">&lt;-<\/span>conn<span class=\"token punctuation\">.<\/span>done<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> errConnectionClosed<br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u7b49\u5f85\u5f02\u6b65\u5b8c\u6210<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>req <span class=\"token operator\">*<\/span>SendRequest<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Wait<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token operator\">&lt;-<\/span>req<span class=\"token punctuation\">.<\/span>done<br \/>\n    <span class=\"token keyword\">return<\/span> req<span class=\"token punctuation\">.<\/span>err<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>req <span class=\"token operator\">*<\/span>RecvRequest<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Wait<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token operator\">&lt;-<\/span>req<span class=\"token punctuation\">.<\/span>done<br \/>\n    <span class=\"token keyword\">return<\/span> req<span class=\"token punctuation\">.<\/span>bytesRead<span class=\"token punctuation\">,<\/span> req<span class=\"token punctuation\">.<\/span>err<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>\u5185\u5b58\u6ce8\u518c\u4e0e\u7f13\u5b58<\/h3>\n<h4>\u5185\u5b58\u6c60\u5b9e\u73b0<\/h4>\n<p><span class=\"token comment\">\/\/ cmd\/rdma-memory.go<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5185\u5b58\u6c60<\/span><br \/>\n<span class=\"token keyword\">type<\/span> MemoryPool <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5185\u5b58\u5757\u5217\u8868<\/span><br \/>\n    blocks <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">*<\/span>MemoryBlock<\/p>\n<p>    <span class=\"token comment\">\/\/ \u603b\u5927\u5c0f<\/span><br \/>\n    totalSize <span class=\"token builtin\">int<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5df2\u7528\u5927\u5c0f<\/span><br \/>\n    usedSize <span class=\"token builtin\">int<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u9501<\/span><br \/>\n    mu sync<span class=\"token punctuation\">.<\/span>Mutex<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5185\u5b58\u5757<\/span><br \/>\n<span class=\"token keyword\">type<\/span> MemoryBlock <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5185\u5b58\u5730\u5740<\/span><br \/>\n    addr <span class=\"token builtin\">uintptr<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5927\u5c0f<\/span><br \/>\n    size <span class=\"token builtin\">int<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5185\u5b58\u533a\u57df\u4fe1\u606f<\/span><br \/>\n    region MemoryRegion<\/p>\n<p>    <span class=\"token comment\">\/\/ \u662f\u5426\u53ef\u7528<\/span><br \/>\n    available <span class=\"token builtin\">bool<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5185\u5b58\u533a\u57df<\/span><br \/>\n<span class=\"token keyword\">type<\/span> MemoryRegion <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ LKey (\u672c\u5730\u952e)<\/span><br \/>\n    LKey <span class=\"token builtin\">uint64<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ RKey (\u8fdc\u7a0b\u952e)<\/span><br \/>\n    RKey <span class=\"token builtin\">uint64<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5185\u5b58\u5730\u5740<\/span><br \/>\n    Addr <span class=\"token builtin\">uintptr<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5927\u5c0f<\/span><br \/>\n    Size <span class=\"token builtin\">int64<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521b\u5efa\u5185\u5b58\u6c60<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">NewMemoryPool<\/span><span class=\"token punctuation\">(<\/span>size <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>MemoryPool <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u5bf9\u9f50\u5230\u9875\u5927\u5c0f<\/span><br \/>\n    alignedSize <span class=\"token operator\">:&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>size <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">4095<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">4096<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">4096<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u5206\u914d\u5185\u5b58<\/span><br \/>\n    buf <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> alignedSize<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&amp;<\/span>MemoryPool<span class=\"token punctuation\">{<\/span><br \/>\n        blocks<span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token operator\">*<\/span>MemoryBlock<span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                addr<span class=\"token punctuation\">:<\/span>      <span class=\"token function\">uintptr<\/span><span class=\"token punctuation\">(<\/span>unsafe<span class=\"token punctuation\">.<\/span><span class=\"token function\">Pointer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                size<span class=\"token punctuation\">:<\/span>      alignedSize<span class=\"token punctuation\">,<\/span><br \/>\n                available<span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        totalSize<span class=\"token punctuation\">:<\/span> alignedSize<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6ce8\u518c\u5185\u5b58<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>mp <span class=\"token operator\">*<\/span>MemoryPool<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Register<\/span><span class=\"token punctuation\">(<\/span>addr <span class=\"token builtin\">uintptr<\/span><span class=\"token punctuation\">,<\/span> size <span class=\"token builtin\">int64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span>MemoryRegion<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    mp<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">defer<\/span> mp<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 1. \u67e5\u627e\u53ef\u7528\u5185\u5b58\u5757<\/span><br \/>\n    block <span class=\"token operator\">:&#061;<\/span> mp<span class=\"token punctuation\">.<\/span><span class=\"token function\">findBlock<\/span><span class=\"token punctuation\">(<\/span>addr<span class=\"token punctuation\">,<\/span> size<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> block <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> MemoryRegion<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> errMemoryNotRegistered<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u6ce8\u518c\u5185\u5b58<\/span><br \/>\n    region<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> block<span class=\"token punctuation\">.<\/span>region<span class=\"token punctuation\">.<\/span><span class=\"token function\">Register<\/span><span class=\"token punctuation\">(<\/span>addr<span class=\"token punctuation\">,<\/span> size<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> MemoryRegion<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u6807\u8bb0\u4e3a\u5df2\u7528<\/span><br \/>\n    block<span class=\"token punctuation\">.<\/span>available <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><br \/>\n    mp<span class=\"token punctuation\">.<\/span>usedSize <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>size<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> region<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u53d6\u6d88\u6ce8\u518c\u5185\u5b58<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>mp <span class=\"token operator\">*<\/span>MemoryPool<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Deregister<\/span><span class=\"token punctuation\">(<\/span>region MemoryRegion<span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    mp<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">defer<\/span> mp<span class=\"token punctuation\">.<\/span>mu<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 1. \u67e5\u627e\u5185\u5b58\u5757<\/span><br \/>\n    block <span class=\"token operator\">:&#061;<\/span> mp<span class=\"token punctuation\">.<\/span><span class=\"token function\">findBlockByRegion<\/span><span class=\"token punctuation\">(<\/span>region<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> block <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> errBlockNotFound<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u53d6\u6d88\u6ce8\u518c<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> block<span class=\"token punctuation\">.<\/span>region<span class=\"token punctuation\">.<\/span><span class=\"token function\">Deregister<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> err<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u6807\u8bb0\u4e3a\u53ef\u7528<\/span><br \/>\n    block<span class=\"token punctuation\">.<\/span>available <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><br \/>\n    mp<span class=\"token punctuation\">.<\/span>usedSize <span class=\"token operator\">-&#061;<\/span> <span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>region<span class=\"token punctuation\">.<\/span>Size<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u67e5\u627e\u5185\u5b58\u5757<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>mp <span class=\"token operator\">*<\/span>MemoryPool<span class=\"token punctuation\">)<\/span> <span class=\"token function\">findBlock<\/span><span class=\"token punctuation\">(<\/span>addr <span class=\"token builtin\">uintptr<\/span><span class=\"token punctuation\">,<\/span> size <span class=\"token builtin\">int64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>MemoryBlock <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> block <span class=\"token operator\">:&#061;<\/span> <span class=\"token keyword\">range<\/span> mp<span class=\"token punctuation\">.<\/span>blocks <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> block<span class=\"token punctuation\">.<\/span>available <span class=\"token operator\">&amp;&amp;<\/span><br \/>\n           block<span class=\"token punctuation\">.<\/span>addr <span class=\"token operator\">&lt;&#061;<\/span> addr <span class=\"token operator\">&amp;&amp;<\/span><br \/>\n           <span class=\"token function\">int64<\/span><span class=\"token punctuation\">(<\/span>block<span class=\"token punctuation\">.<\/span>addr<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#043;<\/span><span class=\"token function\">int64<\/span><span class=\"token punctuation\">(<\/span>block<span class=\"token punctuation\">.<\/span>size<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> addr<span class=\"token operator\">&#043;<\/span>size <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> block<br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u67e5\u627e\u5185\u5b58\u5757&#xff08;\u6309\u533a\u57df&#xff09;<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>mp <span class=\"token operator\">*<\/span>MemoryPool<span class=\"token punctuation\">)<\/span> <span class=\"token function\">findBlockByRegion<\/span><span class=\"token punctuation\">(<\/span>region MemoryRegion<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>MemoryBlock <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> block <span class=\"token operator\">:&#061;<\/span> <span class=\"token keyword\">range<\/span> mp<span class=\"token punctuation\">.<\/span>blocks <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> block<span class=\"token punctuation\">.<\/span>region<span class=\"token punctuation\">.<\/span>Addr <span class=\"token operator\">&#061;&#061;<\/span> region<span class=\"token punctuation\">.<\/span>Addr <span class=\"token operator\">&amp;&amp;<\/span><br \/>\n           block<span class=\"token punctuation\">.<\/span>region<span class=\"token punctuation\">.<\/span>LKey <span class=\"token operator\">&#061;&#061;<\/span> region<span class=\"token punctuation\">.<\/span>LKey <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> block<br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>\u9519\u8bef\u5904\u7406\u4e0e\u6062\u590d<\/h3>\n<h4>\u9519\u8bef\u5904\u7406\u673a\u5236<\/h4>\n<p><span class=\"token comment\">\/\/ cmd\/rdma-errors.go<\/span><\/p>\n<p><span class=\"token comment\">\/\/ RDMA \u9519\u8bef\u7c7b\u578b<\/span><br \/>\n<span class=\"token keyword\">type<\/span> RDMAError <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    Code    RDMAErrorCode<br \/>\n    Message <span class=\"token builtin\">string<\/span><br \/>\n    Cause   <span class=\"token builtin\">error<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ RDMA \u9519\u8bef\u7801<\/span><br \/>\n<span class=\"token keyword\">type<\/span> RDMAErrorCode <span class=\"token builtin\">int<\/span><\/p>\n<p><span class=\"token keyword\">const<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n    ErrRDMAUnknown RDMAErrorCode <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">iota<\/span><br \/>\n    ErrRDMAConnectionFailed<br \/>\n    ErrRDMAInvalidEndpoint<br \/>\n    ErrRDMAOutOfMemory<br \/>\n    ErrRDMAMemoryRegistrationFailed<br \/>\n    ErrRDMAQPCreationFailed<br \/>\n    ErrRDMAQueueFull<br \/>\n    ErrRDMACompletionTimeout<br \/>\n    ErrRDMAConnectionClosed<br \/>\n    ErrRDMAInvalidState<br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521b\u5efa RDMA \u9519\u8bef<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">NewRDMAError<\/span><span class=\"token punctuation\">(<\/span>code RDMAErrorCode<span class=\"token punctuation\">,<\/span> message <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">,<\/span> cause <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>RDMAError <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&amp;<\/span>RDMAError<span class=\"token punctuation\">{<\/span><br \/>\n        Code<span class=\"token punctuation\">:<\/span>    code<span class=\"token punctuation\">,<\/span><br \/>\n        Message<span class=\"token punctuation\">:<\/span> message<span class=\"token punctuation\">,<\/span><br \/>\n        Cause<span class=\"token punctuation\">:<\/span>   cause<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u9519\u8bef\u4fe1\u606f<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>e <span class=\"token operator\">*<\/span>RDMAError<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">string<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> e<span class=\"token punctuation\">.<\/span>Cause <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> fmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sprintf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;RDMA error [%d]: %s &#8211; %v&#034;<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">.<\/span>Code<span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">.<\/span>Message<span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">.<\/span>Cause<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> fmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sprintf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;RDMA error [%d]: %s&#034;<\/span><span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">.<\/span>Code<span class=\"token punctuation\">,<\/span> e<span class=\"token punctuation\">.<\/span>Message<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8fde\u63a5\u6062\u590d\u673a\u5236<\/span><br \/>\n<span class=\"token keyword\">type<\/span> ConnectionRecovery <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6700\u5927\u91cd\u8bd5\u6b21\u6570<\/span><br \/>\n    maxRetries <span class=\"token builtin\">int<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u91cd\u8bd5\u95f4\u9694<\/span><br \/>\n    retryInterval time<span class=\"token punctuation\">.<\/span>Duration<\/p>\n<p>    <span class=\"token comment\">\/\/ \u5f53\u524d\u91cd\u8bd5\u6b21\u6570<\/span><br \/>\n    retryCount <span class=\"token builtin\">int<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4e0a\u4e00\u6b21\u6210\u529f\u65f6\u95f4<\/span><br \/>\n    lastSuccess time<span class=\"token punctuation\">.<\/span>Time<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u91cd\u8bd5\u8fde\u63a5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>cr <span class=\"token operator\">*<\/span>ConnectionRecovery<span class=\"token punctuation\">)<\/span> <span class=\"token function\">RetryConnect<\/span><span class=\"token punctuation\">(<\/span>endpoint <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> i <span class=\"token operator\">:&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> cr<span class=\"token punctuation\">.<\/span>maxRetries<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 1. \u5c1d\u8bd5\u8fde\u63a5<\/span><br \/>\n        conn<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> globalRDAManager<span class=\"token punctuation\">.<\/span><span class=\"token function\">Connect<\/span><span class=\"token punctuation\">(<\/span>endpoint<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> err <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ 2. \u8fde\u63a5\u6210\u529f<\/span><br \/>\n            cr<span class=\"token punctuation\">.<\/span>retryCount <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n            cr<span class=\"token punctuation\">.<\/span>lastSuccess <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span><span class=\"token function\">Now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 3. \u7b49\u5f85\u5e76\u91cd\u8bd5<\/span><br \/>\n        time<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sleep<\/span><span class=\"token punctuation\">(<\/span>cr<span class=\"token punctuation\">.<\/span>retryInterval <span class=\"token operator\">*<\/span> time<span class=\"token punctuation\">.<\/span><span class=\"token function\">Duration<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        cr<span class=\"token punctuation\">.<\/span>retryCount<span class=\"token operator\">&#043;&#043;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> errMaxRetriesExceeded<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u68c0\u67e5\u8fde\u63a5\u5065\u5eb7\u72b6\u6001<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>conn <span class=\"token operator\">*<\/span>RDMAConnection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">HealthCheck<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u68c0\u67e5\u8fde\u63a5\u72b6\u6001<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> conn<span class=\"token punctuation\">.<\/span>state <span class=\"token operator\">!&#061;<\/span> ConnectionStateActive <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u68c0\u67e5\u6700\u540e\u6d3b\u52a8\u65f6\u95f4<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> time<span class=\"token punctuation\">.<\/span><span class=\"token function\">Since<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">.<\/span>lastActivity<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">30<\/span><span class=\"token operator\">*<\/span>time<span class=\"token punctuation\">.<\/span>Second <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u68c0\u67e5\u9519\u8bef\u8ba1\u6570<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> conn<span class=\"token punctuation\">.<\/span>errorCount <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">10<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>\u6027\u80fd\u76d1\u63a7<\/h3>\n<h4>\u6027\u80fd\u7edf\u8ba1<\/h4>\n<p><span class=\"token comment\">\/\/ cmd\/rdma-stats.go<\/span><\/p>\n<p><span class=\"token comment\">\/\/ RDMA \u7edf\u8ba1\u4fe1\u606f<\/span><br \/>\n<span class=\"token keyword\">type<\/span> RDMAStats <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u53d1\u9001\u7edf\u8ba1<\/span><br \/>\n    TotalSentBytes   <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;total_sent_bytes&#034;&#096;<\/span><br \/>\n    TotalSentOps     <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;total_sent_ops&#034;&#096;<\/span><br \/>\n    AvgSendLatency   <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;avg_send_latency&#034;&#096;<\/span><br \/>\n    MaxSendLatency   <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;max_send_latency&#034;&#096;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u63a5\u6536\u7edf\u8ba1<\/span><br \/>\n    TotalRecvBytes   <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;total_recv_bytes&#034;&#096;<\/span><br \/>\n    TotalRecvOps     <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;total_recv_ops&#034;&#096;<\/span><br \/>\n    AvgRecvLatency   <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;avg_recv_latency&#034;&#096;<\/span><br \/>\n    MaxRecvLatency   <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;max_recv_latency&#034;&#096;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u9519\u8bef\u7edf\u8ba1<\/span><br \/>\n    TotalErrors      <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;total_errors&#034;&#096;<\/span><br \/>\n    SendErrors       <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;send_errors&#034;&#096;<\/span><br \/>\n    RecvErrors       <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;recv_errors&#034;&#096;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8fde\u63a5\u7edf\u8ba1<\/span><br \/>\n    ActiveConnections <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;active_connections&#034;&#096;<\/span><br \/>\n    TotalConnections  <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;total_connections&#034;&#096;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5185\u5b58\u7edf\u8ba1<\/span><br \/>\n    RegisteredRegions <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;registered_regions&#034;&#096;<\/span><br \/>\n    TotalMemoryBytes  <span class=\"token builtin\">int64<\/span> <span class=\"token string\">&#096;json:&#034;total_memory_bytes&#034;&#096;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u65f6\u95f4\u6233<\/span><br \/>\n    LastUpdate time<span class=\"token punctuation\">.<\/span>Time <span class=\"token string\">&#096;json:&#034;last_update&#034;&#096;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u66f4\u65b0\u7edf\u8ba1<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>RDMAStats<span class=\"token punctuation\">)<\/span> <span class=\"token function\">UpdateSendStats<\/span><span class=\"token punctuation\">(<\/span>bytes <span class=\"token builtin\">int64<\/span><span class=\"token punctuation\">,<\/span> latency <span class=\"token builtin\">int64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    s<span class=\"token punctuation\">.<\/span>TotalSentBytes <span class=\"token operator\">&#043;&#061;<\/span> bytes<br \/>\n    s<span class=\"token punctuation\">.<\/span>TotalSentOps<span class=\"token operator\">&#043;&#043;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u66f4\u65b0\u5e73\u5747\u5ef6\u8fdf<\/span><br \/>\n    totalOps <span class=\"token operator\">:&#061;<\/span> s<span class=\"token punctuation\">.<\/span>TotalSentOps<br \/>\n    s<span class=\"token punctuation\">.<\/span>AvgSendLatency <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">.<\/span>AvgSendLatency<span class=\"token operator\">*<\/span><span class=\"token punctuation\">(<\/span>totalOps<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> latency<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> totalOps<\/p>\n<p>    <span class=\"token comment\">\/\/ \u66f4\u65b0\u6700\u5927\u5ef6\u8fdf<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> latency <span class=\"token operator\">&gt;<\/span> s<span class=\"token punctuation\">.<\/span>MaxSendLatency <span class=\"token punctuation\">{<\/span><br \/>\n        s<span class=\"token punctuation\">.<\/span>MaxSendLatency <span class=\"token operator\">&#061;<\/span> latency<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    s<span class=\"token punctuation\">.<\/span>LastUpdate <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span><span class=\"token function\">Now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>RDMAStats<span class=\"token punctuation\">)<\/span> <span class=\"token function\">UpdateRecvStats<\/span><span class=\"token punctuation\">(<\/span>bytes <span class=\"token builtin\">int64<\/span><span class=\"token punctuation\">,<\/span> latency <span class=\"token builtin\">int64<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    s<span class=\"token punctuation\">.<\/span>TotalRecvBytes <span class=\"token operator\">&#043;&#061;<\/span> bytes<br \/>\n    s<span class=\"token punctuation\">.<\/span>TotalRecvOps<span class=\"token operator\">&#043;&#043;<\/span><\/p>\n<p>    totalOps <span class=\"token operator\">:&#061;<\/span> s<span class=\"token punctuation\">.<\/span>TotalRecvOps<br \/>\n    s<span class=\"token punctuation\">.<\/span>AvgRecvLatency <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">.<\/span>AvgRecvLatency<span class=\"token operator\">*<\/span><span class=\"token punctuation\">(<\/span>totalOps<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> latency<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> totalOps<\/p>\n<p>    <span class=\"token keyword\">if<\/span> latency <span class=\"token operator\">&gt;<\/span> s<span class=\"token punctuation\">.<\/span>MaxRecvLatency <span class=\"token punctuation\">{<\/span><br \/>\n        s<span class=\"token punctuation\">.<\/span>MaxRecvLatency <span class=\"token operator\">&#061;<\/span> latency<br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    s<span class=\"token punctuation\">.<\/span>LastUpdate <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span><span class=\"token function\">Now<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u6027\u80fd\u62a5\u544a<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>RDMAStats<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetReport<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">string<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    report <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">string<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    report<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;total_sent_bytes&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> s<span class=\"token punctuation\">.<\/span>TotalSentBytes<br \/>\n    report<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;total_recv_bytes&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> s<span class=\"token punctuation\">.<\/span>TotalRecvBytes<br \/>\n    report<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;avg_send_latency_us&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> s<span class=\"token punctuation\">.<\/span>AvgSendLatency <span class=\"token operator\">\/<\/span> <span class=\"token number\">1000<\/span><br \/>\n    report<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;avg_recv_latency_us&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> s<span class=\"token punctuation\">.<\/span>AvgRecvLatency <span class=\"token operator\">\/<\/span> <span class=\"token number\">1000<\/span><br \/>\n    report<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;active_connections&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> s<span class=\"token punctuation\">.<\/span>ActiveConnections<br \/>\n    report<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;total_errors&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> s<span class=\"token punctuation\">.<\/span>TotalErrors<\/p>\n<p>    throughput <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">float64<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">.<\/span>TotalSentBytes <span class=\"token operator\">&#043;<\/span> s<span class=\"token punctuation\">.<\/span>TotalRecvBytes<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token operator\">!<\/span>s<span class=\"token punctuation\">.<\/span>LastUpdate<span class=\"token punctuation\">.<\/span><span class=\"token function\">IsZero<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        elapsed <span class=\"token operator\">:&#061;<\/span> time<span class=\"token punctuation\">.<\/span><span class=\"token function\">Since<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">.<\/span>LastUpdate<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">Seconds<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> elapsed <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            report<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;throughput_mbps&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> throughput <span class=\"token operator\">\/<\/span> elapsed <span class=\"token operator\">\/<\/span> <span class=\"token number\">1024<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">1024<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">8<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> report<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h3>\u5c0f\u7ed3<\/h3>\n<p>\u672c\u6587\u6df1\u5165\u5206\u6790\u4e86 RDMA \u4f20\u8f93\u5c42\u7684\u5b9e\u73b0&#xff1a;<\/p>\n<li>\u8fde\u63a5\u7ba1\u7406&#xff1a;\u8fde\u63a5\u521b\u5efa\u3001\u72b6\u6001\u7ef4\u62a4\u3001\u8fde\u63a5\u6062\u590d<\/li>\n<li>\u6570\u636e\u4f20\u8f93&#xff1a;Send\u3001Recv \u64cd\u4f5c&#xff0c;\u5f02\u6b65\u4f20\u8f93\u652f\u6301<\/li>\n<li>\u5185\u5b58\u6ce8\u518c&#xff1a;\u5185\u5b58\u6c60\u3001Region \u7ba1\u7406<\/li>\n<li>\u9519\u8bef\u5904\u7406&#xff1a;RDMA \u9519\u8bef\u7c7b\u578b\u3001\u6062\u590d\u673a\u5236<\/li>\n<li>\u6027\u80fd\u76d1\u63a7&#xff1a;\u7edf\u8ba1\u4fe1\u606f\u3001\u6027\u80fd\u62a5\u544a<\/li>\n<p>RDMA \u4f20\u8f93\u5c42\u662f MinIO \u9ad8\u6027\u80fd\u7684\u5173\u952e\u2014\u2014\u8ba9\u5b58\u50a8\u901f\u5ea6\u8ddf\u4e0a\u7f51\u7edc\u5e26\u5bbd\u3002<\/p>\n<h3>\u4e0b\u8282\u9884\u544a<\/h3>\n<p>\u4e0b\u8282\u9884\u544a&#xff1a;RDMA \u5185\u5b58\u6ce8\u518c\u2014\u2014rdma-memory.go \u4e2d\u5185\u5b58\u533a\u57df\u7ba1\u7406\u4e0e GPU-Direct \u5b8c\u6574\u5b9e\u73b0\u3002<\/p>\n<hr \/>\n<p>\u5982\u679c\u89c9\u5f97\u672c\u6587\u5bf9\u4f60\u6709\u5e2e\u52a9&#xff0c;\u6b22\u8fce\u70b9\u8d5e\u3001\u6536\u85cf\u3001\u5173\u6ce8\u4e09\u8fde&#xff01; \u672c\u7cfb\u5217\u6301\u7eed\u66f4\u65b0\u4e2d&#xff0c;\u5173\u6ce8\u4e0d\u8ff7\u8def~<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb &#8211; \u7b2c11\u7ae0\u7b2c2\u8282&#xff1a;RDMA \u4f20\u8f93\u5c42\u5b9e\u73b0\u2014\u2014RDMA \u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801\u5206\u6790 \u672c\u6587\u6df1\u5165\u5206\u6790 rdma-transport.go \u4e2d RDMA \u4f20\u8f93\u5c42\u7684\u5b8c\u6574\u5b9e\u73b0&#xff0c;\u5305\u62ec\u8fde\u63a5\u7ba1\u7406\u3001\u6570\u636e\u4f20\u8f93\u548c\u9519\u8bef\u5904\u7406\u3002 \u672c\u6587\u5bfc\u822a<br \/>\n\u8fde\u63a5\u7ba1\u7406\u67b6\u6784\u8fde\u63a5\u521b\u5efa\u6d41\u7a0b\u6570\u636e\u4f20\u8f93\u5b9e\u73b0\u5185\u5b58\u6ce8\u518c\u4e0e\u7f13\u5b58\u9519\u8bef\u5904\u7406\u4e0e\u6062\u590d\u6027\u80fd\u76d1\u63a7 \u8fde\u63a5\u7ba1\u7406\u67b6\u6784<br \/>\n\u8fde\u63a5\u7ba1\u7406\u6838\u5fc3\u63a5\u53e3<br \/>\n\/\/ cmd\/rdma-transport.go\/\/ RDMA \u8fde\u63a5\u63a5\u53e3<br \/>\ntype RDMAConne<\/p>\n","protected":false},"author":2,"featured_media":123443,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[99,101,1348],"topic":[],"class_list":["post-123444","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-java","tag-spring","tag-1348"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb-\u7b2c11\u7ae0\u7b2c2\u8282-RDMA-\u4f20\u8f93\u5c42\u5b9e\u73b0-RDMA-\u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/123444.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb-\u7b2c11\u7ae0\u7b2c2\u8282-RDMA-\u4f20\u8f93\u5c42\u5b9e\u73b0-RDMA-\u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb - \u7b2c11\u7ae0\u7b2c2\u8282&#xff1a;RDMA \u4f20\u8f93\u5c42\u5b9e\u73b0\u2014\u2014RDMA \u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801\u5206\u6790 \u672c\u6587\u6df1\u5165\u5206\u6790 rdma-transport.go \u4e2d RDMA \u4f20\u8f93\u5c42\u7684\u5b8c\u6574\u5b9e\u73b0&#xff0c;\u5305\u62ec\u8fde\u63a5\u7ba1\u7406\u3001\u6570\u636e\u4f20\u8f93\u548c\u9519\u8bef\u5904\u7406\u3002 \u672c\u6587\u5bfc\u822a \u8fde\u63a5\u7ba1\u7406\u67b6\u6784\u8fde\u63a5\u521b\u5efa\u6d41\u7a0b\u6570\u636e\u4f20\u8f93\u5b9e\u73b0\u5185\u5b58\u6ce8\u518c\u4e0e\u7f13\u5b58\u9519\u8bef\u5904\u7406\u4e0e\u6062\u590d\u6027\u80fd\u76d1\u63a7 \u8fde\u63a5\u7ba1\u7406\u67b6\u6784 \u8fde\u63a5\u7ba1\u7406\u6838\u5fc3\u63a5\u53e3 \/\/ cmd\/rdma-transport.go\/\/ RDMA \u8fde\u63a5\u63a5\u53e3 type RDMAConne\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/123444.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-07T00:25:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261107002517-6aee6fedd86a0.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/123444.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/123444.html\",\"name\":\"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb-\u7b2c11\u7ae0\u7b2c2\u8282-RDMA-\u4f20\u8f93\u5c42\u5b9e\u73b0-RDMA-\u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-11-07T00:25:19+00:00\",\"dateModified\":\"2026-11-07T00:25:19+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/123444.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/123444.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/123444.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb-\u7b2c11\u7ae0\u7b2c2\u8282-RDMA-\u4f20\u8f93\u5c42\u5b9e\u73b0-RDMA-\u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb-\u7b2c11\u7ae0\u7b2c2\u8282-RDMA-\u4f20\u8f93\u5c42\u5b9e\u73b0-RDMA-\u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/123444.html","og_locale":"zh_CN","og_type":"article","og_title":"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb-\u7b2c11\u7ae0\u7b2c2\u8282-RDMA-\u4f20\u8f93\u5c42\u5b9e\u73b0-RDMA-\u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb - \u7b2c11\u7ae0\u7b2c2\u8282&#xff1a;RDMA \u4f20\u8f93\u5c42\u5b9e\u73b0\u2014\u2014RDMA \u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801\u5206\u6790 \u672c\u6587\u6df1\u5165\u5206\u6790 rdma-transport.go \u4e2d RDMA \u4f20\u8f93\u5c42\u7684\u5b8c\u6574\u5b9e\u73b0&#xff0c;\u5305\u62ec\u8fde\u63a5\u7ba1\u7406\u3001\u6570\u636e\u4f20\u8f93\u548c\u9519\u8bef\u5904\u7406\u3002 \u672c\u6587\u5bfc\u822a \u8fde\u63a5\u7ba1\u7406\u67b6\u6784\u8fde\u63a5\u521b\u5efa\u6d41\u7a0b\u6570\u636e\u4f20\u8f93\u5b9e\u73b0\u5185\u5b58\u6ce8\u518c\u4e0e\u7f13\u5b58\u9519\u8bef\u5904\u7406\u4e0e\u6062\u590d\u6027\u80fd\u76d1\u63a7 \u8fde\u63a5\u7ba1\u7406\u67b6\u6784 \u8fde\u63a5\u7ba1\u7406\u6838\u5fc3\u63a5\u53e3 \/\/ cmd\/rdma-transport.go\/\/ RDMA \u8fde\u63a5\u63a5\u53e3 type RDMAConne","og_url":"https:\/\/www.wsisp.com\/helps\/123444.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-11-07T00:25:19+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/11\/20261107002517-6aee6fedd86a0.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"12 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/123444.html","url":"https:\/\/www.wsisp.com\/helps\/123444.html","name":"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb-\u7b2c11\u7ae0\u7b2c2\u8282-RDMA-\u4f20\u8f93\u5c42\u5b9e\u73b0-RDMA-\u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-11-07T00:25:19+00:00","dateModified":"2026-11-07T00:25:19+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/123444.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/123444.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/123444.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"MinIO\u6e90\u7801\u6df1\u5ea6\u89e3\u8bfb-\u7b2c11\u7ae0\u7b2c2\u8282-RDMA-\u4f20\u8f93\u5c42\u5b9e\u73b0-RDMA-\u8fde\u63a5\u7ba1\u7406\u4e0e\u6570\u636e\u4f20\u8f93\u5b8c\u6574\u6e90\u7801"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/123444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=123444"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/123444\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/123443"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=123444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=123444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=123444"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=123444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}