1. 绑定目的
在 Linux 系统中,线程调度是由内核自主完成的。当系统运行在多核 CPU 上时,线程有可能在不同的 CPU 核上来回切换运行。这不利于 CPU 的缓存,缺页率较高。
以 Intel i5 CPU 为例。在多核 CPU 结构中,每个 CPU 有各自的 L1、L2 缓存,而 L3 缓存是共用的。如果一个线程在 CPU 间来回切换,各个 CPU 的缓存的命中率将会降低。而如果线程不管如何调度,都始终可以在一个 CPU 上执行,那么其数据的 L1、L2 缓存的命中率将得到显著提高。
2. 使用命令进行绑定
使用命令 taskset 可以把线程绑定为指定 CPU 上。
taskset 命令使用方法如下:
taskset -p <cpu_set> <pid>
线程的 pid 可以使用 pstree -p | grep <pthread_name>
来获取。但该方法的前提是线程必须已设置名称,否则无法使用 pstree 来查看线程。
cpu_set 为线程对应的 CPU 集,为整型类型,其数值为 1 的 bit 位对应着哪一号 CPU(从 0 起算)。例如 cpu_set 为 1(0001)时对应 1 号 CPU,为 4(0100)时对应 2 号 CPU。<