这句话的意思

epoll + splice + SO_RCVLOWAT=131072 是一套 Linux 高性能网络 I/O 的组合,核心思路是:

等 socket 至少积攒 128 KiB 数据再通知程序,然后尽量在内核里直接搬运数据。

- epoll:同时监听大量 socket,哪个有数据就处理哪个,避免一个个轮询。
- splice:让数据尽量在内核态直接传输,减少复制到用户态再复制回内核的开销。常见路径是 socket → pipe → socket/file
- SO_RCVLOWAT=131072:把接收低水位设为 131072 字节,也就是 128 KiB。对 TCP socket 来说,通常积攒到这么多数据后,epoll 才报告“可读”。

为什么说 very good

大块传输时,它可以:

- 减少 epoll_wait 被频繁唤醒
- 减少系统调用次数
- 用 splice 降低数据复制和 CPU 消耗
- 提高代理、文件传输等场景的吞吐量

例如对方每次只发 4 KiB,不设低水位时程序可能被唤醒 32 次;设为 128 KiB 后,理想情况下积攒够了再一次处理。

但不是所有场景都好

代价是延迟增加。如果对方发送得慢,或者一条消息本来就不到 128 KiB,程序可能长时间等不到普通的可读通知。因此它适合:

- 大文件传输
- 高吞吐 TCP 代理
- 视频流或批量数据
- 明确会持续发送大量数据的连接

不太适合:

- 聊天消息
- HTTP 小请求
- 游戏封包
- SSH 等交互式连接
- 对首包延迟敏感的业务

另外,SO_RCVLOWAT 只是影响“什么时候报告可读”,并不保证一次 splice 必定得到 128 KiB;连接关闭、错误等情况仍可能提前唤醒。使用 EPOLLET 时也必须一直读取到 EAGAIN,不能只读一次。

一句话总结:这是用 128 KiB 批处理换取更高吞吐和更低 CPU,但会牺牲小流量场景的响应速度。
 
 
Back to Top