perf(orchestrator): increase NBD dispatch buffer by 28 bytes to coalesce header + max payload in one read
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 1/5
- 预计耗时
- 1 小时以内
- 新手友好度
- 88/100
- Issue 类型
- 重构
- 描述清晰度
- 描述清楚
- 活跃度
- 冷清
- 技术栈
- go
调研方向
从 packages/orchestrator/pkg/sandbox/nbd/dispatch.go 中的 dispatchBufferSize 开始,阅读周围的 NBD dispatch 逻辑。将 raw buffer 增加 28 字节的 header 大小,然后验证现有的 NBD 包检查;完成标准是 buffer 能够容纳 4 MB payload 及其 header,同时不改变其他行为。
由索引模型根据 Issue 内容生成。
描述
Summary
The NBD dispatch read buffer (dispatchBufferSize) is set to exactly 4 MB, which is the maximum data payload size. However, every NBD request also carries a 28-byte header. This means a maximum-size read (4 MB data + 28-byte header) requires two kernel reads instead of one — the header and data cannot be received in a single recv() call.
Location: packages/orchestrator/pkg/sandbox/nbd/dispatch.go:54
// TODO: Look into optimizing the buffer reads by increasing the buffer size by 28 bytes,
// to account for a request that is 28 bytes of header + 4MB of data (this seems to be preferred kernel buffer size).
dispatchBufferSize = 4 * 1024 * 1024
Root cause
The NBD protocol frames each request as [28-byte header][N bytes payload]. When the kernel sends a 4 MB write, the dispatch loop reads the 28-byte header, then refills the buffer with up to dispatchBufferSize bytes of payload. If dispatchBufferSize == 4 MB, a 4 MB write payload fills the entire buffer, leaving no room to pre-read the next request's header in the same syscall.
Increasing the buffer by exactly 28 bytes allows the tail of one response and the header of the next to be coalesced into a single read.
Proposed fix
// dispatchBufferSize is the raw read buffer for the NBD socket.
// 4MB covers the largest possible data payload; the extra 28 bytes
// let the next request's header arrive in the same read as the
// last byte of the previous payload, saving one syscall per request.
dispatchBufferSize = 4*1024*1024 + 28
This is a single-constant change with no behavioral risk — the buffer is used only for reading from the NBD socket.
Impact
Every NBD read or write request currently requires at least two recv() calls for max-size payloads. Reducing to one call per request lowers syscall overhead for I/O-intensive sandboxes (particularly those doing large sequential reads/writes to the virtual block device).
- 主要语言
- Go
- 星标
- 1.6k
- 派生
- 438
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
e2b-dev/runtime 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 88/100
维护者通常 1 天内回复
-
sandbox cache: StartRemoving state transition not broadcast, all allocations see stale Running state未关闭
难度 2/5 1-3 小时 新手友好度 86/100
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 86/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 86/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 88/100
维护者通常 1 天内回复
相似的 Issue
-
bug needs triage
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
bug P2 reliability
难度 2/5 1-3 小时 新手友好度 88/100
afreidah/s3-orchestrator#1564 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 84/100
blinklabs-io/gouroboros#2577 ·
维护者通常 1 天内回复
-
agentic-workflows
难度 2/5 1-3 小时 新手友好度 68/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 88/100
维护者通常 1 天内回复