Zero-copy in Go: sendfile, splice, and the cost of io.Copy
7 days ago
- #sendfile
- #zero-copy
- #Go optimization
- Go中的一个中间件变更因禁用了sendfile(2)优化,导致文件服务性能下降。
- Go的io.Copy通过*net.TCPConn.ReadFrom对*os.File源使用sendfile(2),避免了用户空间复制。
- 将*os.File包装在自定义io.Reader中会失去sendfile优化,增加系统调用和CPU使用率。
- 与不透明的包装器不同,Go能识别io.LimitReader并保留快速路径。
- socket到socket的代理在*net.TCPConn实例之间使用splice(2)实现零拷贝传输。
- strace可通过sendfile/splice计数与read/write系统调用的对比,帮助验证快速路径的使用情况。
- 避免在文件/socket之间包装io.Reader/Writer,以维持Go中的零拷贝优化。