linux服务器numactl + taskset缓解“一核有难,N核围观”
前言
今天用htop查看cpu,看到“一核跑满,N核围观”。又不想写多线程代码,故出此下策。
一、numactl
numactl是手工调优numa的工具。NUMA(Non-Uniform Memory Access)字面直译为“非一致性内存访问”,是一种CPU的管理模式,可以通过node配置CPU的多core。
numactl --hardware # 查看CPU的node情况
numactl --cpubind=0 --membind=0 python a.py # 在cpu的第一个node上执行
numactl --cpubind=1 --membind=1 python b.py # 在cpu的第二个node上执行
这个命令可以指定不同的cpu node执行不同的任务,但根据Node->Socket->Core->Processor的顺序,我们还是不能操作同一个node下的不同core。
不相关知识:socket是物理概念,指的是主板上CPU插槽;node是逻辑概念,对应于socket。core是物理概念,一个独立的硬件执行单元,对应于物理CPU;thread = 逻辑CPU = Processor,thread是逻辑CPU,也就是Processor。
二、taskset
在Linux上,可以通过 taskset命令修改进程的“CPU亲和力”.
对运行中的进程,可以用下面的命令,把CPU core#1 #2 #3分配给PID为2345的进程:
taskset -cp 1,2,3 2345
2、指定进程在某个cpu上运行:
taskset -c 1 python c.py
总结:numactl + taskset
numactl + taskset一起用可以把程序分配到每个核,emmm,不过有可能不用numactl也可以。。。样例代码:
CUDA_VISIBLE_DEVICES=0 numactl --cpubind=0 --membind=0 taskset -c 14 python c.py