Joh*_*erg 9 central-processing-unit latency multi-core performance-tuning
我正在尝试减少我的 linux 网络应用程序的延迟。我了解到有两种工具可以将程序“绑定”到特定的 CPU 内核:taskset 和 cpuset。
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
)。
这是一个应用程序包装器的(复杂的)示例,它选择一个核心,停止 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)