Linux 性能调优:从 CPU 亲和性到内存映射

· 约 2500 字 · #Linux #性能优化 #后端

最近在优化一个高并发实时数据处理服务,需要对延迟做精细控制。在这个过程中系统性地梳理了一遍 Linux 性能调优的核心工具和思路,记录如下。

1. CPU 亲和性与 NUMA 感知

在多核系统中,进程在不同 CPU 核之间迁移会导致 cache miss。通过 tasksetsched_setaffinity 可以将关键进程绑定到特定核上。

# 将进程 PID 绑定到 CPU 0-3
taskset -cp 0-3 $PID

# 查看 NUMA 拓扑
numactl --hardware

在 NUMA 架构下,访问本地内存的速度远快于远端。使用 numactl 可以控制内存分配策略,确保进程尽量使用本地节点的内存。

2. 中断亲和性

网卡中断默认由 CPU 0 处理,高吞吐场景下 CPU 0 成为瓶颈。通过 /proc/irq/*/smp_affinity 可以将中断分发到多个核心。

3. 内存映射与 Huge Pages

对于需要大量共享内存的应用,使用 mmap 搭配 MAP_HUGETLB 可以显著减少 TLB miss。配置 2MB 或 1GB 的 huge page 后,一次 TLB lookup 可以覆盖的内存范围扩大了 512 倍。

# 预留 1024 个 2MB huge pages
echo 1024 > /proc/sys/vm/nr_hugepages

4. 实际效果

经过上述优化后,我们的服务 P99 延迟从 850μs 降到了 320μs,吞吐量提升了约 40%。