Skip to main content

Module syscalls

Module syscalls 

Source
Expand description

Linux 高性能零拷贝/批量系统调用封装

本模块集中收敛与「全链路最高性能最低消耗」相关的 Linux 内核系统调用封装:

  • splice(2):在两个 fd 之间内核态零拷贝移动数据(pipe ↔ socket)
  • sendfile(2):从文件 fd 直接发送到 socket fd,绕过用户态缓冲区
  • recvmmsg(2):单次系统调用接收多个 UDP/UDP-Lite 数据报,降低系统调用开销
  • sendmmsg(2):单次系统调用发送多个 UDP/UDP-Lite 数据报
  • pipe2(2):创建用于 splice 中继的管道对

§设计原则(规范 §1.1 / §6.1)

  • Fail-Closed:任何系统调用失败立即返回错误,绝不静默降级
  • 零堆分配热路径:批量数组使用栈上数组 [libc::mmsghdr; N]
  • checked 算术:所有偏移、长度计算使用 checked_* 防止溢出
  • unsafe 隔离:所有 unsafe 集中于本文件,附 // SAFETY: 注释
  • 错误语义完整:errno → LinuxError::Syscall,保留 syscall 名与 errno

§极致性能

  • 单次 splice 可传输最多 2^31-1 字节(Linux 限制)
  • recvmmsg/sendmmsg 单次最多 64 个数据报(UIO_MAXIOV
  • 与 AF_XDP 路径互补:内核套接字场景的最优解

Structs§

FdGuard
将系统 fd 包装为 RAII 守卫,确保 close(2) 被调用。

Enums§

SpliceFlags
splice(2) 标志位

Constants§

MAX_BATCH_DATAGRAMS
批量收发最大数据报数(与 UIO_MAXIOV 对齐,glibc 上限)

Functions§

pipe2
pipe2(2) 创建管道对,用于 splice 中继。
recvmmsg
recvmmsg(2) 批量接收多个数据报(UDP/UDP-Lite)。
sendfile
sendfile(2) 从文件 fd 直接发送到 socket fd,绕过用户态缓冲区。
sendmmsg
sendmmsg(2) 批量发送多个数据报(UDP/UDP-Lite)。
splice
splice(2) 在两个 fd 之间内核态零拷贝移动数据。
splice_bidirectional
TCP 双向中继:使用 splice(2) 实现内核态零拷贝双向转发。