当前位置:首页>Linux>Linux MM 2026-04-16 最新 Feature 分析报告

Linux MM 2026-04-16 最新 Feature 分析报告

  • 2026-07-02 21:11:48
Linux MM 2026-04-16 最新 Feature 分析报告

目录

  1. DAMON_STAT 新增 kdamond_pid 参数
  2. Swap Table Phase IV: 统一分配、消除静态 cgroup 数组
  3. slub: 修复 krealloc() 中的数据丢失和缓冲区溢出
  4. 锁竞争释放 tracepoint 通用插桩
  5. KHO 支持 deferred struct page init
  6. kvfree_rcu() 改进:struct rcu_ptr 与 nolock 变体

1. DAMON_STAT 新增 kdamond_pid 参数

系列[RFC PATCH v1.2 0/2] mm/damon/stat: add kdamond_pid parameter作者: SeongJae Park(DAMON maintainer)版本: RFC v1.2(2个patch)

背景

DAMON(Data Access MONitor)是 Linux 内核中的数据访问监控框架,其工作线程称为 kdamond。在 DAMON 的多种使用模式中,DAMON_SYSFS、DAMON_RECLAIM 和 DAMON_LRU_SORT 都通过各自的只读模块参数 kdamond_pid 暴露其工作线程的 PID,方便用户空间监控 DAMON 的系统资源消耗(如 CPU 使用率、调度统计等)。然而,DAMON_STAT 模块作为 DAMON 的统计信息收集接口,却缺少这一参数,导致用户空间对 DAMON_STAT 的管理"unnecessarily complicated"(作者原文)。这种不一致也破坏了 DAMON 各模块之间接口的统一性。

解决的问题

  1. DAMON_STAT 缺少 kdamond_pid 参数,用户空间无法直接获知其工作线程 PID,无法便捷地监控 DAMON_STAT 的资源消耗。
  2. DAMON 模块之间接口不统一:DAMON_RECLAIM 和 DAMON_LRU_SORT 均提供同名只读参数 kdamond_pid,而 DAMON_STAT 缺失。

如何做

Patch 1 在 mm/damon/stat.c 中新增一个静态变量 kdamond_pid,初始值为 -1,并通过 module_param() 注册为只读(权限 0400)的模块参数:

staticint kdamond_pid __read_mostly = -1;
module_param(kdamond_pid, int0400);

在 damon_stat_start() 函数中,当 DAMON context 成功启动后,调用 damon_kdamond_pid(damon_stat_context) 获取工作线程 PID 并赋值给 kdamond_pid。如果获取失败(返回负值),则进行完整的错误处理:将 kdamond_pid 重置为 -1,销毁 context 并返回错误码。在 damon_stat_stop() 中,停止 DAMON 时将 kdamond_pid 重置为 -1。这个设计保证了该参数在 DAMON_STAT 未启用时始终为 -1,启用时为有效的工作线程 PID。

Patch 2 在 Documentation/admin-guide/mm/damon/stat.rst 中添加了 kdamond_pid 参数的文档说明,描述其语义:"If DAMON_STAT is enabled, this becomes the PID of the worker thread. Else, -1."

收益

这个改动使 DAMON_STAT 与 DAMON_RECLAIM、DAMON_LRU_SORT 的用户空间接口保持一致,"makes DAMON modules usage more standardized"(作者原文)。用户空间工具可以通过读取 /sys/module/damon_stat/parameters/kdamond_pid 来获取 DAMON_STAT 工作线程的 PID,进而利用标准的 procfs 或 cgroup 接口监控其资源消耗。改动量极小(共新增 25 行),风险低,是纯粹的接口完善。


2. Swap Table Phase IV: 统一分配、消除静态 cgroup 数组

系列[PATCH v2 00/11] mm, swap: swap table phase IV: unify allocation and reduce static metadata作者: Kairui Song(Tencent)版本: v2(11个patch)

背景

Linux 内核的 swap 子系统长期以来存在多处静态元数据开销和分散的代码路径问题。在此系列之前,swap 子系统维护着一个独立的 swap_cgroup 静态数组(mm/swap_cgroup.c),按每个 swap 设备预分配,用于记录每个 swap slot 所属的 memory cgroup(内存控制组)。对于大容量 swap 设备,这个数组带来了巨大的内存开销——例如挂载 1TB swap 设备时,该数组约消耗 512MB 内存(约每个 slot 2 字节)。此外,匿名页(anon)和共享内存(shmem)的 swap cache 分配与 swapin 路径各自实现了独立的 THP(Transparent Huge Page,透明大页)回退、memcg 查找和 zeromap 检查逻辑,代码冗余且 TOCTOU(Time-of-Check-to-Time-of-Use)竞态窗口较大。同时,zeromap(零页位图)作为独立的 kvmalloc 分配的 bitmap 存在于 swap_info_struct 中,也贡献了一部分静态开销。

解决的问题

  1. 静态 cgroup 数组的巨大内存开销:1TB swap 设备消耗约 512MB 内存用于 swap_cgroup_ctrl 数组。
  2. anon 和 shmem swapin 路径分散:两者各自实现 THP 分配、回退、swap cache 检查和 memcg 充值逻辑,代码重复且维护困难。
  3. TOCTOU 竞态窗口:高阶 swapin 需要先检查 swap cache 状态,再单独分配和回退,检查与操作之间存在竞态。
  4. zeromap 独立 bitmap 的静态开销:需要在 swapon 时预分配与 swap 设备大小相当的位图。
  5. memcg 接口冗余:cgroup v1 的 memsw 辅助函数传递冗余参数(swap entry 和 page count),而这些信息可以从 folio 本身获取。

如何做

整个系列从六个维度重构 swap 子系统的元数据管理:

第一步:统一 swap cache 分配接口(Patch 1-2)。 Patch 1 简化 swap_cache_alloc_folio(),移除 alloced 输出参数,将其拆分为纯分配函数和包含 readahead 的内部辅助函数。分配失败返回 ERR_PTR 而非 NULL,使错误处理更加明确。Patch 2 将 swap cache 的添加和删除操作进一步拆分为 __swap_cache_add_check()__swap_cache_do_add_folio() 和 __swap_cache_do_del_folio() 等粒度更细的辅助函数,为后续在 cluster lock 下执行原子操作做准备。

第二步:统一大页分配路径(Patch 3, 5)。 Patch 5 是核心重构,引入统一的 swapin_entry() 函数替代原来 anon 和 shmem 各自独立的分配路径。新的 swap_cache_alloc_folio() 接受 orders 位掩码,在内部以紧凑循环处理高阶分配、回退和 swap cache 冲突检测,"previously, high order swapin required checking swap cache states first, then allocating and falling back separately. Now all these steps happen in the same compact loop"(作者原文)。

第三步:整理 cgroup v1 memsw 接口(Patch 6)。 将 memcg1_swapout() 重命名为 __memcg1_swapout(),将 memcg1_swapin() 改为从 folio 自身获取 swap entry 和页数,移除冗余参数。

第四步:将 memcg 查找移入 cluster lock 保护(Patch 7-8)。 Patch 8 将 mem_cgroup_swapin_charge_folio() 的 memcg 查找从 swap entry 改为直接传入 cgroup id,并在 __swap_cache_add_check() 中于 cluster lock 下完成 cgroup id 的读取和一致性检查。

第五步:消除静态 swap_cgroup 数组(Patch 9-10)。 Patch 9 为每个 swap_cluster_info 新增 memcg_table 指针,指向动态分配的 struct swap_memcg_table(内含 unsigned short id[SWAPFILE_CLUSTER],大小 1024 字节),在集群被隔离分配时才 kmalloc。Patch 10 删除整个 mm/swap_cgroup.c 文件(172行)和 include/linux/swap_cgroup.h 头文件。

第六步:合并 zeromap 到 swap table(Patch 11)。 在 swap table entry 的位布局中新增 1 位 SWP_TB_ZERO_MARK 标记零页,swap_info_struct 中的 unsigned long *zeromap 字段被完全移除。

收益

内存节省方面,作者给出了 1TB swap 设备的实测对比:改动前系统已用内存 805MB,改动后仅 277MB,"Memory usage is ~512M lower, and we now have a close to 0 static overhead. It was about 2 bytes per slot before, now roughly 0.09375 bytes per slot"(作者原文)。

性能提升方面,多个 benchmark 均显示改善:

  • Redis(1.5G VM + 5G ZRAM):从 3,048,029 RPS 提升到 3,068,843 RPS(**+0.68%**)
  • 内核编译(48c96t,8G RAM + 12G ZRAM,make -j96 defconfig):system time 从 4774s 降到 4642s(**-2.77%**)
  • usemem(32c,48G ramdisk + 16G RAM):吞吐从 6011 MB/s 提升到 6079 MB/s,free latency 从 401ms 降到 391ms

最终变更统计为 709 行新增、825 行删除,在减少代码量的同时实现了功能增强。


3. slub: 修复 krealloc() 中的数据丢失和缓冲区溢出

系列[PATCH] slub: fix data loss and overflow in krealloc()作者: Marco Elver(Google)版本: v1(1个patch)

背景

commit 2cd8231796b5("mm/slub: allow to set node and align in k[v]realloc")为 krealloc() 引入了强制重新分配的能力:即使对象正在缩小(shrink),如果原始对象不满足新的对齐要求(alignment)或 NUMA 节点约束(__GFP_THISNODE),也会跳转到 alloc_new 路径分配新对象。然而,这个跳转在代码流程中的位置存在严重问题,引入了两个 bug。

解决的问题

  1. NUMA 迁移时的数据丢失:在 __do_krealloc() 中,当检测到 NUMA 节点不匹配时,代码通过 goto alloc_new 跳转到新分配路径。然而,该跳转位于 ks(ksize,对象实际大小)和 orig_size(原始请求大小)初始化之前。alloc_new 路径中的 memcpy(ret, kasan_reset_tag(p), orig_size ?: ks) 会使用未初始化的值(均为 0),导致拷贝 0 字节——旧数据完全丢失
  2. 缩小对象时的缓冲区溢出:当缩小对象同时强制新对齐时,new_size 小于旧对象大小。但 memcpy() 使用的是旧大小 orig_size ?: ks,而非 min(new_size, orig_size ?: ks),导致向新分配的(更小的)对象写入超出边界的数据——越界写入(OOB write)
  3. kvrealloc() 回退路径的同类溢出:在 kvrealloc_node_align_noprof() 中,memcpy(n, kasan_reset_tag(p), ksize(p)) 同样未限制拷贝长度。

如何做

修复包含两个关键改动:

第一,修复代码顺序。将 __GFP_THISNODE 检测跳转移到 ks 和 orig_size 初始化之后:

// 修复前:goto alloc_new 在 ks/orig_size 初始化之前
if (unlikely(flags & __GFP_THISNODE) && nid != NUMA_NO_NODE &&
             nid != page_to_nid(virt_to_page(p)))
goto alloc_new;

// 修复后:移到 ks/orig_size 初始化之后
if (is_kfence_address(p)) {
    ks = orig_size = kfence_ksize(p);
else {
// ... ks, orig_size 初始化
}
// 然后才检查 NUMA 节点
if (unlikely(flags & __GFP_THISNODE) && ...)
goto alloc_new;

第二,限制 memcpy 拷贝长度。在 alloc_new 路径中将 memcpy 的拷贝大小从 orig_size ?: ks 改为 min(new_size, (size_t)(orig_size ?: ks)),确保不会超出新分配的边界。同样在 kvrealloc_node_align_noprof() 中将 ksize(p) 改为 min(size, ksize(p))

收益

该补丁修复了两个安全关键 bug。缓冲区溢出已通过 KFENCE 复现,作者提供了完整的复现路径:

while (1) {
void *p = kmalloc(128, GFP_KERNEL);
    p = krealloc_node_align(p, 64256, GFP_KERNEL, NUMA_NO_NODE);
    kfree(p);
}

KFENCE 报告显示越界写入位于 kfence 分配对象右侧 120 字节处("Out-of-bounds write at 0xffff8883ad757038 (120B right of kfence-#47)"),对象大小为 64 字节的 kmalloc-64 slab。补丁标记了 Cc: <stable@vger.kernel.org> 和 Fixes: 2cd8231796b5,需要回合到稳定分支。修改量仅 12 行增加、12 行删除,定向精确。


4. 锁竞争释放 tracepoint 通用插桩

系列[PATCH v5 0/7] locking: contended_release tracepoint instrumentation作者: Dmitry Ilvokhin版本: v5(7个patch)

背景

Linux 内核的锁竞争(lock contention)分析一直依赖 contention_begin 和 contention_end 两个 tracepoint,它们在等待者(waiter)一侧触发。虽然通过 perf lock contention --lock-owner 可以在 contention_begin 时捕获持有者(holder)的身份和调用栈,但这反映的是"等待者到达时持有者的状态",而非锁真正被释放时的状态。如果持有者在等待者到达后还做了大量工作,那么实际的释放路径和持有时间都无法被准确追踪。此外,由于缺少持有者侧的释放事件,也无法直接测量锁在竞争状态下的持有时间(hold time under contention)。Matthew Wilcox 曾建议应当"try to come up with generic instrumentation, instead of instrumenting each special lock manually",推动了该系列向通用化方向演进。

解决的问题

  1. 缺乏持有者视角的释放追踪:现有 tracepoint 只在 waiter 侧触发,无法获取 holder 在释放锁时的调用栈(release stack),而该调用栈可能与 waiter 到达时截然不同。
  2. 无法测量竞争态持有时间:缺少 holder 侧的释放事件,导致无法计算从获取到释放之间的精确持有时长。
  3. 覆盖范围不全:锁类型繁多(mutex、rtmutex、semaphore、rwsem、percpu-rwsem、qspinlock、qrwlock 及 RT 特化锁),需要在各类锁的释放路径中统一插桩。

如何做

整个方案以一个新的 trace event contended_release 为核心,在 include/trace/events/lock.h 中定义。该事件仅记录锁地址(lock_addr),精简高效:

TRACE_EVENT(contended_release,
    TP_PROTO(void *lock),
    TP_ARGS(lock),
    TP_STRUCT__entry(__field(void *, lock_addr)),
    TP_fast_assign(__entry->lock_addr = lock;),
    TP_printk("%p", __entry->lock_addr)
);

方案的实现分为三个层次:

第一层:准备与清理(Patch 1-2)。Patch 1 移除 lock.h 中不必要的 #include <linux/sched.h>。Patch 2 将 percpu_up_read() 的慢路径从内联函数中提取为独立的 __percpu_up_read(),避免在内联函数中添加 tracepoint 导致二进制膨胀。

第二层:可睡眠锁的插桩(Patch 3)。在 mutex(__mutex_unlock_slowpath())、rtmutex(rt_mutex_slowunlock())、semaphore(up())、rwsem(__up_read()/__up_write()/__downgrade_write())、percpu-rwsem 等的释放路径中添加 trace_contended_release() 调用。关键设计原则:tracepoint 尽可能在锁释放之前、唤醒等待者之前触发,以保证调用栈的准确性。每个插入点都有对应的等待者检查条件。

第三层:自旋锁的插桩(Patch 4-7)。自旋锁的解锁路径(queued_spin_unlock)通常是内联的、性能极其敏感的热路径。方案采用分层重构:Patch 4 引入 queued_spin_release() 作为架构可覆盖(arch-overridable)的解锁原语。Patch 5 在 queued_spin_unlock() 中利用 tracepoint_enabled(contended_release) 静态分支判断是否启用追踪。当禁用时,热路径仅多一条 NOP 指令;当启用时,调用 out-of-line 的 queued_spin_release_traced() 函数。Patch 6-7 对 qrwlock 采用完全相同的策略。

收益

  1. 填补观测性空白:首次为锁的持有者释放路径提供通用 tracepoint,使得 perf、BPF 等工具可以追踪任意锁的释放行为和调用栈。
  2. 竞争态持有时间测量:通过将 contention_end(获取)与 contended_release(释放)进行关联,实现精确的持有时间估算。
  3. 极低的运行时开销:x86_64 defconfig(uninlined unlock)下,二进制增加仅 +680 bytes(+0.00%);即使在最坏的 inlined unlock 场景下也仅为 +83659 bytes(+0.21%)。
  4. 全面覆盖:涵盖 mutex、rtmutex、semaphore、rwsem、percpu-rwsem、qspinlock、qrwlock 以及 RT 特化锁共 8 类锁原语。

5. KHO 支持 deferred struct page init

系列[PATCH v8 0/2] kho: add support for deferred struct page init作者: Michal Clapinski(Google)、Evangelos Petrongonas(Amazon);Co-developed-by Mike Rapoport(Microsoft)版本: v8(2个patch)

背景

KHO(Kexec HandOver)是 Linux 内核的实时更新机制,允许在 kexec 重启过程中将内存区域从旧内核传递给新内核,从而保留关键状态。KHO 使用 scratch memory 来存放传递所需的元数据,并在新内核启动后将 preserved pages 的元数据写入对应的 struct page 中。然而,当 CONFIG_DEFERRED_STRUCT_PAGE_INIT 开启时,高地址区域的 struct page 初始化会被推迟到启动后期的并行 kthread 中完成。这导致 KHO 在早期尝试访问尚未初始化的 struct page 会触发 page fault("BUG: unable to handle page fault for address: ..."),而后期的 deferred init 又会覆盖 KHO 已写入的元数据(如 migratetype 设置)。因此,KHO 的 Kconfig 中此前直接声明了 depends on !DEFERRED_STRUCT_PAGE_INIT,两者完全不兼容。

解决的问题

  1. KHO 无法与 deferred struct page init 共存:这两个重要特性之间存在硬性的 Kconfig 互斥依赖,严重限制了大内存系统上 KHO 的使用。大内存系统恰恰最需要 deferred init 来加速启动,也最可能需要 KHO 来实现零停机更新。
  2. KHO preserved pages 的 struct page 可能未初始化:在 KHO 反序列化阶段,kho_preserved_memory_reserve() 需要写入 struct page 元数据,但目标页的 struct page 可能尚未初始化。
  3. KHO scratch memory 的 migratetype 被覆盖kho_release_scratch() 将 scratch 区域设为 MIGRATE_CMA,但后续 deferred_init_pages() 会将其覆盖为 MIGRATE_MOVABLE

如何做

Patch 1:使 preserved pages 与 deferred init 兼容。 引入 kho_get_preserved_page() 函数,在 kho_preserved_memory_reserve() 调用 phys_to_page() 之前,确保目标范围内所有 struct page 已被初始化。当 CONFIG_DEFERRED_STRUCT_PAGE_INIT 开启时,通过 early_pfn_to_nid() 获取 NUMA 节点 ID,然后逐页调用 init_deferred_page(pfn, nid)——该函数对已初始化的页是 no-op。同时调用 memblock_reserve() 标记该区域为 noinit,确保 deferred init kthread 不会再重新初始化这些页。移除了 Kconfig 中的 depends on !DEFERRED_STRUCT_PAGE_INIT 限制。

Patch 2:修复 scratch area 的 deferred init。 删除旧的 kho_release_scratch() 函数,转而在 deferred init 的各个初始化路径中直接识别 KHO scratch 区域。引入 memblock_is_kho_scratch_memory() 查询函数,在三个关键初始化函数中嵌入处理逻辑:

  • memmap_init_range():在 pageblock 对齐判断中,KHO scratch region 的 migratetype 设为 MIGRATE_CMA
  • deferred_init_memmap_chunk():对 KHO scratch range 将 migratetype 改为 MIGRATE_CMA 并传递给 deferred_free_pages()
  • memmap_init_reserved_range():在 reserved 的 scratch 页上设置 MIGRATE_CMA

收益

  1. 解除功能互斥:大内存服务器可以同时使用 deferred struct page init(加速启动)和 KHO(实时内核更新),这对 TB 级内存的高可用生产环境至关重要。
  2. 正确性保证:通过在初始化路径中原地处理 KHO scratch 的 migratetype,从根本上避免了竞争条件。作者进行了全面测试:涵盖 core_initcall(early)和 module_init(late)的分配、kexec 传递和恢复,在 DEFERRED 开启/关闭两种配置下均通过。
  3. 代码简化:删除了 kho_release_scratch() 和 memmap_init_kho_scratch_pages() 两个专用函数共约 35 行代码,将逻辑分散到已有的通用初始化路径中。

6. kvfree_rcu() 改进:struct rcu_ptr 与 nolock 变体

系列[RFC PATCH v2 0/8] kvfree_rcu() improvements作者: Harry Yoo(Oracle)版本: RFC v2(8个patch)

背景

k[v]free_rcu() 是 Linux RCU 子系统的核心 API,用于在 grace period 之后批量释放对象,广泛应用于 slab 分配器、文件系统、网络等子系统。现有实现存在两个显著局限:其一,双参数形式 kfree_rcu(ptr, rhf) 要求对象中嵌入 struct rcu_head(16 字节,含 next 指针和 func 回调指针),但 k[v]free_rcu() 的回调永远是 kvfree(),因此 func 字段本质上是浪费的;其二,kfree_rcu() 在调用时需要获取 per-CPU 的 krcp->lock 自旋锁,这意味着在未知上下文(unknown context)中不能安全调用——例如 BPF 程序可能运行时 CPU 已经持有了 krcp->lock,导致死锁。

解决的问题

  1. struct rcu_head 浪费 8 字节:在 64 位系统上,struct rcu_head 占 16 字节,但 k[v]free_rcu() 只需要一个 next 指针来链接对象,多出的 func 指针(8 字节)被浪费。
  2. 缺少 unknown context 下的 kfree_rcu 变体:BPF 程序可能附着在任意内核函数上运行,此时无法确定是否可以安全地 spin on a lock。"even calling call_rcu() is not legal, forcing users to implement some sort of deferred freeing"。

如何做

方案分为两大部分共 8 个 patch。

Part 1:引入 struct rcu_ptr(Patch 1-2)。 在 include/linux/types.h 中定义新类型 struct rcu_ptr,在 CONFIG_KVFREE_RCU_BATCHED=y 时仅包含一个 next 指针(8 字节),在 =n 时退化为与 struct rcu_head 相同大小。kvfree_rcu_arg_2 宏通过 C11 的 _Generic 泛型选择机制同时接受 struct rcu_head * 和 struct rcu_ptr *,保持向后兼容。在内部实现上,kvfree_rcu_list() 不再从 head->func 读取对象起始地址,而是通过新的 object_start_addr() 辅助函数动态推算。Patch 2 将 fs/dcache.c 中的 struct external_name 从 struct rcu_head head 改为 struct rcu_ptr rcu,作为首个用户示例。

Part 2:引入 kfree_rcu_nolock()(Patch 3-8)。 Patch 4 引入 kfree_rcu_nolock(ptr, rf) 宏,通过 allow_spin = false 标识调用方无法安全自旋。内部实现采用多层降级策略:

  1. 首先尝试 trylockkrc_this_cpu_lock() 在 allow_spin = false 时使用 raw_spin_trylock()。作者认为"in practice, it's not held most of the time"。
  2. trylock 成功时:使用已缓存的 bnode 存储指针,工作调度通过 irq_work 延迟执行,避免直接调用可能会 spin 的 workqueue API。
  3. trylock 失败时:将对象插入 per-CPU 的无锁链表 defer_headstruct llist_head),并触发非懒惰 irq_workdefer_free),在 IRQ work 上下文中重新调用 kvfree_call_rcu() 完成释放。

Patch 5 教会 rcu sheaf 层处理 !allow_spin 场景。Patch 7 实现 rcu sheaf 的延迟提交(deferred submission):引入新的 per-CPU defer_call_rcu_headstruct llist_head),当 !allow_spin && irqs_disabled() 时,通过无锁链表和 IRQ work 在安全上下文中再调用 call_rcu()

作者选择了方案 (b)——将 deferred call_rcu 逻辑限制在 slab 子系统内,而非实现通用的 call_rcu_nolock(),原因是通用方案"would need to flush deferred callbacks before rcu_barrier() to preserve its guarantee, increasing the cost of rcu_barrier() for all RCU users"。Patch 8 添加 kunit 测试,在 perf overflow handler(NMI/硬中断上下文)中验证 kfree_rcu_nolock() 的正确性。

收益

  1. 每对象节省 8 字节:使用 struct rcu_ptr 后,每个仅通过 k[v]free_rcu() 释放的对象节省一个指针大小。以 dcache 的 external_name 为例,作者系统有 230k 个长文件名对象,潜在节省约 1.8 MB。对于 BPF map 等分配量极大的场景,节省更为可观。
  2. 解锁 BPF 在 NMI/硬中断上下文的 RCU 释放能力kfree_rcu_nolock() 使 BPF 程序可以在任意上下文中安全释放 RCU 保护的对象。
  3. 局部化开销:deferred call_rcu 逻辑封装在 slab 内部,"only kvfree_rcu_barrier() pays the extra cost",不影响其他 RCU 用户的 rcu_barrier() 性能。

总结

新机制 / 新接口

#
系列
要点
1
DAMON_STAT kdamond_pid
 [RFC v1.2, 2p]
为 DAMON_STAT 新增只读 kdamond_pid 模块参数,统一 DAMON 各模块的用户空间接口
4
contended_release tracepoint
 [v5, 7p]
在 8 类锁原语的释放路径中新增通用 tracepoint,填补持有者侧观测性空白
5
KHO deferred page init
 [v8, 2p]
解除 KHO 与 DEFERRED_STRUCT_PAGE_INIT 的 Kconfig 互斥,使大内存系统可同时使用
6
kvfree_rcu() improvements
 [RFC v2, 8p]
引入 8 字节 struct rcu_ptr 和 kfree_rcu_nolock() API,支持 BPF 在 NMI/硬中断上下文释放对象

性能优化

#
系列
量化数据
2
swap table phase IV
 [v2, 11p]
1TB swap 内存开销降低 ~512MB;Redis +0.68%,内核编译 system time -2.77%

Bug Fix

#
系列
影响
3
slub krealloc() 数据丢失/溢出
 [v1]
NUMA 迁移时 memcpy 0 字节丢数据 + 缩小对象时 OOB write;Fixes: 2cd8231796b5

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 22:54:43 HTTP/2.0 GET : https://f.mffb.com.cn/a/487237.html
  2. 运行时间 : 0.210117s [ 吞吐率:4.76req/s ] 内存消耗:4,863.48kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=89618c276c927308a6aed43aa5932c9e
  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.000602s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000867s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.033330s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.002279s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000690s ]
  6. SELECT * FROM `set` [ RunTime:0.006088s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000601s ]
  8. SELECT * FROM `article` WHERE `id` = 487237 LIMIT 1 [ RunTime:0.000904s ]
  9. UPDATE `article` SET `lasttime` = 1783090483 WHERE `id` = 487237 [ RunTime:0.009212s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000741s ]
  11. SELECT * FROM `article` WHERE `id` < 487237 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.005633s ]
  12. SELECT * FROM `article` WHERE `id` > 487237 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004445s ]
  13. SELECT * FROM `article` WHERE `id` < 487237 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.019346s ]
  14. SELECT * FROM `article` WHERE `id` < 487237 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.028731s ]
  15. SELECT * FROM `article` WHERE `id` < 487237 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005136s ]
0.211727s