如何将一个进程(线程)绑定到一个固定的CPU核上?——004

本文介绍如何在Linux系统中通过taskset命令行工具或编程接口将进程绑定到特定CPU核心,以优化多核架构应用性能。包括安装利用taskset的方法、获取及设置进程亲和性的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/sangyongjia/article/details/50725734


As multi-core CPUs become increasingly popular on server-grade hardware as well as end-user desktop PCs or laptops, there have been growing efforts in the community (e.g., in terms of programming models, compiler or operating system support) towards developing applications optimized for multi-core architecture.

One operating system (OS) support often exploited to run performance-critical applications on multi-core processors is so-called "processor affinity" or "CPU pinning". This is an OS-specific feature that "binds" a running process or program to particular CPU core(s).

Binding a program to specific CPU cores can be beneficial in several scenarios. For example, when an application with highly cache-bound workload runs together with other CPU-intensive jobs, pinning the application to a specific CPU would reduce CPU cache misses. Also, when two processes communicate via shared memory intensively, scheduling both processes on the cores in the same NUMA domain would speed up their performance.

In this tutorial, I will describe how to run a program or process on specific CPU cores on Linux.


-------------------------------------------------分割线-----------------------------------------------------------------------------------------

google一圈,能够实现的方式有两种:第一种:linux的shell命令行方式,命令名字为taskset。第二种就是代码实现级别的了,pthread_setaffinity_np和sched_setaffinity函数接口。
         第一种方式我已经验证过了,确实可行。同时验证了我心中的疑问:如果将某个线程绑定到某个物理核上之后,在此线程运行结束前,会不会有别的线程被调度到此物理核上执行?  写了一个死循环验证了下,发现绑定之后是不会调度别的线程在此核上运行的!(肉眼观察的,时不时观察下,没发现别的线程在此核上执行;对比了下没有绑定的情况,会发现过段时间此线程就会被调度到别的核心上执行)
        此种方式有个问题,就是只有线程运行起来后才会被绑定到某个核上,不够及时。
        具体的方式为:
            1.首先根据系统的差别运行如下安装命令:
                  sudo apt-get install util-linux        (Debian,Ubuntu or Linux Mint)
                  sudo yum install util-linux             (Fedora,CentOS or RHEL)
            2.相关命令的使用:
                2.1 使用命令 taskset  -p  <PID> 来获得此Process的 CPU affinity。
                       eg: taskset -p 2915  ------> pid 2915's current affinity mask:ff; ff=="1111  1111",没一个1代表一个核,共8个核,能用的核数也为8个核。
                2.2 使用命令 taskset -cp  <PID> 可获得数字形式的CPU affinity。   
                       eg: taskset -cp 2915 ------> pid 2915's current affinity list: 0--7。
                接下来为将进程pin到某个核上的命令;
                2.3 taskset -p <COREMASK>  <PID>
                       eg:taskset -p 0x11 9030  ------> pid 9030's current affinity mask: ff , pid 9030's new affinity mask: 11 。意思就是将此进程绑定到了CPU core 0 and 4。
                2.4 taskset -cp <CORE-LIST>  <PID>   
                        eg:taskset -cp 0,4  9030  ------>the same as below.
                         With "-c" option, you can specify a list of numeric CPU core IDs separated by commas, or even include ranges (e.g., 0,2,5,6-10).
                2.5 taskset <COREMASK>  <EXECUTABLE>
                        eg: taskset 0x1 xxxx   ----->"xxxx" represented the name of one program.
另外:参考文章最后的位置说到,绑定到此物理核之后,别的进程(线程)还可以调度到此核上执行,但是没说绑定的这个线程没执行完之前是否会被别的线程挤掉。根据我的观察是不会被挤掉,这我在文章的开头也有提到。

第二种方式 还有待编码验证。
        “ 待实践后,再补充此部分

具体参考:http://xmodulo.com/run-program-process-specific-cpu-cores-linux.html 需要使用代理google之,要不然就被墙了,打不开。
也可以在linux下使用命令:man taskset。查看帮助。



<think>嗯,用户这次的问题很明确,是关于NUMA绑是否同时涉及CPU和内存资源的绑定。从对话历史看,用户之前已经了解过绑的基本概念和操作,现在想深入理解资源绑定的具体范围。 用户可能正在优化一个数据库或高性能计算应用,需要精确控制硬件资源分配。ta引用的资料里提到MySQL多实例绑定和NUMA架构细节,说明应用场景可能涉及服务器性能调优。用户对技术细节很敏锐,注意到了CPU编号规则和远程内存访问延迟这些关键点。 从技术角度,这个问题需要分三层回答: 第一层是工具层面,numactl命令的--physcpubind绑定CPU心,--membind控制内存节点,两者可以独立或组合使用。第二层是硬件层面,必须解释清楚NUMA节点本身就是CPU和本地内存的集合体。第三层是效果层面,绑定CPU心但未指定内存节点时,系统仍可能分配远程内存,这时候就需要组合策略。 用户引用的资料[3]特别重要,它解释了NUMA节点包含CPU和本地内存的物理关系。资料[4]展示的MySQL启动命令正是最佳实践案例——同时绑定CPU心和本地内存分配。这些引用能很好地支撑结论。 考虑到用户后续可能实施绑操作,在回答时需要强调两个常见陷阱:一是CPU心编号在超线程环境下的规律(如资料[2]所述),二是如果只绑CPU不绑内存仍可能产生远程访问。可以补充一个诊断命令numastat,帮助用户验证效果。 最后生成的相关问题要延续这个技术深度,比如虚拟化环境下的绑差异,或是cgroup与绑的协同关系——这些应该是用户接下来可能遇到的进阶问题。</think>是的,**NUMA绑心目标就是同时绑定CPU计算资源和内存访问资源**,以最大化利用NUMA架构的本地访问优势。具体绑定逻辑如下: --- ### 一、NUMA绑的双重绑定机制 1. **CPU绑定** - 通过 `--physcpubind` 或 `--cpubind` 参数将进程/线程固定到特定CPU心。 - **作用**:避免线程在NUMA节点间迁移,减少心切换开销。 - 示例: ```bash numactl --physcpubind=0,3 ./program # 绑定心0和3 ``` 2. **内存节点绑定** - 通过 `--membind` 参数强制进程内存分配在指定NUMA节点的本地内存。 - **作用**:消除跨节点远程内存访问(Remote Access),降低延迟。 - 示例: ```bash numactl --membind=0 ./program # 内存仅从node0分配 ``` 3. **组合绑定(完整NUMA优化)** - **同时绑定CPU和内存**,确保计算和内存访问发生在同一NUMA节点: ```bash numactl --cpubind=0 --membind=0 ./program # 计算和内存均限定在node0 ``` *此为MySQL等关键应用的典型优化手段[^4][^5]。* --- ### 二、为何需要双重绑定? | 场景 | 仅绑CPU心 | 仅绑内存节点 | **CPU+内存双绑** | |---------------------|--------------------------|--------------------------|--------------------------| | **计算位置** | 固定在指定心 | 可能跨节点调度 | **固定在指定心** | | **内存位置** | 可能分配在远程节点 | 固定在本地内存 | **固定在本地内存** | | **远程访问风险** | 高(内存可能跨节点) | 中(计算可能跨节点) | **趋近于0** | | **典型延迟** | 本地内存:70ns<br>远程内存:150ns[^3] | 同左 | **稳定≤70ns** | > ⚠️ **关键结论**: > 若只绑定CPU心但**未绑定内存节点**,操作系统仍可能将进程内存分配在远程节点,导致性能不达预期[^3]。 --- ### 三、操作验证与诊断 1. **查看进程状态** ```bash taskset -cp <PID> # 查看绑定CPU心 numastat -p <PID> # 查看内存分配的NUMA节点 ``` 2. **监控远程内存访问** ```bash numastat # 查看各节点内存分配统计 ``` - 若 `OtherNode` 占比过高,表明存在跨节点访问,需检查绑策略[^1]。 --- ### 四、典型案例分析(MySQL优化) ```bash numactl --physcpubind=0,3 --localalloc mysqld_multi start 1 ``` - `--physcpubind=0,3`:绑定心0和3(需确认心属于同一NUMA节点[^2]) - `--localalloc`:等效于`--membind`,强制内存本地分配[^4][^5] - **效果**:避免QPI总线跨节点访问,降低查询延迟20%+[^1] --- ### 总结 NUMA绑的本质是**协同控制计算与内存的物理位置**: ✅ **CPU绑定**:固定线程执行位置,减少调度开销 ✅ **内存绑定**:确保数据本地化,消除远程访问延迟 ✅ **双重绑定**:最大化本地化优势,实现性能跃升 > 实践中需通过`numastat`监控验证绑定效果,避免负载不均[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值