拆解jevOS架构:单线程调度器如何实现LLM请求并发
【免费下载链接】jevjevos: an open-source alternative to Jev and Microsoft-Decision-1. Yes/no decisions, choices and scores with probabilities, on your laptops CPU.项目地址https://gitcode.com/gh_mirrors/je/jev点击查看免费下载jevOS 是 jev 开源项目的本地 LLM 决策引擎在笔记本 CPU 上运行一个小模型把一段文本和一个是否问题在 28–130 毫秒内回答成答案概率。本文拆解它的并发架构——单线程调度器 请求队列 token 预算批处理看它如何让多个并发 LLM 请求共享同一次前向传播既快又稳。整体架构三层流水线的线程分工jev serve的请求路径被切成三层每层有不同的线程策略层源码位置线程模型职责HTTP 层server.cpp每条连接一个线程cpp-httplib解析 JSON、校验、分词调度层scheduler.hpp单个 worker 线程 FIFO 队列攒批、按序调用模型模型层model.cpp只运行在调度线程上OpenVINO INT8 前向输出 P(yes)核心思想一句话模型只有一个用户。main.cpp 开头的注释 直接说明了这一点——所有模型调用都由一个调度线程发出而校验wire.cpp和分词跑在各自请求的线程上。并发没有丢只是被分配到了真正可以并行的地方。HTTP 层验证与分词并行跑在请求自己的线程上每个请求进来后在自己的线程上完成三件轻活解析 body、校验 wire 格式、把 state 和每个问题编码成 token。分词用的词表是只读的所以多个请求可以同时分词、互不加锁——server.cpp 中的注释 原话是一个请求在分词时另一个请求可以正在推理。分词结束后请求被压缩成一个 ScoreRequest它的所有问题提示词jobs、共享前缀prefix和长度估算tokens()。之后唯一的动作是scheduler.score()——把任务塞进队列阻塞等待结果。单线程调度器如何工作一个队列与一个条件变量Scheduler 类 总共只有一百多行结构非常干净入队调用线程把任务含一个promise压入队列唤醒条件变量然后阻塞在future上score()。攒批worker 线程醒来后从队首开始按 token 预算组装批次遇到第一个装不下的请求就停不跳过攒批循环保证 FIFO 顺序先来先服务。执行整批交给model.score_batch()一次前向传播把每个请求的结果概率 排队耗时 推理耗时通过 promise 回传。这个设计里有两个关键参数参数默认值上限含义--batch-tokens384CALL_TOKENS 1024一批请求合起来最多读多少 token--warmup384WARM_TOKENS 384空闲时预热到多长的 prompt定义见 model.hpp 的常量 与 main.cpp 的参数解析。token 预算批处理并发请求共享一次前向传播为什么一起读比分开读快因为模型是 stateless 前向批量让矩阵乘法的行数变多摊薄了每次调用的固定开销。main.cpp 里有一段实测注释4 个 64-token 请求合批后总耗时-11%3 个 120-token 的请求-16%但请求太大时合批反而变慢所以有预算上限。这也解释了单线程并发的本质它不是让请求并行执行而是让多个请求并行地占满一次执行的计算——这正是 vLLM 之类系统在 GPU 上做 continuous batching 的 CPU 精简版。空闲预热没有请求时调度器在做什么CPU 推理引擎按输入 shape 编译 kernel某个 prompt 长度第一次出现要多花 3–10 毫秒。如果把这个代价留给第一个用户首请求就会莫名变慢。调度器用了一个巧妙的机制scheduler.hpp 头部注释队列空且安静超过IDLE_GRACE500 毫秒后worker 不睡觉而是执行一次预热调用把还没预热过的 prompt 长度1–384逐个编译好 kernel预热期间来了真实请求就等这一次调用结束再处理等待通常小于 0.2 秒稳定流量自己就会把常用长度热掉因此不会被预热打断。代价是一次性、发生在没人的时候收益是所有常规长度的请求从第一次起就是全速。模型层缓存状态快照与分段读取调度器之外模型层还有两个复用优化进一步压缩了重复流量的实际计算量状态快照SnapshotIndex 按 token 前缀匹配缓存 state 的中间激活LRU 淘汰默认 16 份、共 8192 个 state token可用--state-cache调整。同一客户消息被追问多个问题时后续请求只读增量部分。分段读取超长 state 按 PIECE_TOKENS 2048 的块分段读兼顾精度与耗时分段大小的取舍分析在 model.hpp 的注释。实测数据并发客户端下的吞吐与延迟用 999 题集中的单问题请求压测参考机型Intel Core Ultra 7 255H16 线程早期 jevos 版本数据见 wiki 的吞吐分析页并发客户端数吞吐量延迟中位数18.7 req/s110 ms49.8 req/s390 ms810.1 req/s780 ms吞吐在 1 个客户端之后就基本不动延迟随队列线性增长——这正是排队论Littles law的预期表现模型已经是满负荷的更多请求只是排队而不是并行变快。要观测排队情况每个响应的Server-Timing响应头会拆分出parse / validate / tokenize / queue / inference / respond / total七段耗时server.cpptotal与inference的差值就是队列时间/health里的batched_requests计数器则记录有多少请求被合并读了。仓库自带压测脚本 bench_concurrent.py可直接复现上表。为什么单线程反而更快CPU 前向是算力密集型的同一模型多线程推理只会抢同一批核心收益远小于开销单线程 批量把算力利用率拉满。零锁、行为确定模型只有一个用户内部完全不需要互斥结果不受请求交错影响便于回归测试。并行留在可并行的地方验证与分词天然可并行就放在请求线程上不占用宝贵的模型线程时间。扩展靠横向单进程约 1 GB 内存一个进程饱和后标准做法是多进程或多机 负载均衡而不是在一个进程里加线程。顺带一提离线模式jev decide也复用了同一个调度器只是关掉批处理与预热main.cpp接口行为完全一致。关键源码导航想自己动手翻代码按这个顺序最省力调度器全貌队列、攒批、预热src/scheduler.hppHTTP API 与计时src/server.cpp批处理/分段/预热常量及取舍依据src/model.hpp请求单元结构src/tokens.hpp状态快照缓存src/snapshots.hpp并发压测脚本tests/bench_concurrent.py吞吐 vs 延迟的完整分析wiki/throughput-vs-latency-for-a-decision-server.mdjevOS 用不到两百行的调度器证明了一件事在 CPU 上跑本地 LLM 服务并发的关键不是更多线程而是把线程花在可并行的地方把算力花在攒批上。赞分享【免费下载链接】jevjevos: an open-source alternative to Jev and Microsoft-Decision-1. Yes/no decisions, choices and scores with probabilities, on your laptops CPU.项目地址https://gitcode.com/gh_mirrors/je/jev点击查看免费下载相关推荐Trippy多线程探测原理并发请求调度机制解析Trippy多线程探测原理并发请求调度机制解析 引言网络诊断工具的并发挑战 在现代网络诊断中传统的 traceroute 工具因单线程探测机制导致诊断效率网络CLI运维gitsome中的并发处理多线程API请求实现gitsome中的并发处理多线程API请求实现 在日常开发中你是否遇到过GitHub API请求缓慢、批量操作耗时过长的问题gitsome作为增强型Git开发工具版本控制devalue与JSON.stringify对比分析10个关键差异点详解devalue与JSON.stringify对比分析10个关键差异点详解 devalue 是一个轻量级 JavaScript 数据序列化库官方定位只有一句话创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

0.96寸OLED STC12C5A60S2 IIC例程详解与避坑指南

0.96寸OLED STC12C5A60S2 IIC例程详解与避坑指南

简介:这是一份面向STC12C5A60S2单片机开发者的0.96寸OLED显示驱动例程,演示通过IIC总线控制SSD1306/SH1106驱动芯片的完整流程。压缩包共14个文件,以3个C头文件、2个C源文件为主,另含Keil工程文件、STARTUP.A51启动文件、编译生成…

2026/10/14 18:42:00 阅读更多 →
微信小程序案例 3.5 计时器(增加背景文字:时间如流水)

微信小程序案例 3.5 计时器(增加背景文字:时间如流水)

一、案例简介 本案例是微信小程序计时器实现,基础功能实现计时、暂停、重置。扩展需求:在时间显示界面底层添加背景文字 “时间如流水”,作为页面装饰文字。本案例学习定时器、时间戳、页面布局 z-index 层级控制。 二、实现思路 计时原理&am…

2026/10/14 18:42:00 阅读更多 →
EST综合布线测试仿真系统 v1.4.1支持【网络测试仪】仿真实验

EST综合布线测试仿真系统 v1.4.1支持【网络测试仪】仿真实验

综合布线与网络性能实测成本高、设备昂贵、故障场景难以复现?EST 综合布线测试仿真系统 v1.4.1 重磅上线网络测试仪仿真打流测试能力!在虚拟仿真环境中即可模拟专业仪表对网络链路开展吞吐量、丢包率、时延、抖动等性能打流测试,无需真实硬件…

2026/10/14 18:42:00 阅读更多 →

最新新闻

NDIS小端口驱动开发实战:从Miniport注册到NBL收发路径详解

NDIS小端口驱动开发实战:从Miniport注册到NBL收发路径详解

简介:这是一份面向Windows内核网络驱动开发者的NDIS 6.0小端口驱动实例源码,针对Realtek 8111/8168/8169/8110等PCI千兆以太网控制器编写。由于DDK中可参考的miniport示例仅有E100BEX,学习NDIS 6.0网卡驱动的资料相当稀缺,本资源正…

2026/10/15 20:55:56 阅读更多 →
档案管理信息系统核心设计:PostgreSQL+Django构建可审计闭环

档案管理信息系统核心设计:PostgreSQL+Django构建可审计闭环

简介:本资源是一套基于Delphi 6与SQL Server的档案管理信息系统(AMIS)完整开发源码包,面向高校计算机专业学生、桌面应用初学者及中小型单位信息化建设人员,解决传统档案手工管理效率低、检索难、权限模糊、版本混乱等…

2026/10/15 20:55:56 阅读更多 →
openai模型性能对比:用TaoToken统一Key跑通多模型基准测试

openai模型性能对比:用TaoToken统一Key跑通多模型基准测试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 20:55:56 阅读更多 →
C++算法实现工程手册:从数据结构选型到性能验证的避坑指南

C++算法实现工程手册:从数据结构选型到性能验证的避坑指南

简介:《Implementing Useful Algorithms in C》由Dmytro Kedyk撰写,面向具备一定C基础、希望深入掌握算法设计与工程实现的开发者与计算机专业学生。全书从算法正确性证明、渐进记法、机器模型等基础出发,延伸至随机化算法、数据类型选择、内…

2026/10/15 20:55:56 阅读更多 →
GPT、Kimi、DeepSeek 多模态能力实测:open design 设计任务中的公平对比与 TaoToken 统一接入

GPT、Kimi、DeepSeek 多模态能力实测:open design 设计任务中的公平对比与 TaoToken 统一接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 20:55:56 阅读更多 →
具身智能中的协同机理研究(107):双引擎并行实现毫秒级精确控制

具身智能中的协同机理研究(107):双引擎并行实现毫秒级精确控制

前沿技术探索:TVA智能体(简称TVA) TVA智能体(亦称“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习(DRL)、卷积神经网络(CNN)与因式分解算法(FRA),构成了具身智…

2026/10/15 20:54:55 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →