<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>异步 I/O on Hellokitty&#39;s Blog</title>
    <link>https://yangyang233333.github.io/tags/%E5%BC%82%E6%AD%A5-i/o/</link>
    <description>Recent content in 异步 I/O on Hellokitty&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Fri, 21 Aug 2026 11:17:00 +0800</lastBuildDate>
    <atom:link href="https://yangyang233333.github.io/tags/%E5%BC%82%E6%AD%A5-i/o/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Mooncake Transfer Engine 源码阅读（三）：RDMA、TCP 与请求完成状态机</title>
      <link>https://yangyang233333.github.io/posts/mooncake-transfer-engine-source-reading-rdma-tcp/</link>
      <pubDate>Fri, 21 Aug 2026 11:17:00 +0800</pubDate>
      <guid>https://yangyang233333.github.io/posts/mooncake-transfer-engine-source-reading-rdma-tcp/</guid>
      <description>&lt;p&gt;Transfer Engine 的公共 API 很统一，但 RDMA 和 TCP 的实现差异很大。RDMA 需要 MR、QP、WR 和 CQ；TCP 需要连接、lane、消息 framing 和接收端主动拷贝。本文沿源码比较两条路径，并分析 Batch 状态如何完成。&lt;/p&gt;
&lt;p&gt;阅读版本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Mooncake commit: 777cc7782417b6e554cf7c2d53210d0d8f89f5cc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;一transport-抽象&#34;&gt;一、Transport 抽象&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Transport&lt;/code&gt; 基类统一定义：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;install / uninstall
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;registerLocalMemory / unregisterLocalMemory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;submitTransfer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;getTransferStatus
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;allocateBatchID / freeBatchID
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;它还定义 &lt;code&gt;TransferRequest&lt;/code&gt;、&lt;code&gt;TransferStatus&lt;/code&gt; 和内部 &lt;code&gt;BufferEntry&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;公共抽象要求每个后端回答三个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;本地内存如何准备为可传输状态；&lt;/li&gt;
&lt;li&gt;请求怎样排队和执行；&lt;/li&gt;
&lt;li&gt;如何查询每个 task 的最终状态和字节数。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;具体连接模型不属于公共 API。&lt;/p&gt;
&lt;h2 id=&#34;二rdma-初始化&#34;&gt;二、RDMA 初始化&lt;/h2&gt;
&lt;p&gt;RDMA 后端主要位于：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rdma_transport.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rdma_context.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rdma_endpoint.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endpoint_store.cpp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;worker_pool.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装阶段通常完成：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;枚举 RDMA devices / ports / GID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; 创建每张 HCA 的 context
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; 建立 PD、CQ 等资源
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; 启动 worker / poller
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; 发布 NIC endpoint metadata
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -&amp;gt; 准备 endpoint store
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mooncake 支持多 HCA、多端口和 GPU 内存，因此一个逻辑请求可能被切到多个 rail 上并行发送。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
