目录
查看是否开启超线程
显示所有逻辑 CPU 及其 HT 对关系
查看NUMA
Isolcpus 隔离
禁止使用中断均衡服务
设置线程名称
设置线程亲和性
taskset工具
使用代码绑定
绑定core需要注意以下几点
查看是否开启超线程
lscpu | grep Thread
显示所有逻辑 CPU 及其 HT 对关系
grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
查看NUMA
numactl --hardware
Isolcpus 隔离
默认情况下,进程调度器可能会将进程调度到任何一个 CPU 核心上,因为它要根据负载来均衡计算资源的分配。可以隔离某些逻辑核心,让系统默认情况下永远不会使用这些核心,除非我指定某些进程使用这些核心。要想做到这一点,就要使用到内核参数 isolcpus 了,例如:如果想让系统默认情况下不使用逻辑核心 2,3 和 4,可以将以下内容添加到内核参数列表中:
isolcpus=1,2,3
# 或者
isolcpus=1-3
可直接修改 vim /etc/default/grub
然后重新构建 grub.conf:
grub2-mkconfig -o /boot/grub2/grub.cfg
重启机器后查看
cat /proc/cmdline
禁止使用中断均衡服务
中断均衡会使得孤立核上中断不确定性,导致孤立核上任务实时性能下降。同时避免均衡带来的效益会被cache刷新的开销抵消掉,
关闭中断平衡守护进程
中断平衡守护进程(irqbalance daemon)会周期性地将中断平均地公平地分配给各个CPU核心,它默认是开启的。为了实现中断绑定,首先需要将这个守护进程关闭。
利用systemctl status irqbalance查看守护进程的运行状态
Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰-CSDN博客
设置线程名称
prctl( PR_SET_NAME, ( unsigned long )p_thread_name );
设置线程亲和性
taskset工具
taskset 3000 ./exc.out (0x3000: 十六进制掩码)
使用代码绑定
cpu_set_t mask; // CPU核的集合
CPU_ZERO( &mask ); // 置空
CPU_SET( 2, &mask ); // 设置亲和力值
CPU_SET( 1, &mask ); // 设置亲和力值
if ( sched_setaffinity( 0, sizeof( mask ), &mask ) == -1 ) // 设置线程CPU亲和力
{
printf( "warning: could not set CPU affinity, continuing...\n" );
}
绑定core需要注意以下几点
1、如果子线程未设置亲和性,则调度核心继承自父线程
2、Isolcpus 设置隔离后的核心不会被系统调度
3、设置亲和性集合需要注意隔离和非隔离的core不能混用
4、设置亲和性集合绑定隔离核心时,只有一个有效。