我试图减less我的Linuxnetworking应用程序的延迟。 我已经了解到有两个工具可以将程序“绑定”到特定的CPU核心:taskset和cpuset。
Taskset用于将进程绑定到一个或多个CPU; 基本上指定它可以在初始执行或运行时运行的位置。 如果在现代服务器设备上使用RHEL / CentOS,build议使用taskset over taskset 。
Cpuset / cset用于CPU屏蔽,是围绕Linux cgroups构build的框架。 Cset在某些发行版(例如RHEL)上从未stream行,因为还有其他工具可用于进程pipe理。
下面的第一个命令会创build一个屏蔽,将操作系统的任务限制在CPU内核0和8中。第二个命令会将当前shell会话移动到指定的CPU屏蔽,从而导致系统和用户进程的隔离。
# cset shield --cpu 1-7,9-15 --kthread=on # cset proc --move --pid=$$ --threads --toset=user
还有其他一些事情可能会检查和调整,然后再进入绑定进程到CPU的path; 中断( irqbalance部分irqbalance ),省电设置,系统调度程序,I / O电梯,实时策略( chrt )。
请参阅: Ubuntu上的低延迟TCP设置
下面是一个应用程序包装的例子(select一个核心,停止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