当前位置:首页>Linux>Linux 6.6 内核同步原语深度解析:自旋锁(Spinlock)

Linux 6.6 内核同步原语深度解析:自旋锁(Spinlock)

  • 2026-02-08 17:26:57
Linux 6.6 内核同步原语深度解析:自旋锁(Spinlock)

自旋锁是Linux 内核中用于多处理器环境下保护共享资源的同步机制:当一个CPU持有锁时,其他试图获取该锁的CPU将持续循环等待(即自旋),直至锁被释放。它适用于临界区极短且不可睡眠的上下文(如中断处理),以最小开销实现高效互斥,是内核高并发执行的基石之一

一、自旋锁基础概念:为什么需要它?

在多核处理器(SMP)系统中,多个CPU核心可以同时执行内核代码。当它们需要访问共享资源(如一个全局链表、硬件寄存器等)时,必须进行协调,以防止数据竞争和不一致。这就是同步的必要性。

1.1 什么是自旋锁?

自旋锁(Spinlock)是Linux内核中最基础、最高效的互斥同步原语之一。其核心思想极其简单:

  • 加锁(Lock):尝试将一个标志位(通常是一个整数)从“未锁定”状态原子地设置为“已锁定”状态。
  • 等待(Wait):如果发现锁已被其他 CPU 持有,当前 CPU 不会进入睡眠状态,而是在一个循环里不停地检查(即“自旋”)这个标志位,直到它变为“未锁定”。
  • 解锁(Unlock):将标志位原子地重置为“未锁定”状态。

关键特性

  • 忙等待(Busy-waiting):这是自旋锁最显著的特点。等待期间,CPU 会持续消耗计算资源。
  • 短持有时间:正因为是忙等待,自旋锁只适用于保护非常短小的临界区。如果临界区执行时间过长,会让其他 CPU 空转,浪费大量 CPU 周期,严重降低系统整体性能。
  • 不可睡眠:在持有自旋锁期间,绝对不能调用任何可能导致进程睡眠(schedule())的函数,例如 copy_to_userkmalloc(GFP_KERNEL) 等。因为一旦睡眠,持有锁的进程被换出,其他所有等待该锁的 CPU 将永远自旋下去,形成死锁。

1.2 自旋锁 vs. 互斥锁(Mutex)

理解自旋锁的最佳方式是与互斥锁对比。

特性
自旋锁 (Spinlock)
互斥锁 (Mutex)
等待方式
忙等待(自旋):CPU循环检查锁状态。
睡眠等待:无法获取锁时,进程主动让出 CPU,进入睡眠队列。
适用场景
临界区极短(几条指令到微秒级),且不能睡眠的上下文(如中断处理程序)。
临界区较长,且运行在进程上下文(可以安全睡眠)。
上下文
可在中断上下文使用(通过 spin_lock_irqsave 等变体)。
仅限于进程上下文。
开销
等待时开销巨大(浪费 CPU),但获取/释放本身开销极小(无上下文切换)。
获取/释放涉及上下文切换,开销较大,但等待时不消耗 CPU。
调度友好性
不友好。低优先级任务持锁时,高优先级任务只能空转,无法抢占。
友好。高优先级任务睡眠后,调度器可运行其他任务。

总结:自旋锁是“时间换空间”的策略,用 CPU 时间换取了极低的锁操作延迟;而互斥锁是“空间换时间”,用上下文切换的开销换取了 CPU 资源的有效利用。

1.3 基本原理剖析

让我们看一个简化版的自旋锁实现逻辑,它揭示了背后的核心机制。

voidspin_lock(spinlock_t *lock) {    // 1. 禁用内核抢占    preempt_disable();    // 2. 原子地尝试获取锁    while (!atomic_try_cmpxchg(&lock->val, UNLOCKED, LOCKED)) {        // 3. 获取失败,自旋等待        cpu_relax(); // 提示CPU优化自旋循环    }    // 4. 内存屏障,确保临界区内的读写不会被重排到锁外    smp_mb();}voidspin_unlock(spinlock_t *lock) {    // 1. 内存屏障,确保临界区内的所有操作都已完成    smp_mb();    // 2. 原子地释放锁    atomic_set(&lock->val, UNLOCKED);    // 3. 恢复内核抢占    preempt_enable();}
  • preempt_disable/enable()
    防止在持有锁的过程中被调度器抢占。想象一下,如果一个CPU拿到锁后被抢占,另一个同优先级的进程在同一CPU上运行并也试图拿这把锁,就会造成死锁(因为锁永远不会被释放)。禁用抢占保证了持有锁的代码能一气呵成地执行完。
  • atomic_try_cmpxchg
    这是一个原子的“比较并交换”(Compare-and-Swap, CAS)操作。它是实现无锁(lock-free)算法的基础。只有当lock->val的当前值等于UNLOCKED时,才会将其设为LOCKED并返回成功。
  • cpu_relax()
    这是一个架构相关的提示指令(如x86的pause)。它告诉CPU当前处于自旋等待状态,CPU可以据此进行优化,比如降低功耗、减少对内存子系统的压力、避免内存顺序问题等。
  • smp_mb()
    这是一个SMP内存屏障。它强制CPU在执行后续指令前,必须完成所有之前的内存读写操作。这对于保证临界区内的操作不会被编译器或CPU乱序执行到锁的外面至关重要,从而维护了程序的逻辑正确性。

二、传统自旋锁实现 (kernel/locking/spinlock.c):宏的艺术

Linux 内核早期的自旋锁实现相对直接,但为了支持各种变体(如关中断、关软中断等),巧妙地使用了 C 语言的宏来生成大量重复但模式固定的代码。

2.1 文件结构分析

spinlock.c 的核心是 BUILD_LOCK_OPS 宏。通过三次调用这个宏,内核一次性构建了自旋锁(spin)、读写锁的读操作(read)和写操作(write)的所有变体函数。

// 构建三种锁的操作集BUILD_LOCK_OPS(spin, raw_spinlock);BUILD_LOCK_OPS(read, rwlock);BUILD_LOCK_OPS(write, rwlock);

2.2 BUILD_LOCK_OPS 宏详解

这个宏是代码生成的典范。我们以 BUILD_LOCK_OPS(spin, raw_spinlock) 为例,看看它会展开成什么。

#define BUILD_LOCK_OPS(op, locktype) \void __lockfunc __raw_##op##_lock(locktype##_t *lock) { \    for (;;) { \        preempt_disable(); \        if (likely(do_raw_##op##_trylock(lock))) \            break; \        preempt_enable(); \        arch_##op##_relax(&lock->raw_lock); \    } \\/* ... 其他变体如 _irqsave, _irq, _bh ... */

展开后,会得到如下函数:

void __raw_spin_lock(raw_spinlock_t *lock) {    for (;;) {        preempt_disable();        if (likely(do_raw_spin_trylock(lock)))            break;        preempt_enable();        arch_spin_relax(&lock->raw_lock);    }}

关键点解析

  • for(;;) 循环:实现了自旋等待的逻辑。
  • preempt_disable/enable 的位置:注意,在每次尝试获取锁之前禁用抢占,在失败之后立即恢复抢占。这是一种精细的控制,避免了在长时间自旋期间完全禁用抢占,提高了系统的响应性。
  • do_raw_spin_trylock:这是一个架构相关的底层函数(通常在 arch/*/include/asm/spinlock.h 中定义),它负责执行实际的原子 CAS 操作。
  • arch_spin_relax:最终会调用到cpu_relax(),用于优化自旋循环。

其他变体

  • _irqsave/_irqrestore
    在尝试获取锁之前,不仅禁用抢占,还会保存并禁用本地 CPU 的中断。这是因为在中断处理程序中也可能使用同一把锁。如果不在加锁时关中断,就可能发生中断嵌套导致的死锁。解锁时再恢复之前的中断状态。
  • _bh (Bottom Half)
    用于保护可能被软中断(如网络协议栈下半部)访问的临界区。它内部会调用 _irqsave 来确保安全,然后禁用软中断

2.3 锁操作的完整流程

以 spin_lock_irqsave 为例:

  1. 调用 __raw_spin_lock_irqsave
  2. 进入无限循环。
  3. 禁用抢占。
  4. 保存并禁用本地中断。
  5. 尝试原子获取锁。
  6. 如果成功,跳出循环,函数返回保存的中断标志。
  7. 如果失败,恢复中断、恢复抢占,然后调用 arch_spin_relax 优化自旋,接着回到步骤 2 继续尝试。

2.4 自旋锁API详解

用户通常不会直接调用 __raw_* 函数,而是使用更高级的封装:

  • spin_lock()/spin_unlock(): 最基本的加锁/解锁。
  • spin_lock_irqsave(flags)/spin_unlock_irqrestore(flags): 最常用的变体,安全地处理中断上下文。
  • spin_lock_bh()/spin_unlock_bh(): 用于处理软中断竞争。

2.5 架构相关实现

cpu_relax() 是一个典型的例子,不同 CPU 架构有不同的最优实现:

  • x86: pause 指令,能有效降低超线程(Hyper-Threading)下的资源争用。
  • ARM: yield 或 wfe (Wait For Event) 指令,提示 CPU 可以进入低功耗状态或让出执行单元。

三、队列自旋锁(Qspinlock)详解:为可扩展性而生

随着CPU核心数量的激增(数十甚至上百核),传统自旋锁暴露了一个致命缺陷:缓存行颠簸(Cache Line Bouncing)

3.1 为什么需要队列自旋锁?

在传统自旋锁中,所有等待的CPU都在同一个内存地址(锁变量)上执行原子操作。每当一个CPU成功获取或释放锁,这个地址所在的缓存行就会在所有CPU的缓存之间来回传递(Invalidate -> Fetch -> Invalidate...),产生巨大的总线流量和延迟。这种现象被称为“缓存行颠簸”,严重限制了系统的可扩展性。

队列自旋锁(Queued Spinlock) 的解决方案是:让每个等待者在自己的私有内存(通常是 per-CPU 变量)上自旋。这样,每个CPU只关心自己的状态,大大减少了对共享内存的竞争。

3.2 MCS 锁算法原理

Qspinlock 的核心思想源自经典的MCS(Mellor-Crummey and Scott)锁算法。

  • 数据结构

    • struct mcs_spinlock { struct mcs_spinlock *next; int locked; }
      : 每个等待者都有一个这样的节点。
    • struct mcs_lock { struct mcs_spinlock *tail; }
      : 锁本身只维护一个指向队列尾部的指针。
  • 加锁流程

    1. 新来的线程将自己的节点 node 的 next 设为 NULLlocked 设为 0
    2. 通过原子 xchg 操作,将 lock->tail 更新为自己,并拿到旧的尾节点 prev
    3. 如果 prev 为 NULL,说明队列为空,自己直接获得锁。
    4. 否则,将 prev->next 指向自己的 node,然后在自己的 node->locked 字段上自旋,等待前驱节点通知。
  • 解锁流程

    1. 检查自己的 node->next 是否为 NULL
    2. 如果是,说明自己是最后一个,尝试用 cmpxchg 将 lock->tail 清零。
    3. 如果不是,或者清零失败(说明有新节点加入),就将 node->next->locked 设置为 1唤醒下一个等待者

关键优势每个CPU只在自己的locked字段上自旋,这个字段位于自己的缓存行中,不会引起全局缓存颠簸。

3.3 Qspinlock 数据结构

Linux 的 Qspinlock 对 MCS 算法进行了高度优化,将状态压缩到一个 32 位整数中,以追求极致的性能。

struct qspinlock {    union {        atomic_t val;        struct {            u8 locked;      // [7:0]   锁是否被持有            u8 pending;     // [15:8]  是否有一个等待者即将成为持有者            u16 tail;       // [31:16] 队列尾部信息(编码了CPU ID和嵌套层级)        };    };};

此外,每个CPU都预分配了4个qnode(对应 4 层锁嵌套),避免了动态内存分配的开销。

3.4 Qspinlock 状态机

Qspinlock 设计了一个精巧的状态机,以处理 1-2 个 CPU 竞争的常见情况,避免直接进入慢速的队列路径。

  1. Unlocked (0): 初始状态。
  2. Locked (1): 一个 CPU 持有锁。这是最常见的状态。
  3. Pending (0x100): 当第二个 CPU 到来时,它不会立刻排队,而是先尝试将 pending 位置 1。如果此时第一个 CPU 正好释放了锁(locked 变 0),那么第二个 CPU 就可以直接将 pending 清零并置 locked 为 1,从而快速获得锁。这避免了不必要的队列操作。
  4. Queued/Multi-queued: 第三个及以后的 CPU 到来时,会真正进入 MCS 队列,在自己的节点上等待。

3.5 Qspinlock 加锁/解锁流程

  • 加锁 (queued_spin_lock):

    1. 快速路径:尝试直接 CAS locked 位。成功则返回。
    2. Pending 路径:如果 pending位空闲,尝试设置它。如果此时 locked 位恰好被释放,则自己获得锁。
    3. 慢速路径 (queued_spin_lock_slowpath):进入完整的 MCS 队列流程,获取 per-CPU 节点,加入队列,在自己的0locked字段上自旋。
  • 解锁 (queued_spin_unlock):

    1. 原子地减去 locked 位的值。
    2. 如果结果为 0,说明没有等待者,直接返回。
    3. 否则,调用 __raw_spin_unlock_wait,它会找到队列头部的节点,并将其locked字段置 1,从而唤醒下一个等待者。

四、虚拟化下的队列锁(PV Qspinlock):与 Hypervisor 协作

在虚拟化环境中(如 KVM, Xen),vCPU 可能被 Hypervisor 抢占。如果一个 vCPU 持有锁后被抢占,其他 vCPU 会在物理 CPU 上疯狂自旋,浪费宝贵的物理资源。

4.1 为什么需要虚拟化优化?

传统自旋在这种场景下效率极低。PV(Paravirtualized)自旋锁通过让 Guest OS 与 Hypervisor 协作来解决此问题。

4.2 PV Qspinlock关键操作

  • pv_wait: 当一个 vCPU 发现前驱节点(锁持有者)对应的 vCPU 并未在物理CPU上运行时,它不会自旋,而是调用 pv_wait。这会向 Hypervisor 发出一个请求:“请在我需要的 vCPU 被调度时唤醒我”。然后,该 vCPU 主动进入睡眠,释放物理 CPU。
  • pv_kick: 当锁被释放时,Hypervisor 会被通知去“踢醒”(kick)下一个等待的 vCPU,使其尽快被调度。

4.3 PV Qspinlock 优势

这种机制将忙等待转变为协作式等待,极大地节省了物理 CPU 资源,显著提升了虚拟化环境下的性能和可扩展性。

五、乐观自旋队列(OSQ Lock):为 Mutex 而生

OSQ(Optimistic Spin Queue)并不是一个独立的锁类型,而是作为 Mutex 和 Rwsem 等睡眠锁的优化而存在的。

5.1 OSQ 锁概述

当一个线程尝试获取一个已被持有的 Mutex 时,传统做法是立刻进入睡眠。但 OSQ 认为:“也许锁持有者很快就会释放锁,让我等一会儿再睡吧!”

5.2 OSQ 工作原理

  • 乐观自旋:尝试获取锁的线程首先会进行一段短暂的“乐观自旋”。它假设锁持有者正在运行,并且很快会释放锁。
  • MCS 队列:自旋过程同样基于 MCS 队列,避免缓存颠簸。
  • 可取消性:这是 OSQ 的关键。在自旋过程中,它会不断检查:
    • 锁是否已被释放?
    • 当前 CPU 是否应该被抢占(need_resched())?
    • 锁持有者是否被抢占(vcpu_is_preempted
  • 如果以上任一条件满足,自旋就会优雅地退出,并将自己从队列中移除,然后才进入真正的睡眠状态。

优势:对于那些持有时间极短的 Mutex,OSQ 可以避免昂贵的上下文切换开销,显著提升性能。

六、调试与性能分析:让锁无所遁形

内核提供了强大的工具来分析锁的性能和正确性。

  • CONFIG_DEBUG_SPINLOCK: 启用后,会对锁的使用进行合法性检查(如双重解锁、未初始化锁等),帮助发现编程错误。
  • CONFIG_LOCK_STAT: 启用锁统计功能。通过 /proc/lock_stat 可以查看每把锁的竞争次数平均等待时间持有时间等关键指标,是性能调优的利器。
  • perf lock: 用户态工具,可以记录和报告整个系统或特定进程的锁事件,直观地展示锁的竞争热点。
  • ftrace: 内核的动态追踪框架,可以通过 lock 事件来追踪锁的获取和释放过程。

七、总结与最佳实践

  • 选择合适的锁短临界区、中断上下文 → Spinlock;长临界区、进程上下文 → Mutex/Rwsem
  • 遵守铁律:持有自旋锁时绝不能睡眠绝不能调用可能睡眠的函数
  • 性能优化
    • 尽可能缩小临界区。
    • 考虑使用 Per-CPU 变量来消除共享。
    • 对于读多写少的场景,使用 RCU 或读写锁。
  • 学习路径:从 kernel/locking/spinlock.c 开始,理解传统模型;再深入 kernel/locking/qspinlock.c,掌握现代高性能队列锁的设计精髓。

*往期文章回顾*

linux内核调试子系统

linux内核内存管理子系统

linux设备驱动子系统

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 22:46:05 HTTP/2.0 GET : https://f.mffb.com.cn/a/474333.html
  2. 运行时间 : 0.129966s [ 吞吐率:7.69req/s ] 内存消耗:4,813.23kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=2707c5ede19a4fd7493f8198b4d2d62b
  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.000540s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000612s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001053s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000292s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000618s ]
  6. SELECT * FROM `set` [ RunTime:0.002843s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000729s ]
  8. SELECT * FROM `article` WHERE `id` = 474333 LIMIT 1 [ RunTime:0.000795s ]
  9. UPDATE `article` SET `lasttime` = 1770561965 WHERE `id` = 474333 [ RunTime:0.008500s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.015538s ]
  11. SELECT * FROM `article` WHERE `id` < 474333 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.004608s ]
  12. SELECT * FROM `article` WHERE `id` > 474333 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000441s ]
  13. SELECT * FROM `article` WHERE `id` < 474333 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.008563s ]
  14. SELECT * FROM `article` WHERE `id` < 474333 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.010446s ]
  15. SELECT * FROM `article` WHERE `id` < 474333 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005319s ]
0.131527s