# vllm_cpu_affinity_opt **Repository Path**: chenxuqiang2022/vllm_cpu_affinity_opt ## Basic Information - **Project Name**: vllm_cpu_affinity_opt - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-03-23 - **Last Updated**: 2026-03-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # VLLM推理服务绑核逻辑 ## 为什么要绑核 1. 消除跨核迁移的性能惩罚:进程在多核间频繁迁移,会导致L1/L2 缓存失效、TLB 重建,NUMA远端内存访问,绑核后进程固定在指定核心,避免跨核迁移。 2. 提升缓存命中率:多核 CPU 的 L1/L2 为核心私有(见图3),进程固定在一个核心,数据 / 指令可长期驻留缓存,减少内存访问。 3. 减少上下文切换(Context Switch)开销:上下文切换需保存 / 恢复寄存器、页表、缓存状态,绑核减少调度器的跨核决策,降低切换频率。 4. 保障关键任务的确定性与低延迟:针对实时任务、高频交易、音视频流处理等场景,可避免关键线程被调度到繁忙核心导致的性能抖动。 5. 资源隔离与优先级保障:核心业务绑定专属核心,不被后台任务抢占,避免互相干扰。 6. NUMA架构优化:多NUMA节点服务器中,跨节点内存访问延迟会倍数提升,通过绑核强制进程使用本地节点内存,消除跨NUMA延迟。 ## CPU 核心绑定判断策略 针对当前业务,以高优先级线程独占核心资源为核心,结合L3缓存亲和、H2D(Host to Device)数据传输优化、本地NUMA亲和等逻辑,按业务负载特征实施差异化CPU核心绑定策略,通过核心隔离、NUMA亲和、硬件拓扑感知等方式,实现计算资源确定性分配,最大化发挥硬件效能,提升业务吞吐、时延稳定性与整机资源利用率。 基于业务架构梳理与组件划分,对高优先级核心组件做性能瓶颈分析,按资源消耗模型分三类负载,强化核心组件资源独占与硬件亲和设计: ### CPU密集型(当前重点关注) #### 特征:计算瓶颈,高CPU利用率,上下文切换、核心争抢、L3缓存命中率敏感; #### 优化:高优先级线程独占核心及L3缓存,避免缓存污染。 ### 内存密集型 (当前暂不关注) #### 特征:内存带宽/访问延迟为瓶颈,跨NUMA访问、本地内存亲和、L3缓存复用敏感; #### 优化:CPU与内存本地NUMA绑定,高优先级线程独占本地内存及L3缓存,减少跨节点开销。 ### IO密集型 (当前暂不关注) #### 特征:网络/磁盘IO为瓶颈,CPU占用低,调度延迟、中断亲和敏感; #### 优化:本地NUMA亲和部署,绑定专属核心,缩短H2D传输路径。 ## 面向CPU计算绑核策略 * 算力规划:量化核心组件CPU需求,标准化容器CPU规格;区分高优先级计算线程与辅助组件,分配专属核心及L3缓存分区,避免竞争损耗。 * 容器亲和与隔离:高优先级组件强依赖组件调度至同一Cluster/DIE,遵循NUMA亲和;共享数据容器同域部署,无共享组件强隔离,保障算力稳定。 * 拓扑落地:使用同Cluster/Die/NUMA连续核心,禁止跨域混跑;按专属核心池绑定,实现算力、性能、缓存可预期复用。 ### 监控和观测方法: 该部分主要介绍如何通过系统工具解决从不同的维度查看当前应用程序是否属于CPU密集型应用,同时输出CPU密集型应用特征,包括CPU使用率,线程干扰情况,线程跨Cluster/Die/NUMA的情况,L3Cache的争用情况等问题,为后续减少争用和干扰提供绑核特征支持。核心观测逻辑:先查看CPU整体利用率,再分析线程分布是否跨Cluster/Die,接着排查干扰源,最后监控L3缓存及线程锁情况,逐步定位性能瓶颈。 #### 步骤一:CPU使用率 | 命令行 | 用途 | 关键阈值解读 | |---------|------|---------------| |top/htop|查看CPU整体利用率、推理进程及线程分布,快速判断核心负载不均衡问题|无明确固定阈值,重点关注核心负载两极分化情况(部分核心占用过高>90%,部分核心空闲<10%)| |lscpu|查看CPU拓扑(明确Cluster、Die划分),辅助后续绑核规划|Cluster划分:cpuid整除4为一个Cluster(连续4个CPU为一组);Die划分:cpuid整除32为一个Die(连续32个CPU为一组)| |mpstat -P ALL 1 | 查看单个核心%usr(用户态占用)、%sy(系统态占用)、%id(空闲率),判断是否存在CPU干扰 | %sy>20%:存在系统态干扰;%id<10%:核心负载过高;%id>50%:核心负载过低,资源浪费 | |pidstat -p PID -u -t 1| 监控推理进程及下属线程的核心占用情况与切换频率,定位高占用线程 | 线程切换频率过高(无固定阈值,对比正常场景):说明线程调度混乱,需优化绑核 | | sar -u 1 5 |实时监控5次CPU整体及各核心负载,输出平均数据,便于对比分析负载波动 |负载波动幅度>30%(前后两次平均占用差值):说明负载不稳定,需排查原因 | | ps -L -p PID | 查看推理进程下所有线程的PID、CPU占用,快速关联线程与核心绑定关系 | 无明确阈值,重点关注线程与核心的绑定是否固定,避免频繁切换核心 | | turbostat | 监控CPU主频、睿频状态,排查主频波动导致的负载不均衡(尤其推理任务对主频敏感场景)| 主频波动>10%:会导致推理性能不稳定,需锁定主频 | #### 步骤二:线程干扰检测 | 命令行 | 用途 | 关键阈值解读 | |---------|------|---------------| |mpstat -P ALL 1、pidstat -p PID -u -t 1、top | 筛选出非推理进程/线程(如系统后台任务、其他业务进程),明确干扰源的核心占用情况 | 非推理进程占用推理核心%us>5%或%sy>10%:构成明显干扰,需处理 | | ps aux --sort=-%cpu | 按CPU占用率排序,快速筛选高占用非推理进程(如rsyslog、crond等后台服务)| 非推理进程CPU占用率>10%:属于高占用干扰源,需优先处理| |systemctl list-units --type=service |查看运行的系统服务,排查不必要的服务占用CPU资源|无明确阈值,重点排查未使用但CPU占用>1%的服务,视为无效占用 |strace -c -p 干扰PID |统计目标进程所有系统调用的次数、耗时、错误率,定位导致CPU系统态(%sy)升高的具体系统调用类型。|重点关注 usecs/call > 100μs 且 % time 占比高的系统调用,它们才是真正消耗CPU系统资源(%sy)的干扰源。| #### 步骤三:线程跨Cluster/Die/Numa检测 | 命令行 | 用途 | 关键阈值解读 | |---------|------|---------------| |top(按“H”键)|查看线程详情,结合lscpu拓扑信息,判断推理线程是否跨Cluster、跨Die分布|存在跨Cluster/Die的推理线程:会导致算力损耗,需优先调整| |top(按“P”键排序)|实时查看各CPU核心负载(%us、%sy、%id),查看非推理任务占用情况|推理核心上非推理任务%us>5%:存在非推理任务干扰,需隔离| |mpstat -P ALL 1|精细化监控核心负载,排查推理核心是否存在非推理任务干扰|推理核心%sy>20%或%id<10%:存在严重干扰,需立即处理| |taskset -cp PID|直接查看推理进程当前绑定的核心列表,快速判断是否跨Cluster/Die|核心列表跨多个Cluster(按lscpu划分)或Die:需调整绑核策略| |numactl --hardware 结合 ps -eo pid,cmd,psr|查看进程对应的NUMA节点及核心,关联Cluster/Die拓扑,精准定位跨域分布问题|推理进程线程分布在多个NUMA节点:会导致跨节点通信损耗,需绑定到单一NUMA节点| |perf top -p PID|实时查看推理进程的函数占用情况,辅助判断跨域线程导致的性能损耗|核心函数占用率波动>20%:大概率是跨域线程导致,需排查线程分布| #### 步骤四:L3Cache干扰 | 命令行 | 用途 | 关键阈值解读 | |---------|------|---------------| |perf (观测L3缓存命中率、miss率)|观测L3缓存命中率、miss率,判断缓存使用效率|L3缓存命中率<80%:缓存使用效率低,存在缓存争抢;miss率>20%:需排查缓存优化空间| |perf stat -e L1-dcache-load-misses,L3-dcache-load-misses -p pid|精准统计L1、L3缓存缺失情况,量化缓存损耗|L3-dcache-load-misses占比>20%:缓存缺失严重,需优化代码或缓存分配| |cachestat|监控系统级缓存命中率,对比推理任务运行前后的缓存变化,判断缓存争抢程度|推理任务运行后,系统缓存命中率下降>15%:说明存在严重缓存争抢| ### 常用解决方案介绍: #### 通过CPU利用率与核心负载观测后如出现核心负载不均衡、负载波动问题: | 命令行 | 用途 | 关键阈值解读 | |---------|------|---------------| |taskset -c 核心列表 推理PID|精细化绑核分配,将推理线程绑定到负载较低的连续核心,避免核心负载两极分化;结合lscpu拓扑,确保绑定核心属于同一Cluster/Die | 绑定后核心负载波动<10%,无明显两极分化(最高负载与最低负载差值<20%):优化有效| |echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor|关闭CPU节能模式,确保主频稳定,避免波动造成推理负载不稳定。|主频波动<5%:主频稳定,满足推理任务对主频敏感的需求| |sar -u 1 3 |每隔1秒采集一次CPU使用情况,共采集3次,用于分析CPU在用户态、系统态、I/O等待等不同维度的负载分布。|%system > 15% 表示内核开销过高,已成为性能瓶颈,需优化系统调用或内存管理。| |nice -n <优先级> <命令>;renice -n -10 -p pid|nice为启动时设置优先级,renice为运行时修改已运行进程的优先级|推理进程优先级调整(范围-20~19,数值越小优先级越高),无其他进程抢占推理核心资源:优化有效| #### 通过线程分布排查(跨Cluster/Die/NUMA检测)发现解决线程跨域、核心干扰问题: | 命令行 | 用途 | 关键阈值解读 | |---------|------|---------------| |numactl --cpunodebind=NUMA节点 --membind=NUMA节点 推理进程|调整跨域线程,将线程绑定到同一NUMA节点下的连续Cluster/Die内,杜绝跨域算力损耗|调整后推理线程均分布在同一NUMA节点、同一Cluster/Die内,无跨域分布:优化有效| |cgroup(配置核心池限制)|划分推理专属核心池,限制其他业务进程只能使用非专属核心池,避免跨核心混跑|推理专属核心池内,非推理进程CPU占用率<1%:核心池隔离有效(示例:4NUMA场景,每个NUMA节点划分12个核心作为推理专属)| |taskset(迁移非推理任务)|针对%sy>20%或%id<10%的推理核心,排查并迁移非推理任务,将非推理进程绑定到非专属核心;必要时增加推理专属核心数量|迁移后推理核心%sy≤15%、%id≥15%:核心干扰缓解,负载趋于均衡| |export OMP_PROC_BIND=close|设置OMP线程亲和性,让线程紧密绑定在指定核心上,减少线程跨Cluster/Die迁移|线程跨Cluster/Die迁移频率<5次/分钟:线程亲和性配置有效| #### 通过干扰源定位发现非推理任务线程干扰、系统服务占用问题: | 命令行 | 用途 | 关键阈值解读 | |---------|------|---------------| |taskset(绑定非推理进程到非专属核心);systemctl stop 服务名;systemctl disable 服务名|隔离非推理进程,将高占用非推理进程绑定到非推理专属核心;停止/禁用不必要的系统服务(如crond、rsyslog),避免占用推理核心资源|推理核心上非推理进程CPU占用率<1%,禁用的服务无残留占用:隔离有效| |cgroup(设置cpu.cfs_quota_us)|限制非推理进程的CPU占用率,避免其过度占用CPU资源,干扰推理任务|示例:cpu.cfs_quota_us=50000,限制进程最大CPU占用为50%,非推理进程实际占用≤配置阈值:限制有效| |echo 0 > /proc/irq/中断号/smp_affinity_list|关闭不必要的系统中断,将其绑定到非推理核心,减少中断干扰|推理核心上的系统中断次数<10次/秒:中断干扰缓解| #### 通过L3缓存监控发现解决缓存争抢、命中率低问题: | 命令行 | 用途 | 关键阈值解读 | |---------|------|---------------| |numactl --cpunodebind=0 --membind=0 推理进程(示例,绑定到NUMA节点0)|将推理任务绑定到独立NUMA节点,实现L3缓存独占(CPU每个NUMA节点拥有独立L3缓存),避免跨NUMA节点缓存争抢 | 绑定后推理进程L3缓存miss率≤15%,无跨NUMA节点缓存访问:缓存隔离有效| |perf(分析缓存缺失热点函数)|优化推理代码,减少缓存无效访问(如避免频繁访问大容量数组、优化数据结构),提升L3缓存利用率;分析缓存缺失热点函数,针对性优化|优化后L3缓存命中率提升≥10%,热点函数缓存缺失率下降≥15%:代码优化有效|