我正在尝试减少 Linux 网络应用程序的延迟。我了解到有两种工具可用于将程序“绑定”到特定的 CPU 核心:taskset 和 cpuset。
- 我该选择哪一个?它们在较低级别上是等同的吗?
- (配置)我的应用程序只有单线程,应该通过快速 LAN 网络以尽可能低的延迟处理单个 TCP 连接(无需重新连接)。我的方法正确吗?
答案1
任务集用于将进程绑定到一个或多个 CPU;本质上指定在哪里它可以在初始执行时或运行时运行。如果在现代服务器设备上使用 RHEL/CentOS,numactl
建议使用taskset
。
Cpuset/cset用于 CPU 屏蔽,是一个围绕 Linux cgroups 构建的框架。Cset 在某些发行版(如 RHEL)上从未流行过,因为还有其他可用于进程管理的工具。
下面的第一个命令创建一个屏蔽,将操作系统的任务限制在 CPU 核心 0 和 8 上。第二个命令将把您当前的 shell 会话移动到指定的 CPU 屏蔽,从而隔离系统和用户进程。
# cset shield --cpu 1-7,9-15 --kthread=on
# cset proc --move --pid=$$ --threads --toset=user
在将进程绑定到 CPU 之前,可能还需要检查和调整其他事项;中断(irqbalance
部分禁用)、省电设置、系统调度程序、I/O 提升程序、实时策略(chrt
)。
这是(复杂的) 应用程序包装器的示例,它选择一个核心,停止 irqbalance,启动它并将选定的核心列入黑名单,然后使用以下命令执行 ./your_programSCHED_FIFO并在选定核心上具有优先级 99。
Core=5
CoreMask=`echo "16 o 2 $Core ^ p" | dc`
service irqbalance stop
until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
IRQBALANCE_ONESHOT=1 IRQBALANCE_BANNED_CPUS=${CoreMask} irqbalance
sleep 1
until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
numactl --physcpubind=${Core} --localalloc chrt -f 99 ./your_program