任务集和cpuset之间的区别

Joh*_*erg 9 central-processing-unit latency multi-core performance-tuning

我正在尝试减少我的 linux 网络应用程序的延迟。我了解到有两种工具可以将程序“绑定”到特定的 CPU 内核:taskset 和 cpuset。

  1. 我应该更喜欢哪一个?它们在较低级别上是否等效?
  2. (处置)我的应用程序具有单线程,并且应该通过快速 LAN 网络以尽可能少的延迟处理单个 tcp 连接(无重新连接)。我在正确的路上吗?

eww*_*ite 13

Taskset用于将一个进程绑定到一个或多个 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
Run Code Online (Sandbox Code Playgroud)

在将进程绑定到 CPU 之前,还有其他可能需要检查和调整的事情;中断(irqbalance部分禁用)、省电设置、系统调度程序、I/O 电梯、实时策略 ( chrt)。

请参阅:Ubuntu 上的低延迟 TCP 设置

这是一个应用程序包装器的(复杂的)示例,它选择一个核心,停止 irqbalance,启动它并将所选核心列入黑名单,然后在所选核心上使用SCHED_FIFO和优先级 99执行 ./your_program 。

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
Run Code Online (Sandbox Code Playgroud)