步步糕升 发表于 2026-8-11 15:14:16

程与线程完整底层解析|LLM 推理服务资源卡顿排查指南

本帖最后由 步步糕升 于 2026-8-11 15:20 编辑

       运行 Ollama、vLLM、FastAPI 大模型服务时,经常出现内存持续上涨、CPU 占满、程序莫名卡死、后台模型偷偷占用算力等问题,根源大多是进程、线程调度机制认知不足。本期区分程序、进程、线程核心概念,拆解操作系统多任务调度底层逻辑,横向对比进程与线程资源隔离、性能差异,结合 Python GIL、LLM 推理多进程 / 多线程选型给出落地方案,附带 Linux/Windows 进程排查实操命令,解决 AI 服务内存泄漏、并发卡顿线上故障。
一、基础概念:程序、进程、线程三者本质区别


1. 程序(Program)


存储在硬盘上的静态二进制文件,无内存、CPU 占用,仅一份代码副本。
示例:本地 Ollama 安装包、vLLM 可执行文件、Python 脚本.py,不双击运行不会消耗系统资源。

2. 进程(Process)


程序被操作系统加载进内存、分配资源后的运行实例,是操作系统资源分配最小单位。
操作系统为每个进程独立分配:独立虚拟内存空间、文件句柄、CPU 时间片、权限隔离。
核心隔离特性:进程之间内存完全隔离,A 进程崩溃不会导致其他程序、系统蓝屏卡死。
一台电脑开机后通常存在数百系统进程:网络服务、音频、驱动、桌面、后台 AI 模型服务。

3. 线程(Thread)


进程内部CPU 调度最小执行单元,一个进程至少自带 1 条主线程,可创建多条子线程。
同一进程内所有线程共享同一片内存、文件资源,仅各自拥有独立栈空间;线程创建开销远低于进程,但单条线程崩溃会直接让整个进程退出。

通俗生活化类比


[*]程序:一份门店经营手册(静态文件)
[*]进程:完整独立门店(独占场地 / 水电 = 独立内存资源)
[*]线程:门店内多名员工(共享场地,一人罢工门店直接停业)

二、进程 vs 线程核心全方位对比


对比维度进程线程
资源归属独立完整虚拟内存、文件句柄共享所属进程全部内存
崩溃影响仅自身退出,不干扰其他进程单线程崩溃,整个进程直接终止
创建开销大,复制内存映射,毫秒级极小,仅分配栈,微秒级
切换成本高,需切换页表极低,仅切换寄存器
通信方式管道、消息队列、共享内存,复杂直接读写共享变量,需加锁防冲突
Python 限制绕过 GIL,多核并行计算受 GIL 锁,CPU 计算无法并行


三、操作系统多任务调度底层原理


很多人误以为 CPU 同时并行运行几百个进程,实际 CPU 核心同一时刻只能执行一条指令。
操作系统依靠时间片轮转调度机制:


[*]内核给每个进程分配极短 CPU 时间片(毫秒级);
[*]快速切换执行任务:运行 1ms 浏览器,立刻切到 AI 推理进程,再切换输入法;
[*]切换速度远超人类感知,肉眼看起来所有软件同步运行。

进程五大标准生命周期


创建 → 就绪等待 CPU → 运行 → 阻塞(等待网络 / 磁盘 IO)→ 销毁
AI 场景典型阻塞:大模型加载权重、向量库读取磁盘、SSE 网络等待用户提问,进程让出 CPU,调度其他任务。

四、Python 环境进程 / 线程特殊限制:GIL 全局解释锁


Python CPython 存在 GIL 锁,同一进程任意时刻仅一条线程能执行 CPU 运算:


[*]多线程适合 IO 密集:网络请求、文件读取、数据库查询(等待时释放 GIL,并发无压力);
[*]多线程不适合大模型矩阵计算、批量文本向量化,多核无法并行,速度提升极小;
[*]CPU 密集 AI 任务(Embedding、模型推理)必须使用multiprocessing多进程,每个进程拥有独立解释器,绕开 GIL 利用多核算力。

五、AI 大模型开发进程 / 线程选型方案


场景 1:Web AI 网关(FastAPI/Go Gin)


单进程 + 多线程 / 异步协程最优


[*]任务以网络 IO 为主(接收用户提问、推送 SSE 流式数据);
[*]线程 / 协程轻量,单机可承载数千并发对话;
[*]Go 原生协程无 GIL 限制,并发能力远超 Python 线程。

场景 2:批量向量化、本地 CPU 模型推理(CPU 密集)


多进程架构


[*]拆分 4/8 进程绑定 CPU 核心,绕过 GIL 实现多核并行;
[*]缺陷:每个进程独立加载模型,内存占用成倍上涨,7B 模型多进程会出现内存溢出。
优化:主进程加载权重,子进程共享内存映射。

场景 3 GPU vLLM/TensorRT 推理服务


单进程多线程标准架构


[*]GPU 算力独立于 CPU,进程仅做请求分发;
[*]多线程处理并发用户请求,共享 GPU 显存权重,不会重复占用内存;
[*]禁止多进程加载同一模型,会重复占用数十 GB 显存。

场景 4 离线批量文档 OCR、数据集清洗


多进程池,充分利用多核 CPU 加速文本预处理。

六、线上 AI 服务常见进程故障与根源


故障 1:关闭前端页面,模型进程仍后台常驻


前端仅销毁浏览器线程,后端 vLLM/Ollama 进程独立存在,持续占用 GPU / 内存;
解决方案:增加会话超时自动杀死闲置推理子进程。

故障 2:程序运行越久内存持续上涨(内存泄漏)


线程循环创建向量、张量不释放;进程未回收临时文件缓存;
排查:htop实时观测 RSS 内存占用,定位异常 PID。

故障 3 Python 多线程推理速度几乎无提升


根源 GIL 锁限制 CPU 并行,改用多进程或迁移 C++/Rust 推理内核。

故障 4 单条异常对话导致整个服务崩溃


推理线程无异常捕获,报错直接崩溃主线程;
解决方案:每条推理放入独立子进程,异常仅销毁单任务,主服务持续运行。

七、进程排查实操命令(AI 服务器必备)


Linux 云端 GPU 服务器



[*]ps aux | grep vllm 静态查看大模型进程 PID、内存 CPU 占用
[*]top 实时监控资源,M 键按内存排序,P 按 CPU 排序
[*]htop 交互式可视化进程树,直观查看父子进程关系
[*]kill -15 PID 优雅停止推理进程,释放 GPU 显存
[*]pstree 查看进程父子创建关系,定位后台僵尸进程

Windows 本地电脑



[*]Ctrl+Shift+Esc 打开任务管理器,查看 Ollama、Python 进程资源
[*]详细信息面板查看 PID,右键结束后台常驻模型进程

macOS 开发机


活动监视器筛选 ollama、python 进程,查看内存 / 显卡占用。

八、新手高频认知误区澄清


误区 1 多线程一定能加快大模型计算速度


纠正 Python GIL 锁限制 CPU 并行,仅 IO 任务提升性能,矩阵推理无效。

误区 2 多进程越多,推理性能越高


纠正每个进程独立加载模型,显存 / 内存翻倍,极易 OOM 崩溃,需匹配 CPU 核心数。

误区 3 子线程崩溃只会单条对话报错,不影响服务


纠正同一进程线程共享资源,线程异常直接整个推理服务退出。

误区 4 关掉软件窗口进程就会自动销毁


纠正前端界面只是进程其中一条线程,后端模型进程会长期后台驻留占用算力。

误区 5 进程和线程可以随便混用


纠正 GPU 推理优先单进程多线程,CPU 批量预处理优先多进程。

九、本期全文总结



[*]程序是静态文件,进程是运行资源实例,线程是进程内执行单元;
[*]进程内存完全隔离、崩溃互不干扰,线程共享内存、创建开销极低;
[*]Python GIL 锁导致多线程无法利用多核 CPU,AI 计算任务必须多进程;
[*]LLM 网关用多线程 / 协程,GPU 推理单进程多线程,批量预处理用多进程;
[*]线上内存泄露、服务崩溃大多是线程异常、进程未回收资源导致;
[*]ps/top/htop 可快速定位占用 GPU、内存的异常 AI 后台进程。
页: [1]
查看完整版本: 程与线程完整底层解析|LLM 推理服务资源卡顿排查指南