当前位置:首页>Linux>Linux MM 2026-05-18~19 最新 Feature 分析报告

Linux MM 2026-05-18~19 最新 Feature 分析报告

  • 2026-07-02 16:45:34
Linux MM 2026-05-18~19 最新 Feature 分析报告
目录
  1. KSM 反向映射性能优化
  2. 跳过低阶原子分配时的 HighAtomic 整页块预留
  3. 通过上限 compact_gap() 对齐 compaction 水位线与扫描器能力
  4. Per-CPU Work 辅助机制:消除 RT 场景的远程调度开销
  5. 按交换设备跳过零填充页检查:避免与后端重复检测
  6. vrealloc() 收缩时释放未使用的物理页
  7. arm64 架构的硬件内存错误恢复(ARCH_HAS_COPY_MC)
  8. DAMON 数据属性监控:从访问监控到通用数据属性引擎
  9. 开放 HugeTLB 分配例程以支持无 VMA 的通用分配
  10. cgroup/dmem:允许 dmem 分配向 memcg 双重计费
  11. arm64:从线性映射中取消映射内核 data/bss 的可写别名
  12. KHO:始终打印 scratch 区域大小

1. KSM 反向映射性能优化

系列[PATCH v5 0/5] KSM: performance optimizations for rmap_walk_ksm作者: xu xin, Wang Yaxin版本: v5(5个patch)

背景

当系统内存极度紧张导致 KSM 页面被换出(swap out),或存在严重内存碎片化导致 THP 触发内存压缩(compaction)时,内核会调用 rmap_walk_ksm() 执行反向映射,定位所有引用该 KSM 页面的页表项。该函数需要遍历所有共享同一 anon_vma 的 VMA。大量 VMA 附着到同一 anon_vma 并非仅由 fork() 引起——mprotect/madvise 等操作导致的 VMA 分裂也能在无 fork 场景下产生数万个 VMA 共享同一个 anon_vma。作者的调试追踪分析发现,当 VMA 数量达到约 20,000 时,anon_vma_interval_tree_foreach 消耗了绝大部分延迟,导致 anon_vma 锁持有时间超过 500ms,进而阻塞上层应用线程。anon_vma 锁被缺页中断、回收、迁移、压缩、mlock、进程退出、cgroup 计费等众多关键路径所争用,长时间持锁会造成严重的延迟抖动和容器超时。

解决的问题

  • KSM 反向映射遍历在 VMA 数量多时极度低效:锁持有时间可达 705ms(作者 benchmark 数据)
  • anon_vma_interval_tree_foreach 内 99.9% 的迭代因"addr 不在 VMA 范围内"而被跳过——因为传入的搜索范围是整个地址空间 [0, ULONG_MAX]
  • anon_vma 锁被缺页中断、回收、迁移/压缩等路径共享,长时间的 KSM rmap walk 会阻塞所有这些操作

如何做

该系列采取"诊断→基准→数据准备→核心优化→测试"的渐进路线。核心洞察在于:KSM folio 始终是 order-0 普通页,在范围内区间树中只有唯一的 VMA 包含该页。实现上分三步走:

数据准备:在 struct ksm_rmap_item 中新增 pgoff 字段,记录 KSM 页面在其 anon_vma 中的线性页面偏移(linear page index)。关键设计——使用 union 将 pgoff 与仅在非稳定树中使用的 oldchecksumageremaining_skips 放在同一联合体中,使结构体大小保持在 64 字节不变。pgoff 在 try_to_merge_with_ksm_page() 中通过 linear_page_index(vma, rmap_item->address) 设置,在树节点移除和 COW 断开时清零。

核心优化:在 mm/ksm.c 的 rmap_walk_ksm() 中,将 anon_vma_interval_tree_foreach 的搜索范围从 0, ULONG_MAX 缩小为 pgoff, pgoff。由于区间树的搜索条件是 vm_pgoff <= pgoff <= vm_pgoff + vma_pages(v) - 1,给定精确的 pgoff 后,树遍历可以直接定位到包含该偏移的唯一 VMA,将迭代次数从 >22,000 降至 ~3。

诊断基础设施:在 mm/rmap.c 中新增 trace_rmap_walk_start/trace_rmap_walk_end 追踪点,使用静态分支(static branch)实现零开销禁用;新增 tools/testing/rmap/rmap_benchmark.c 基准测试工具。

收益

在 QEMU 环境中使用 rmap_benchmark 测试(20,000 个 VMA 共享同一 anon_vma):

指标
优化前
优化后
改善
最大延迟
705.12 ms
1.67 ms
降低 422 倍
平均延迟
532.04 ms
1.44 ms
降低 369 倍
anon_vma
 锁最差持有时间
>500 ms
<2 ms
消除长尾阻塞
区间树迭代次数
>22,000
~3
降低约 7000 倍

2. 跳过低阶原子分配时的 HighAtomic 整页块预留

系列[PATCH] mm/page_alloc: skip high atomic reservation at or below costly order作者: JP Kobryn版本: v1(1个patch)

背景

在生产环境中观察到一种模式:2MB THP(order-9)分配因碎片化失败并触发回收,尽管系统仍有大量空闲内存。通过 kprobe 探测发现,zone 有足够的空闲页供 order-9 分配,但这些页面并未被使用。进一步检查 /proc/pagetypeinfo 揭示了根因:order-9 块全部堆积在 zone 的 HighAtomic 桶中,而 Movable 桶中为零。THP 无法从 HighAtomic 桶分配页面,因为该桶不在 fallback 列表中。HighAtomic 预留的启发式规则是:任何大于 order-0 的原子分配都会导致整个页块(pageblock)被捕获。这意味着一次 order-1 的原子分配会过度预留 256 倍——整整一个 512 页(2MB)的页块。

解决的问题

  • 小阶(order-1 到 order-3)原子分配触发整页块(512 页,2MB)的 HighAtomic 预留,导致 256 倍的过度预留
  • 在大规模部署中,这导致每个主机平均 309-312 个 HighAtomic 页块(约 620MB,占 zone 的 1%),所有 order-9 块都被困在 HighAtomic 桶中
  • THP 成功率低至 1-6%,compaction 成功率 0-2%,且持续触发 kswapd 回收
  • 所有原子分配(均来自网络栈、btrfs 和调度器)都是 order 0-3,order-4+ 原子分配为零

如何做

在 mm/page_alloc.c 的 reserve_highatomic_pageblock() 函数开头增加一个 order 检查:若 order <= PAGE_ALLOC_COSTLY_ORDER(即 order 0-3),直接 return,跳过整页块预留。PAGE_ALLOC_COSTLY_ORDER 定义为 3,这是区分"低成本"和"高成本"分配的经典分界线。该检查放在函数最前,在计算 max_managed(1% zone 限制)等开销之前就快速返回。逻辑清晰直接:小阶原子分配不应捕获一个 2MB 级别的整页块,观察也确认所有原子分配均落在 order 0-3 范围内,因此限制不会拒绝任何真正需要大块的内核分配。

收益

在约 60 台 Instagram 生产主机(64GB 内存)上的 A/B 测试:

指标
未打补丁
打补丁后
变化
每主机 HighAtomic 页块数
309-312(~620MB,1% zone)
1
降低 300 倍
THP 成功率
1-6%
44-78%
提升约 15 倍
compaction 成功率
0-2%
24-47%
提升约 20 倍
kswapd 扫描(~60 台总计,每分钟)
~70.2M
~29.9M
降低 57%
order-4+ 原子分配
0
0
无退化

3. 通过上限 compact_gap() 对齐 compaction 水位线与扫描器能力

系列[PATCH] mm/compaction: cap compact_gap() at COMPACT_CLUSTER_MAX作者: JP Kobryn版本: v1(1个patch)

背景

compact_gap() 函数返回 2 << order,该值在 __compaction_suitable() 中作为空闲页水位的"余量"(headroom),同时在 kswapd 中作为回收目标。该值随 order 指数级增长:对于 order-9 的透明大页(THP)分配,计算结果为 1024 个页(4MB)。然而,compaction 自由页面扫描器的实际工作集受限于 COMPACT_CLUSTER_MAX(32 页)——扫描器在隔离的自由页面数量匹配迁移批次大小后即停止。当前 gap 值过度预留了 32 倍。代码中的注释曾认为"更复杂化的公式不值得,更大的 gap 对高阶分配有益",但生产数据证明相反。

解决的问题

  • 对于 order-9 的 THP 分配,compact_gap() 返回 1024 页,但 compaction 自由扫描器最多只需 32 页,多预留了 32 倍
  • 在碎片化的生产环境中,kswapd 只有 18% 的概率能达到该回收阈值,导致大部分时间持续无谓回收
  • 46% 的 order-9 compaction 适用性检查(__compaction_suitable())不必要地失败——zone 实际有足够自由页供扫描器运行,但不足以通过被放大的水位线

如何做

该 patch 在 include/linux/compaction.h 中的 compact_gap() 函数末尾添加 min() 限制,将返回值上限设为 COMPACT_CLUSTER_MAX(32 页)。改动极简:将 return 2UL << order; 改为 return min(2UL << order, COMPACT_CLUSTER_MAX);,并添加 #include <linux/swap.h> 头文件。order 0-4 不受影响,因为它们的 gap 值原本就小于等于 32。关键洞察在于:compaction 自由扫描器的隔离上限本就是 COMPACT_CLUSTER_MAX,水位线余量超过此值毫无意义,反而导致 __compaction_suitable() 错误地判定 zone 不适合 compaction,进而阻止 THP 分配并触发不必要的 kswapd 回收。

收益

在约 100 台 Instagram 生产主机(64GB 内存,60 秒采样)上的 A/B 测试:

指标
未打补丁(43 台)
打补丁后(59 台)
变化
kswapd 页扫描(平均每主机)
~1.6M
~449K
降低 3.6 倍
回收效率(steal/scan)
83.8%
91.0%
提升 7.2pp
compaction 成功率(success/stall)
2.1%
28.3%
提升 13 倍
THP 成功率(alloc/(alloc+fallback))
4.9%
17.2%
提升 3.5 倍
强制 lru_add_drain(平均每主机)
~107K
~64K
降低 40%

4. Per-CPU Work 辅助机制:消除 RT 场景的远程调度开销

系列[PATCH v4 0/4] Introduce Per-CPU Work helpers (was QPW)作者: Leonardo Bras, Marcelo Tosatti版本: v4(4个patch)

背景

内核中有相当多的子系统采用 "local_lock() 保护本地操作 + queue_work_on() 调度远程操作" 的并行编程模式,典型场景包括 LRU 缓释(lru_add_drain_all)、mlock 批处理、SLUB 每CPU缓存的冲刷。在非 RT 内核中,这种方式通过本地锁避免了锁竞争开销,少量的远程操作虽昂贵但可接受。然而在 PREEMPT_RT 内核中,local_lock() 会蜕变为 per-CPU 自旋锁(spinlock),此时仍然通过 schedule_work_on() 向远程 CPU 调度工作会产生不必要的上下文切换,对于运行低延迟实时任务的 CPU,"getting an important workload scheduled out to deal with remote requests is sure to introduce unexpected deadline misses"。

解决的问题

  • RT 内核中,远程 CPU 上的队列工作会打断低延迟实时任务,导致不可预期的 deadline 遗漏
  • 即使 local_lock() 已经变成了 spinlock(支付了加锁成本),仍然要承担 schedule_work_on() 的调度开销
  • 已有模式的 cache bouncing 无论如何都会发生(因为远程操作需要访问远程 CPU 的结构),因此直接用自旋锁保护不会引入额外开销

如何做

该系列引入了一个新的 Per-CPU Work(PW)抽象层,核心文件为 include/linux/pwlocks.h 和 kernel/pwlocks.c。其设计精髓在于利用内核配置和启动参数的组合来控制行为:

  • **CONFIG_PWLOCKS=n**(默认):所有 PW 接口直接退化为当前的实现,pw_lock() 等同于 local_lock()pw_queue_on() 等同于 queue_work_on()pw_flush() 等同于 flush_work(),零性能影响。
  • **CONFIG_PWLOCKS=y + pwlocks=1**:pw_lock(lock, cpu) 使用远程 CPU 的 per-CPU spinlock,pw_queue_on() 变为在当前 CPU 上直接调用工作函数(操作远程 per-CPU 数据结构),pw_flush() 变为空操作。

关键数据结构包括 pw_lock_t(联合体,封装 spinlock_t 和 local_lock_t)、pw_struct(包含 work_struct 和目标 CPU 信息)。该系列将 LRU 缓释(mm/swap.c)、mlock 批处理(mm/mlock.c)和 SLUB 每CPU sheaf 冲刷(mm/slub.c)转换为 PW 接口。

收益

作者提供了 kmalloc 基准测试数据(9,000,000 次迭代,64 字节分配):

配置
未打补丁
打补丁 PW=y, pwlocks=1
PREEMPT_DYNAMIC=y
60 cycles
75 cycles
PREEMPT_RT
95 cycles
97 cycles

PREEMPT_DYNAMIC 下 pwlocks=1 从 60 增加到 75 cycles(+25%),因为 spinlock 的原子操作开销高于 preempt_disable。但 PREEMPT_RT 下 pwlocks=1 与未打补丁的 95 cycles 基本持平(97 cycles)。关键在于:pwlocks=1 消除了对远程 CPU 上低延迟实时任务的调度干扰——"This will avoid schedule_work_on(), and thus avoid scheduling-out an RT workload"。


5. 按交换设备跳过零填充页检查:避免与后端重复检测

系列[RFC PATCH 0/2] mm: swap: allow per-device skipping of zero-filled page check作者: Youngjun Park版本: v1(2个patch)

背景

当前 swap 层在将页面写出到交换设备之前,会检查页面是否全为零。若页面全零,则通过 swap_zeromap_folio_set() 在集群 zeromap 中标记,从而避免实际的 I/O 操作。然而,某些交换后端(如 zram 和自定义交换设备)在内部已经执行了自己的相同填充页面检测(same-filled page checking)。这导致内核 swap 层和交换后端重复进行相同的零页检测,浪费 CPU 周期。此外,在不支持 SWAP_TABLE_HAS_ZEROFLAG 的架构上,swap 层还会为每个集群分配独立的 zero_bitmap,若设备不需要零页检测,则这些 bitmap 内存分配也是浪费。

解决的问题

  • swap 层的零页检查与 zram 等后端的内部相同页检测重复,造成冗余 CPU 开销
  • 在不支持 SWAP_TABLE_HAS_ZEROFLAG 的架构上,为不需要零页检测的设备分配了不必要的 zero_bitmap
  • 虽然传统交换设备(如 SSD swap)仍需零页检查来避免 I/O,但 zram 等后端无需此功能

如何做

该方案通过两个 patch 实现按设备粒度的零页检测跳过。核心机制是新增 SWAP_FLAG_SKIP_ZERO_CHECK(值 0x80000)作为 swapon() 系统调用的新标志,内部对应 swap_info_struct->flags 的 SWP_SKIP_ZERO_CHECK 位。在 swap_writeout() 写路径中,若设备设置了该标志,直接跳过 swap_zeromap_folio_set() 调用。同时在读路径 swap_read_folio_zeromap() 中也做相应守卫。在 swap_cluster_alloc_table() 中,若设备跳过零检查且架构不支持 SWAP_TABLE_HAS_ZEROFLAG,则跳过 zero_bitmap 的 bitmap 内存分配。

收益

作者未提供性能数据。从代码逻辑推断的预期收益:

  • 对启用了该标志的设备,每次 swap-out 省去整个 folio 的逐字节零检测扫描,对 order-0 页面省去 PAGE_SIZE 字节遍历,对大页(mTHP)省去更多
  • 在不支持 SWAP_TABLE_HAS_ZEROFLAG 的架构上,每个 swap 集群省去 zero_bitmap 内存分配和初始化开销

6. vrealloc() 收缩时释放未使用的物理页

系列[PATCH v14 0/5] mm/vmalloc: free unused pages on vrealloc() shrink作者: Shivam Kalra版本: v14(5个patch)

背景

内核 vrealloc() 函数可以对已有的 vmalloc 分配进行原地调整大小。当分配扩大时,如果虚拟地址空间中有足够的连续空间,会原地增长;但当分配缩小时,虽然会更新记账信息(requested_size、KASAN shadow),却从不释放底层物理页。这个机制缺陷导致收缩后的分配在整个生命周期内持续浪费物理内存。代码中一直保留着一条 TODO 注释:"Shrink the vm_area, i.e. unmap and free unused pages"。该系列填补了这一功能空白。

解决的问题

  • vrealloc() 收缩跨越页边界时,多余的尾页不被释放,造成物理内存浪费
  • 收缩后 get_vm_area_size() 与实际的已映射物理页数量不一致,导致 vread_iter()(/proc/vmallocinfo 读取路径)可能访问未映射区域
  • 旧的 grow-in-place 检查使用了虚拟区域大小而非物理页计数,在收缩后会产生错误判断

如何做

核心思路是利用已有的虚拟地址保留机制(不缩小 vm->size 和 vmap_area),仅在收缩时释放多余的物理页。先从 vfree() 中提取出 vm_area_free_pages() 辅助函数,使用 free_pages_bulk() 批量释放页面并完成 memcg 统计更新。将 grow-in-place 检查改为基于物理页计数(vm->nr_pages),让 vread_iter() 对 VM_ALLOC 类型使用 vm->nr_pages 推导区域大小。核心收缩逻辑:当 new_nr_pages < vm->nr_pages 且跨页边界时,在持有 vn->busy.lock 的情况下更新 vm->nr_pages,然后调用 vunmap_range() 解除尾页映射,最后调用 vm_area_free_pages() 释放物理页。该路径跳过大页分配、VM_FLUSH_RESET_PERMSVM_USERMAP 及 GFP_NOFS/GFP_NOIO 场景。

收益

作者未提供性能数据。从代码逻辑推断的预期收益:

  • 收缩路径跨页边界时触发物理页释放,避免整个分配生命周期内持续占用尾页内存
  • 虚拟地址空间保留不变,为未来原地增长保留可能性
  • Rust binder 驱动的 KVVec::shrink_to 接口可从中受益

7. arm64 架构的硬件内存错误恢复(ARCH_HAS_COPY_MC)

系列[PATCH v14 0/8] arm64: add ARCH_HAS_COPY_MC support作者: Ruidong Tian版本: v14(8个patch)

背景

随着内存容量和密度的增加,内存错误的概率也在上升。x86 和 powerpc 早已支持 ARCH_HAS_COPY_MC(Machine Check safe copy),在 COW(写时复制)、KSM 复制、coredump、khugepaged 等场景中,当从源页拷贝时遇到内存错误,可以优雅地隔离错误页并让调用者返回错误,而不是触发内核 panic。arm64 此前缺乏这一能力——"In arm64, memory error handling in do_sea()... if the kernel state consumed the memory errors, the solution is to panic"。对于装备大内存的 ARM 服务器(如 Grace、Vera),这一问题愈加严重。

解决的问题

  • arm64 内核态消费内存错误时无条件 panic,即使该错误仅影响单个用户进程(如 copy_to_user 期间源页损坏)
  • arm64 缺少对 copy_mc_to_user()copy_mc_to_kernel()copy_mc_highpage() 等 MC-safe 复制接口的架构支持
  • GHES SEA 处理中,对所有同步可恢复错误都标记为 MF_ACTION_REQUIRED 并发送 SIGBUS,但内核代用户空间执行 uaccess 时消费的内存错误应让系统调用返回 -EFAULT 而非杀进程

如何做

该系列建立了一个完整的 arm64 硬件内存错误恢复框架,分三个层次:

异常表扩展:在 arm64 的 extable 机制中新增 EX_TYPE_KACCESS_ERR_ZERO_MEM_ERR fixup 类型,并定义 KERNEL_MEM_ERR 汇编宏,用于标记可从内核内存访问错误中恢复的指令。__arch_copy_to_user() 中所有的加载指令都使用该宏包装。

SEA 处理框架改造:引入 enum context { IN_KERNEL, IN_USER },在 SEA 入口捕获 user_mode(regs) 信息。修改 SIGBUS 触发条件——只有当错误在用户态消费时才发送 SIGBUS 杀进程;内核态消费时走 memory_failure_queue(flags=0) 异步隔离,让 fixup 返回 -EFAULT

MC-safe 页面拷贝实现:通过将 copy_page() 的汇编逻辑提取为共享模板 copy_page_template.S,重构了 copy_page() 并新增 copy_mc_page()。同步新增 mte_copy_mc_page_tags() 支持 MTE 标签的 MC-safe 拷贝。将 copy_mc_[user_]highpage() 的返回值语义统一为:成功返回 0,失败返回 -EFAULT

收益

指标
数据
内核态 COW + page cache read 内存错误占比
>50%(华为存储产品统计)
打补丁后 COW/page cache 内存错误导致的 panic
全部消除
测试环境
Kunpeng 920
重构后反汇编内容
与重构前一致
COW/copy_from_user/get_user 错误处理
打补丁前 panic,打补丁后仅隔离错误页

8. DAMON 数据属性监控:从访问监控到通用数据属性引擎

系列[PATCH 00/28] mm/damon: introduce data attributes monitoring作者: SeongJae Park版本: v1(28个patch)

背景

DAMON(Data Access MONitor)最初设计为数据访问监控器,后续扩展了 DAMOS(数据访问感知的系统操作)。但监控部分始终仅限于数据访问模式。用户需要更全面的视图——例如,运维巨页效率的工程师想知道 DAMON 发现的热/冷区域中有多少是大页支持的,运行多 cgroup 工作负载的用户想知道热/冷区域中各 cgroup 的占比。6.14 内核已合入了基于 DAMOS 的页级别属性监控,但它以页为粒度遍历整个 DAMON 区域,"the overhead is proportional to the memory size","obviously too heavy to be enabled always on all machines running the real user workloads"。

解决的问题

  • 现有基于 DAMOS 的页级属性监控开销与内存大小成正比,无法在生产环境全时启用
  • 用户需要低开销方式了解热/冷内存的数据属性(如属于哪个 cgroup、是否为大页)
  • DAMON 缺乏灵活的、可扩展的数据属性探测框架

如何做

核心设计是在 DAMON 访问采样点复用监控能力,以极低额外开销引入"数据探针"(data probe)机制。每个探针(struct damon_probe)携带一组过滤器(struct damon_filter,与 DAMOS filter 同构),在 DAMON 检查每个采样地址是否被访问的同时,遍历已注册的数据探针并判断该地址是否满足探针的过滤条件。匹配结果累加到 damon_region->probe_hits[],与 nr_accesses 在同一聚合间隔中维护。在物理地址监控层(paddr ops),damon_pa_apply_probes() 根据探针的过滤器检查采样地址对应 folio 的属性。用户接口通过 DAMON sysfs 暴露探针配置路径和结果读取路径。新增 damon_region_aggregated tracepoint 用于通过 tracefs 获取数据。

收益

作者未提供性能数据。从代码逻辑推断的预期收益:

  • 数据属性检查复用访问采样的时刻和地址,"the upper-bounded and best-effort minimum overhead of DAMON is kept"
  • 相比 DAMOS 页级属性监控遍历每个 folio(O(内存大小)),探针方式仅在采样点检查,开销降为 O(region 数量 × 探针数量)
  • 当前限制最多 4 个探针,作者计划未来移除此限制

9. 开放 HugeTLB 分配例程以支持无 VMA 的通用分配

系列[PATCH v3 0/6] Open HugeTLB allocation routine for more generic use作者: Ackerley Tng版本: v3(6个patch)

背景

当前 Linux 内核的 HugeTLB 分配核心函数 alloc_hugetlb_folio() 强依赖于 struct vm_area_struct(VMA),因为需要通过 VMA 来查找预留(reservation)信息和获取内存策略(mempolicy)。作者指出:"alloc_hugetlb_folio() was so coupled to a VMA that even HugeTLBfs allocates HugeTLB folios using a pseudo-VMA." 这一限制阻碍了 guest_memfd 等新子系统使用 HugeTLB 作为通用大页来源。

解决的问题

  • HugeTLB 分配核心函数与 VMA 过度耦合,无法用于无 VMA 场景
  • 内存策略的解析与实际的 buddy 分配和 dequeue 操作混杂在一起
  • 预留检查和全局池可用性检查泄漏到 dequeue_hugetlb_folio_vma() 中

如何做

系列的核心思路是将 alloc_hugetlb_folio() 拆分为两层:底层是通用的 hugetlb_alloc_folio(),只关注分配本身和 cgroup 计费;上层 alloc_hugetlb_folio() 保留 VMA 相关的预留逻辑。引入 struct mempolicy_interpreted 承载"已解析的内存策略"。通过六步重构:将参数解析上移、重命名函数移除 VMA 参数、提取 hugetlb_alloc_folio() 作为公开接口。新接口接收 hstatesubpoolgfpmempolicy_interpreted 和 alloc_flags 参数,其中 alloc_flags 使用位掩码,包含 HUGETLB_ALLOC_CHARG_CGROUP_RSVD 和 HUGETLB_ALLOC_USE_GLOBAL_RESERVATIONS

收益

作者未提供性能数据。从代码逻辑推断的预期收益:

  • 解除 HugeTLB 分配对 VMA 的硬依赖,guest_memfd 可直接分配大页而不需要伪 VMA
  • alloc_flags 位掩码机制使未来增加分配控制选项无需扩展函数签名
  • 测试确认 libhugetlbfs 测试全部通过

10. cgroup/dmem:允许 dmem 分配向 memcg 双重计费

系列[PATCH v2 0/2] cgroup/dmem: allow double-charging dmem allocations to memcg作者: Eric Chanudet版本: v2(2个patch)

背景

设备内存(dmem,device memory)cgroup 子系统用于控制设备端内存(如 GPU VRAM)的分配配额。当前,dmem cgroup 的计费与内存 cgroup(memcg)完全分离。这意味着一个 cgroup 中的 dmem 分配虽然限制了 GPU 内存使用,但不计入内存控制器限额,管理员无法通过统一的 memory.max 限制来约束进程的总内存消耗(系统 RAM + 设备内存)。

解决的问题

  • dmem cgroup 与 memory cgroup 各自独立计费,无法统一限制进程的总内存使用
  • 管理员缺少控制接口来决定是否对特定 dmem 区域启用 memcg 计费
  • memcg 侧缺少专门的 dmem 计费统计条目

如何做

该系列从 memcg 侧和 cgroup 侧分别实现。在 mm/memcontrol.c 中新增 mem_cgroup_dmem_charge/uncharge() 函数,通过 cgroup_get_e_css() 解析出有效的 memory css 并执行计费,同时引入新的统计计数器 MEMCG_DMEM。cgroup 侧设计了精巧的 4 状态机(OFF/ON/LOCKED_OFF/LOCKED_ON)管理计费开关,状态转换通过 atomic_cmpxchg() 实现无锁原子操作,首次计费后锁定配置防止 TOCTOU 竞争条件。dmem 子系统显式声明了对 memory cgroup 的依赖。

收益

作者未提供性能数据。从代码逻辑推断的预期收益:

  • 管理员可通过统一的 memory.max 同时约束系统 RAM 和 GPU 等设备内存的总消耗
  • memory.stat 中新增的 dmem 条目使设备内存消耗可精确观测
  • 默认关闭(DMEM_MEMCG_OFF),对现有用户零影响

11. arm64:从线性映射中取消映射内核 data/bss 的可写别名

系列[PATCH v5 00/13] arm64: Unmap linear alias of kernel data/bss作者: Ard Biesheuvel版本: v5(13个patch)

背景

在 arm64 架构上,内核线性映射(linear/direct map)缺乏随机化,这使得线性映射中内核 data/bss 的可写别名成为一个严重的安全隐患。问题尤为突出的是,遵循原始 arm64 启动协议的引导加载程序——这涵盖了"大量 Android 手机"——会将内核放置在 DRAM 基地址处,导致内核在线性映射中的别名位于完全可预测的位置。如作者所言:"This puts a writable alias of the kernel's data and bss regions at a predictable location, removing the need for an attacker to guess where KASLR mapped the kernel."

解决的问题

  • 遵循原始 arm64 启动协议的设备上,内核 data/bss 的可写线性别名位于可预测地址
  • 线性映射中 data/bss 读写并存,为攻击者提供可预测的写入目标,绕过 KASLR
  • 静态分配的内核页表(fixmap page tables)散布在 BSS 中,阻碍对整个 data/bss 区域的统一处理

如何做

系列通过 13 个 patch 逐步构建基础设施并实现 data/bss 线性别名取消映射,分为三个阶段:

基础设施清理:将线性别名 text/rodata 映射为 tagged 类型确保 MTE 兼容;将 empty_zero_page[] 声明为 const 放入 .rodata;修改 init_pmd()/alloc_init_pud() 在映射 DRAM 时保留已存在的表映射和离散描述符。

分离 fixmap 页表:通过链接脚本修改,将 fixmap 页表从 BSS 段移出到新的 .fixmap_pgdir 段。如作者所述:"These page tables are currently the only data objects in vmlinux that are meant to be accessed via the kernel image's linear alias."

取消映射 data/bss:核心函数 remap_linear_data_alias() 使用 set_memory_valid() API 取消映射 data/bss 线性别名(范围从 __init_end 到 __fixmap_pgdir_start)。对于休眠场景,注册 PM notifier 回调自动管理映射/取消映射。

收益

作者未提供性能数据。从代码逻辑推断的预期收益:

  • 攻击者即使获知线性映射地址,也无法写入内核 data/bss(页面被取消映射,访问触发异常)
  • 对遵循原始 arm64 启动协议的大量 Android 设备提供实质性的内核数据保护
  • 通过将 empty_zero_page 设为 const,所有架构获得零页线性别名只读的连带安全收益

12. KHO:始终打印 scratch 区域大小

系列[PATCH] kho: always print scratch sizes作者: Pratyush Yadav版本: v1(1个patch)

背景

KHO(Kexec HandOver)是内核的活跃更新(live update)机制,它在 kexec 过程中保留 scratch 缓冲区以跨越内核版本传递状态。当前,scratch 区域的大小打印仅在用户通过内核引导参数显式指定大小时触发。当大小由运行时根据 RSRV_KERN 类型预留区域自动计算时,这些关键信息完全不输出。作者指出:"These prints are completely useless. When the user specified the size on the command line, they already know how large the scratch areas are."

解决的问题

  • scratch 区域大小只在用户显式指定时才打印——已知内容打印无价值
  • 运行时计算的大小从不打印,而这是真正有用的调试信息
  • KHO 分配失败时,计算出的 scratch 大小无法从 debugfs 获取,故障排查困难

如何做

一个简洁的单 patch 修改:从 kho_parse_scratch_size() 中移除旧的 pr_notice() 调用;在 kho_reserve_scratch() 中实际分配前加入 pr_notice() 打印最终大小(无论来自命令行还是运行时计算);遍历 NUMA 节点时新增每个节点的 scratch 大小打印。打印时机安排在分配操作之前,确保分配失败时大小信息已可用。

收益

作者未提供性能数据。从代码逻辑推断的预期收益:

  • 内核日志中始终包含 scratch 区域大小信息,不再依赖命令行参数
  • 每个 NUMA 节点的 scratch 大小独立可见,便于诊断节点级分配失败
  • 打印在分配之前执行,确保分配失败时大小信息已可用

总结

新机制 / 新接口

#
系列
要点
6
vrealloc() shrink
 [v14, 5p]
vrealloc() 收缩时释放未使用物理页
7
arm64 COPY_MC
 [v14, 8p]
arm64 硬件内存错误恢复框架,消除 COW 场景 panic,>50% 内核态内存错误可恢复
8
DAMON data attributes
 [v1, 28p]
通用数据属性监控引擎,O(内存) → O(region) 开销降低
9
HugeTLB generic alloc
 [v3, 6p]
解耦 VMA 依赖,提取 hugetlb_alloc_folio() 供 guest_memfd 等使用
10
cgroup/dmem memcg
 [v2, 2p]
允许 dmem 分配向 memcg 双重计费,统一 total memory 约束
11
arm64 unmap data/bss
 [v5, 13p]
取消映射内核 data/bss 线性可写别名,保护 Android 等设备免受可预测地址攻击
12
kho scratch print
 [v1]
始终打印 scratch 区域大小,改进 liveupdate 故障诊断

性能优化

#
系列
量化数据
1
KSM rmap optimization
 [v5, 5p]
anon_vma 锁持有: 705ms→1.67ms(422x),迭代次数 22000→3
2
skip high atomic reserve
 [v1]
THP 成功率 1-6%→44-78%(15x),kswapd 扫描降 57%,HighAtomic 页块降 300x
3
cap compact_gap()
 [v1]
THP 成功率 4.9%→17.2%(3.5x),compaction 成功率 2.1%→28.3%(13x)
4
Per-CPU Work helpers
 [v4, 4p]
RT 内核消除 schedule_work_on() 调度干扰,kmalloc 保持 97 cycles
5
swap skip zero check
 [v1, 2p]
每 swap-out 省去 PAGE_SIZE 零检测扫描,按需跳过 zero_bitmap 分配

Bug Fix

#
系列
影响
hugetlb reservation leak
 [v2]
userfaultfd resubmission 路径 VMA reservation 泄漏
kho order calculation
 [v1]
unpreserve 路径缺少 NUMA 节点边界检查
page_isolation underflow
 [v1]
folio 并发释放导致扫描步长下溢
x86 vmemmap leak
 [v1]
内存热移除时 vmemmap PMD 页泄漏(~16MB/GB)
kho scratch alignment
 [v1]
命令行 scratch 大小未对齐 CMA_MIN_ALIGNMENT_BYTES
slub refcount leak
 [v1]
kobject_init_and_add() 失败时未调用 kobject_put()
userfaultfd VMA snapshot
 [v1]
MAP_PRIVATE/SHARED 切换漏检可导致 BUG()
rmap nr_pages init
 [v1]
上次 folio_unmap_pte_batch() 的 nr_pages 被复用致 refcount 损坏
slabinfo utility fix
 [v2, 3p]
trace 禁用逻辑反置
damon tried region leak
 [RFC v2]
CONFIG_DEBUG_KOBJECT_RELEASE 延迟回调致链表损坏和 UAF
memcg NMI slab stats
 [v1]
NMI 更新的 slab 统计未传播到 memcg 级 vmstats
memcg obj_stock cache
 [v3]
修复 67.7% stress-ng 性能回归,跨 NUMA sibling objcg 无法共享 per-CPU reserve

最新文章

随机文章

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