Linux 内核调优实战:从 sysctl 到 cgroup v2
背景与问题界定 某在线广告平台的实时竞价系统(RTB)运行在 100+ 台物理服务器上,Linux 内核版本已升级到 5.15 LTS,但性能表现始终达不到预期。一方面,netstat -s 显示大量的 TCPLoss 和 TCPTimeouts,网络协议栈参数均为操作系统默认值——这些默认值针对通用桌面场景设计,不适合高并发、低延迟的广告竞价场景。另一方面,容器技术从 Docker 切换到 containerd 后,cgroup v1 的层级复杂导致资源统计不准确,同一个 Pod 内的 Java 进程和 Sidecar 代理在 CPU 资源上相互争抢,缺乏精细化的限制能力。需要一套系统性的内核参数调优和 cgroup v2 迁移方案。 目标拆解与工程约束 网络协议栈极致优化:RTB 系统对网络延迟苛刻到微秒级,TCP 连接的延迟确认(delayed ack)、Nagle 算法、TIME_WAIT 累积等默认行为必须被调整,目标是单次请求的 TCP 握手延迟降低 30%。 内存管理精细化:广告竞价算法使用大量 mmap 文件映射和共享内存,需要调整 vm.swappiness、vm.dirty_ratio 和 NUMA 内存分配策略(numa_balancing)来减少内存回收抖动和跨 NUMA 节点访问延迟。 cgroup v2 统一资源管控:从 cgroup v1 迁移到 v2,利用其单一层级树(Single Hierarchy)消除 v1 中不同子系统可能挂在不同控制器下的混乱,实现 CPU、内存、IO 的统一 resource controller。 IO 优先级隔离:容器内的日志写入、监控数据采集和业务读写共享同一块 SSD,需要通过 cgroup v2 的 IO Controller(io.weight 和 io.max)实现 IO 带宽的 QoS 保障,避免日志洪峰冲垮数据库 IO。 方案设计 网络协议栈调优是我们投入最多的领域。根据 RTB 业务的流量特征(短连接、高并发、单次数据量小),我们将以下 sysctl 参数纳入集群基线配置: ...