乐于分享
好东西不私藏

Nano-vLLM 源码解读 - 3. PagedAttention

Nano-vLLM 源码解读 - 3. PagedAttention

nano-vllm 用千行代码拆解 vLLM 核心,是读懂大模型推理最快的捷径。

这是「Nano-vLLM 源码解读」第 3 讲。承接前两讲——L1 给出系统全景、L2 把 Sequence 这个数据结构吃透——这一讲专攻 nano-vllm 也是 vLLM 系列的灵魂:PagedAttention。它是把 KV Cache 当成"操作系统的分页内存"来管理的一套机制,决定了引擎的吞吐上限和可调度性。

读完这一讲,你能:

  • • 说清楚朴素连续 KV Cache 的三大痛点,以及它们各自为什么严重
  • • 解释 PagedAttention 的两级映射:物理块、逻辑序列、block_tableslot_mapping 各自的职责
  • • 看懂 model_runner.py 里 allocate_kv_cache / prepare_prefill / prepare_decode 是怎么把这套机制串起来的
  • • 评估 block_size = 256 这个超参数在元数据成本和内部碎片之间的取舍

1. 朴素 KV Cache 的三大痛点

如果完全按"训练框架的思路"分配 KV Cache,最自然的做法是:

# 朴素版:每条序列预留 max_seq_len 的连续 KVkv_cache = torch.empty(    num_seqs, max_seq_len,    num_layers, num_kv_heads, head_dim,    dtype=torch.bfloat16,)

这样一来三个问题立刻浮上来:

痛点 1:必须按 max_seq_len 预留。 一条 prompt 最终可能只产出 200 个 token,但你不得不为它预留 8192 个 token 的空间——因为没法预知。这意味着实际的有效利用率经常只有 5%–20%。

痛点 2:碎片化无法重用。 当 seq A 跑到第 100 个 token 就结束了,理论上它后面 8092 个 token 的空间应该空出来给别人。但如果别的序列已经在它"右边"开始预留连续空间,这块空闲就成了不可用的间隙。即使没人挤进来,这块空闲也只够装下"长度 ≤ 8092 的新序列"——一个 16k 的长 prompt 完全装不下,即使总空闲量够。

痛点 3:抢占(preempt)无法实现。 当 GPU 显存压力大、需要把某个低优先级序列踢出去时,你想做的事是"释放它的 KV"。如果 KV 在大数组里是一段连续的内存,释放等于在中间挖一个洞——其它人也用不上。换句话说,连续布局让"释放" 和"碎片"变成同一个问题。

这三个痛点合起来意味着:朴素布局的最大并发数 ≈ 显存 / max_seq_len 的 KV 体积。在 16k context、bf16、num_layers=32 的设定下,单条序列的 KV 占 ~2GB,一张 80GB 卡装不到 40 条并发——而真实的请求平均长度可能只有几百 token,理论上能装上千条。


2. PagedAttention 的核心思想:操作系统启发

vLLM 的设计灵感来自虚拟内存:

概念
操作系统
PagedAttention
进程
操作系统视角的"程序"
一条 Sequence
虚拟地址
进程看到的连续地址
序列内的 position(0, 1, 2, ...)
页(page)
4KB 固定大小
一个 KV 块(256 个 token 的 K/V)
页表
虚拟地址 → 物理地址
block_table
:逻辑块号 → 物理块号
物理内存
RAM 一大块连续空间
KV 池:单一全局张量

核心动作:把"按序列连续分配"换成"按固定大小的块分配,由 block_table 间接寻址"。 序列对自己的 KV 仍然有"逻辑连续"的视角(token 0 → token 1 → ...),但物理上每 256 个 token 是一块,块和块之间在显存里可能完全分散。

这一改动直击三大痛点:

  • • 痛点 1(按 max_seq_len 预留)→ 解决:只在序列真的写到第 N 个 token 时才分配第 ⌈N/256⌉ 个块
  • • 痛点 2(碎片)→ 解决:所有空闲块都来自同一个池,释放后任何序列都能取来用
  • • 痛点 3(抢占)→ 解决:抢占 = 把这个序列的所有块归还池子,逻辑上简单,物理上彻底干净

下面这张图把"为什么 paged"一次性讲完——上边是朴素布局逐条暴雷的三大痛点,中间是 block_table 的两级寻址,下边是三条序列共享同一物理池后的清爽世界:

PagedAttention:把 KV Cache 当成操作系统的分页内存① 朴素连续 KV 的三大痛点痛点 1:按 max_seq_len 预留WASTED ≈ 7992 token (97.5%)↑ 实际 200已强制预留 max_seq_len = 8192→ 利用率经常只有 5–20%痛点 2:碎片化无法重用分配后:Seq ASeq BSeq CB 结束:Seq A💀 HOLESeq C→ 即使空闲量足,单段不连续,长 prompt 装不进痛点 3:抢占(preempt)无解想踢走 B:Seq AEVICT B?Seq C释放后:Seq A夹在中间的洞Seq C→ "释放" 和 "碎片" 是同一个问题合起来:80GB 卡 ≈ 仅 40 条并发,但真实负载(avg 几百 token)本可装上千条② block_table 两级映射机制① 逻辑序列视角(per-seq)p=01234567└── 逻辑块 0 ──┘└── 逻辑块 1 ──┘p // bs② block_table 查表(per-seq)逻辑块 0→ 物理块 #7逻辑块 1→ 物理块 #12blk × bs + (p mod bs)③ KV Pool(全进程共享)#0#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15↑ 本图:仅展示某条 seq 占用的 #7#12 两块例:token p=3 的 K/V 落在哪个 slot?block_table[3 // 4] = #7 → slot = 7 × 4 + (3 mod 4) = 31③ 多序列共享同一物理 KV 池三条同时存活的序列各持一张 block_table,物理块都来自同一个池Seq A.block_table =#3#7Seq B.block_table =#1#5#9Seq C.block_table =#11↓ 各自的物理块散落在同一个池里 ↓#0#1B#2#3A#4#5B#6#7A#8#9B#10#11C#12#13#14#15A / B / C 三条 seq 的物理块共存于此池中 · 浅灰 = free,可分配给任意 seq✅ 痛点 1 解决按需 1 块块申请不再预留 max_seq_len✅ 痛点 2 解决释放即归还共享池任何序列都能拿来用✅ 痛点 3 解决抢占 = 整套块归还物理上彻底干净* 实际 nano-vllm 中 block_size = 256 token,本图为可视化简化为 4 token / 块

3. 物理块 vs 逻辑序列:两级映射

engine/model_runner.py:allocate_kv_cache 一次性给整个进程分配 KV 池:

self.kv_cache = torch.empty(2,                              # K 和 V 两份    hf_config.num_hidden_layers,    # 每层一份    config.num_kvcache_blocks,      # 全部块数(启动时根据剩余显存计算)self.block_size,                # 每块容纳 256 个 token    num_kv_heads,                   # TP 切分后本 rank 的 head 数    head_dim,)layer_id = 0for module inself.model.modules():ifhasattr(module, "k_cache"andhasattr(module, "v_cache"):        module.k_cache = self.kv_cache[0, layer_id]        module.v_cache = self.kv_cache[1, layer_id]        layer_id += 1

注意几件事:

  • • 这是全进程共享的一个大张量,所有序列写入和读取都从这里面切片
  • • 每个 attention 层的 k_cache / v_cache 都是这个池的视图(shared view),没有数据拷贝
  • • 池的大小(num_kvcache_blocks)是启动时根据剩余显存反推的——下一讲(L6)会拆这个公式

而每个 Sequence 自己持有的只是一个"逻辑块号 → 物理块号"的映射:

seq.block_table = [7123]   # 这条序列的第 0/1/2 个逻辑块分别对应物理块 #7 #12 #3

要找到 token at position p 对应的具体内存位置,需要走两步映射:

两级映射:从逻辑位置 p 到 KV 池里的物理 slotB = block_size;// 是整除,% 是取模逻辑位置 p序列内连续编号block_id = block_table[p // B]查这条序列的页表:第 ⌊p/B⌋ 个逻辑块对应哪个物理块slot = block_id × B + (p % B)块内偏移定位到具体 token 槽位KV Pool(全局共享张量,所有序列从这里取/还块)物理块 #0#1#2#3#4#5#6block_idslot

第一步整除 p // B 把逻辑位置切到"哪个逻辑块",再借 block_table 翻成物理块号;第二步取模 p % B 算出"在这块里第几个 slot",加上块的起始地址 block_id × B 就是池里的最终下标。两步都是 O(1) 计算,attention 内核每读写一个 token 都要走一遍。

这套间接寻址是 PagedAttention 的全部秘密。一旦理解,剩下的复杂度都是工程细节——块从哪来、什么时候归还、怎么把 slot_mapping 喂给内核——但核心机制就这一个。


4. slot_mapping:告诉 GPU 内核每个 token 该写到哪里

它解决了什么问题

把 KV Cache 切成块以后,attention 内核(在 GPU 上跑的算子,FlashAttention 或自写的 Triton kernel)撞上一个新麻烦:它没法自己算出每个 token 的 K/V 应该写到显存的什么位置

朴素连续布局下不存在这个问题——内核拿到 (batch, seq_len) 形状的输入张量,第 i 个 token 的地址就是 base + i × per_token_size,一个乘加就够。分块以后,"逻辑上第 p 个 token 物理上在哪儿"必须先查 seq.block_table 才知道(第 3 节那张两级映射图)。但 block_table 是 Python 端 Sequence 对象的字段,GPU 内核 forward 过程中没法"中断一下让 CPU 帮我查字典"——它只看得到喂进来的张量。

怎么解决的

nano-vllm 的解法很直接:把这层翻译提前到调度阶段,由 CPU 把"每个 token 该写到哪个 slot"算好,结果打成一个张量喂进 GPU。这个张量就叫 slot_mapping

它的"协议"由三件事定义:

  • • 形状:一维 int32 张量,长度 = 本 step 在 batch 里要算 K/V 的 token 总数(prefill 序列贡献多个、decode 序列各贡献 1 个,按 batch 顺序拼起来)。
  • • 语义slot_mapping[i] 表示"输入张量第 i 个 token 的 K/V 应该写到 KV 池的第几格"。
  • • 代价:CPU 端多算一次小循环(开销可忽略);GPU 内核原本要做的"查 block_table → 乘加算地址"被压成 pool[slot_mapping[i]] = K_i, V_i——一次数组下标读取就到位。

换句话说,slot_mapping 是 CPU 调度器和 GPU 内核之间的地址翻译协议:调度器在分块世界里查表,把结果用一维数组打平交给内核;内核完全不需要懂"块"这件事,按表对号入座写入就行。

下图把上面两段拆成 ① CPU 阶段 + ② GPU 阶段两半,串成一条数据流。简单起见 batch 里只放一条序列,3 个 token,这条序列 block_table = [2]

slot_mapping:CPU 调度器与 GPU 内核之间的地址翻译协议示意:block_size = 4;本 step 在 prefill 一条 3-token 的新 prompt,这条序列 block_table = [2]① CPU 端 — 调度器在 schedule() 阶段算好 slot_mappingblock_table 是 Python 端 Sequence 的字段,GPU 内核访问不到——所以由 CPU 在调度阶段提前查表 + 算地址seq.block_table2slot[i] = bt[i//B] × B + (i%B)对每个本步要算的 token 位置 i 套这个公式slot_mapping (int32)8910读法:「i=0 写 slot 8,i=1 写 slot 9,i=2 写 slot 10」这就是 CPU 给 GPU 的"地址翻译表"slot_mapping 张量上传到 GPU② GPU 端 — attention 内核按 slot_mapping 写 KV内核完全不需要懂"块",只看 slot_mapping[i] 这一格的数字,按表对号入座输入张量batch 内 tokenbatch[0]i = 0batch[1]i = 1batch[2]i = 2slot_mapping从 CPU 接收8910pool[slot_mapping[i]] = K_i, V_i第 i 个输入 token 的 K/V 写到 pool 第 slot_mapping[i] 格KV Pool8910物理块 #0#1#2 (block_table[0])#3#4#5#6#7

 灰色的 CPU 半区里,调度器拿到 seq.block_table = [2],对每个本步要算的 token 位置 i=0,1,2 套公式 slot[i] = bt[i//B] × B + (i%B),得到 slot_mapping = [8, 9, 10]——这就是 CPU 提前算好的"地址翻译表"。蓝色箭头表示这张表作为张量被上传到 GPU。

 浅色的 GPU 半区里,attention 内核同时拿到两份输入:上一行是按 batch 顺序排好的输入张量(蓝色,3 个 token 的 K/V 待写入),下一行是从 CPU 接收到的 slot_mapping(黄色)。内核执行 pool[slot_mapping[i]] = K_i, V_i——三条橙色箭头落到 KV 池里物理块 #2 的前 3 个 slot(编号 8、9、10)。整个过程内核完全不需要懂"块"概念,只看映射表对号入座。

这是最简单的情形:本步要算的 3 个 token 集中在同一个新块里,slot 编号也连续。下一节就来看 chunked prefill 怎么把这种"集中"打破。

Prefill 路径

prefill 的麻烦在于:输入 batch 在 token 维度上是连续的,但它们在物理 slot 上未必连续。一条做 chunked prefill 的序列,本步只啃 prompt 的中间一段——这一段在逻辑上是连续的位置区间 [start, end),但翻译到 KV 池里可能跨多个物理块,并且首尾两个块都要做边界处理:首块只从某个 offset 开始写(前面的 slot 已经被上一 step cache 过了),末块只写到某一格就停(后面的位置在本 step 还没轮到算)。

下图是这两种边界情况的具体例子。一条 6-token 的 prompt,前 3 个已经在上一个 step cache 完成,本步预算 3 个把剩下的 prefill 完——block_size=4block_table=[1, 6]

Prefill 路径的两个边界:首块跳过已 cache 的 offset、末块只到 end示意:prompt 长 6,已 cache 3 个(chunked prefill 中),本步预算 3;block_size=4,block_table=[1, 6]逻辑块 0 → block_table[0] = 物理块 #1逻辑块 1 → #6pos 0已 cachepos 1已 cachepos 2已 cachepos 3本步pos 4本步pos 5本步slot 4slot 5slot 6slot 7物理块 #1slot 24slot 25slot 26slot 27物理块 #6①「首块跳过 offset」本步 start = 3,落在逻辑块 0 内的偏移 = start % B = 3。物理块 #1 里前 3 个 slot 已被旧 KV 占用,本步只写最后 1 格:slot_start = 1×4 + 3 =7
,slot_end = 1×4 + 4 = 
8
②「末块只到 end」本步 end = 6,落在逻辑块 1 内的偏移 = end − 1×B = 2。物理块 #6 一共 4 格,本步只写前 2 格:slot_start = 6×4 = 24,slot_end = 6×4 + (6 − 1×4) = 26最终 slot_mapping = [7, 24, 25]——3 个本步要算的 token,按 batch 顺序写到这 3 个物理 slot

上半的逻辑视角里,灰条纹的前 3 个 token 已经在前面的 step cache 过;橙色的后 3 个是本步要算的。这 3 个 token 在逻辑上分属两个块:position 3 是逻辑块 0 的最后一格,positions 4、5 是逻辑块 1 的开头两格。下半的物理视角里,逻辑块 0 经 block_table[0]=1 翻成物理块 #1,逻辑块 1 经 block_table[1]=6 翻成物理块 #6——本步真正要写的就是 #1 的最后一格(slot 7) + #6 的前两格(slot 24、25)。

engine/model_runner.py:prepare_prefill 里这段是核心:

for seq in seqs:    start = seq.num_cached_tokens                # 这次开始处理的 token 起点    seqlen_q = seq.num_scheduled_tokens    end = start + seqlen_q    ...    start_block = start // self.block_size    end_block = (end + self.block_size - 1) // self.block_sizefor i inrange(start_block, end_block):        slot_start = seq.block_table[i] * self.block_sizeif i == start_block:            slot_start += start % self.block_size       # 首块要跳过已 cache 的 offsetif i != end_block - 1:            slot_end = seq.block_table[i] * self.block_size + self.block_sizeelse:            slot_end = seq.block_table[i] * self.block_size + end - i * self.block_size  # 末块只到 end        slot_mapping.extend(range(slot_start, slot_end))

逐行翻译:

  • • 算出这次要写哪些 token,对应哪些"逻辑块"(start_block 到 end_block
  • • 对每个逻辑块,查 block_table[i] 拿到物理块号,乘 block_size 得到这一块在池里的起始 slot
  • • 处理两个边界:首块从 start % block_size 开始(前面已经 cache 过的部分跳过),末块只到 end 那一格(后面还没分配的不写)
  • • 把这一段 slot 编号 extend 进 slot_mapping

套到上图那条序列上:start=3end=6start_block=0end_block=2,循环跑两次,slot_mapping 在这条序列贡献的部分就是 [7, 24, 25]——i=0 的 token 写 slot 7(首块只写一格),i=1、i=2 的 token 写 slot 24、25(末块只写两格)。这正是图里三条箭头的终点。

Decode 路径

prepare_decode 简单得多——每个 seq 一次只算 1 个 token,永远是最后一个位置:

for seq in seqs:    input_ids.append(seq.last_token)    positions.append(len(seq) - 1)    context_lens.append(len(seq))    slot_mapping.append(        seq.block_table[-1] * self.block_size + seq.last_block_num_tokens - 1    )

公式 last_block * block_size + last_block_num_tokens - 1 等价于"最后一块物理位置 + 序列在最后一块里已用 slot 数 - 1"——刚好定位到刚 append 的那个 token 的 slot。

这个数组喂给谁

写 KV:自写的 Triton kernel store_kvcache_kernel,直接拿 slot_mapping[i] 索引。L11 会拆这个 kernel。

读 KV:FlashAttention 的两个 API(flash_attn_varlen_func / flash_attn_with_kvcache),它们接受 block_table 自行算地址。同样在 L11 详谈。


5. 块大小的取舍

config.kvcache_block_size 默认 256,源码里还有 assert self.kvcache_block_size % 256 == 0——必须是 256 的倍数。这个"256"是个折中。

下图把这个折中的两端画出来:

block_size 取舍:元数据成本 vs 内部碎片,最低点在 256 附近横轴 = block_size(log 刻度);纵轴 = 相对成本(仅示意,无具体单位)相对成本block_size1664256 ★10244096元数据/调度成本内部碎片/对齐损失总成本(U 形)最低点 ≈ 256⟵ 块小(16/32)block_table 长 N 倍 → 元数据传输成本高prefix-cache hash 算 N 倍物理块多,CPU 调度成本上升256 = 甜蜜点和 FlashAttention chunk 对齐P50 prompt 长 100–500,1–2 块够xxhash 单块 < 1μs块大(1024/4096) ⟶内部碎片回归(200-token 用一块的 1/5)preempt 粒度变粗prefix cache 命中粒度变粗

横轴是 block_size(对数刻度)。两条虚线分别画两类成本——红色的元数据/调度成本随块变小而上升(块越多 → block_table 越长、hash 越频繁、调度的物件越多),蓝色的内部碎片/对齐损失随块变大而上升(一条短序列被迫吃一整块、preempt 整块还、prefix-cache 对齐粒度变粗)。两者相加就是黑实线那条 U 形总成本曲线,最低点对应"两类成本平衡得最好的那个 block_size"——大约就在 256 这一档。下面分别看两端各自的代价。

取小(如 16/32)的代价

  • • block_table 变长 N 倍,每次 attention 的元数据传输(prepare_block_tables 里那个 int32 张量 cuda 拷贝)成本变高
  • • prefix cache 的 hash 计算更频繁——每个块都要算一次 xxhash(L5 详谈),变成 16 倍负担
  • • 物理块数变多 → BlockManager 的 free_block_ids 队列、hash_to_block_id 字典都变大,CPU 调度成本上升

取大(如 1024/4096)的代价

  • • 内部碎片回归——一条 200-token 的序列只用一块的 1/5,回到了"按 max_seq_len 预留"那种浪费
  • • preempt 粒度变粗——抢占必须释放整块,可能误伤未来要用的部分
  • • prefix cache 的命中粒度变粗——共享前缀必须正好对齐 1024 的倍数才能复用,命中率掉

为什么 256

  • • 和 FlashAttention 内核的 chunk 偏好对齐
  • • 真实 prompt 长度的 P50 在 100–500 区间,单条序列大多用 1–2 个 256 块——内部碎片的最坏情况是 255 个 token 被浪费,可控
  • • xxhash 在 256 个 token(即 256 × 4 字节 = 1KB 上下)规模上 CPU 开销 < 1μs,频率合适

简单结论:256 是个"够大但不太大"的甜蜜点,也是和 FlashAttention 内核协同设计的产物。如果你的工作负载特别短(agent 类、平均 < 100 token),可以考虑往下调;特别长(长文档、code review),可以考虑往上调,但优先级在 prefix cache 等其它机制之后。


6. 视频:多序列共享物理 KV 池

下面这段动画展示三条同时存活的请求是怎么共享一个物理 KV 池的——它们独立成长、独立释放,物理块在它们之间动态流转:

已关注
关注
重播 分享

注意几个值得反复看的画面:

  • • 三条序列的 block_table 永远互相独立,但它们指向的物理块都来自同一个池
  • • 当某条序列结束(FINISHED)时,它的物理块整体归还池子,不留任何"占用残留"
  • • 同一块物理 slot 在不同时刻可能服务于不同的 sequence——这是 PagedAttention 让显存利用率变高的根本原因

7. 下一讲

接下来 L4 把镜头拉近 BlockManager 这个类本身:

  • • free_block_ids 是 deque、used_block_ids 是 set,为什么这样选数据结构?
  • • can_allocate / allocate / can_append / may_append / deallocate 这五个 API 各自的责任边界是什么?
  • • 引用计数 ref_count 为什么存在——它是 L5 prefix cache 的伏笔。

理解了 PagedAttention 的"为什么"(L3)之后,L4 讲"怎么实现"——一段精炼的内存分配器。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-14 07:41:00 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/608755.html
  2. 运行时间 : 0.102589s [ 吞吐率:9.75req/s ] 内存消耗:4,868.02kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=ca891dd0390aa27a7218e0405b5aeae6
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000544s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000767s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000354s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000281s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000558s ]
  6. SELECT * FROM `set` [ RunTime:0.000202s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000522s ]
  8. SELECT * FROM `article` WHERE `id` = 608755 LIMIT 1 [ RunTime:0.000483s ]
  9. UPDATE `article` SET `lasttime` = 1778715660 WHERE `id` = 608755 [ RunTime:0.012155s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000327s ]
  11. SELECT * FROM `article` WHERE `id` < 608755 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000504s ]
  12. SELECT * FROM `article` WHERE `id` > 608755 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.003844s ]
  13. SELECT * FROM `article` WHERE `id` < 608755 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000827s ]
  14. SELECT * FROM `article` WHERE `id` < 608755 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000784s ]
  15. SELECT * FROM `article` WHERE `id` < 608755 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001008s ]
0.104094s