当前位置:首页>Linux>Linux内核同步机制深度解析:从自旋锁到RCU的演进##

Linux内核同步机制深度解析:从自旋锁到RCU的演进##

  • 2026-01-04 06:41:54
Linux内核同步机制深度解析:从自旋锁到RCU的演进##

目录

  1. 1. 引言:并发编程的挑战与Linux内核演进
  2. 2. 基础同步原语:自旋锁与信号量
  3. 3. 读写锁机制:rwlock与rw_semaphore
  4. 4. 互斥锁进化:从mutex到rt_mutex
  5. 5. RCU革命:Read-Copy-Update深度剖析
  6. 6. PREEMPT_RT实时补丁:锁的范式转变
  7. 7. 生产环境:最佳实践与性能调优

1. 引言:并发编程的挑战与Linux内核演进

技术背景

在现代多核处理器系统中,并发访问共享资源是内核设计的核心挑战。Linux内核从早期的单处理器时代发展到今天的数百核系统,同步机制经历了革命性演进:

1991-2000: 简单自旋锁 + 关中断2000-2010: Mutex/RWLock标准化2010-2020: RCU普及 + PREEMPT_RT2020-2025: 新型锁机制 + 硬件加速

核心问题

  • • 竞态条件:多个执行流同时修改共享数据
  • • 死锁:循环等待导致系统挂起
  • • 性能开销:锁竞争导致CPU空转
  • • 实时性:传统锁无法满足低延迟需求

本文目标

  • • 深入理解Linux内核锁机制的设计哲学
  • • 掌握不同锁类型的适用场景性能特征
  • • 学习PREEMPT_RT下的锁范式转变
  • • 探索RCU的无锁读取实现原理

2. 基础同步原语:自旋锁与信号量

自旋锁 (Spinlock)

基本原理

自旋锁是忙等待锁,当线程无法获取锁时,会在CPU上循环自旋:

// 自旋锁定义spinlock_t lock;spin_lock_init(&lock);// 临界区保护spin_lock(&lock);// 访问共享资源shared_data++;spin_unlock(&lock);

工作流程

  1. 1. 尝试获取锁(原子操作)
  2. 2. 成功:进入临界区
  3. 3. 失败:CPU循环检查(自旋)
  4. 4. 释放锁:唤醒等待者

类型与变体

// 标准自旋锁(可抢占)spinlock_t lock;// 原始自旋锁(不可抢占)raw_spinlock_t raw_lock;// 底层自旋锁(中断安全)unsignedlong flags;local_irq_save(flags);// 临界区local_irq_restore(flags);

关键区别

  • • spinlock_t:在PREEMPT_RT下变为互斥锁
  • • raw_spinlock_t:始终忙等待,用于核心代码
  • • local_irq_save:禁用中断,用于中断处理程序

性能特征

优点

  • • ✅ 无上下文切换开销
  • • ✅ 适用于短临界区
  • • ✅ 实现简单

缺点

  • • ❌ CPU空转浪费
  • • ❌ 不适用于长临界区
  • • ❌ 单处理器上退化为禁用抢占

适用场景

  • • 中断处理程序(< 1μs)
  • • 短小的临界区(< 10μs)
  • • 高频访问的计数器

信号量 (Semaphore)

基本原理

信号量是计数型锁,支持多个访问者:

// 定义信号量(初始值为1)structsemaphoresem;sema_init(&sem, 1);// 获取信号量(可睡眠)down(&sem);// 临界区shared_data++;up(&sem);

操作类型

  • • down():获取信号量,失败则睡眠
  • • down_trylock():非阻塞尝试
  • • down_interruptible():可被信号中断
  • • up():释放信号量

关键特性

// 二元信号量(初始值1)sema_init(&sem, 1);// 计数信号量(允许N个并发)sema_init(&sem, N);// 读写信号量(多读单写)structrw_semaphorerwsem;init_rwsem(&rwsem);

PREEMPT_RT行为

  • • 信号量不受PREEMPT_RT影响
  • • 保持原有语义(无所有者概念)
  • • 无法提供优先级继承

适用场景

  • • 资源池管理(数据库连接)
  • • 生产者-消费者模型
  • • 需要睡眠的长等待

3. 读写锁机制:rwlock与rw_semaphore

读写自旋锁 (rwlock_t)

设计哲学

允许多个读者并发,但写者独占:

// 定义读写锁rwlock_t rw_lock;rwlock_init(&rw_lock);// 读操作(共享)read_lock(&rw_lock);// 读取数据read_unlock(&rw_lock);// 写操作(独占)write_lock(&rw_lock);// 修改数据write_unlock(&rw_lock);

实现原理

// 简化的rwlock状态structrwlock_t {union {atomic_t counter;struct {// 高16位:读者计数// 低16位:写者标志        };    };};

获取读锁

  1. 1. 原子递增读者计数
  2. 2. 检查是否有写者(低16位)
  3. 3. 无写者:成功
  4. 4. 有写者:自旋等待

获取写锁

  1. 1. 原子设置写者标志
  2. 2. 等待所有读者退出
  3. 3. 独占访问

PREEMPT_RT转变

在实时内核中,rwlock_t映射到rt_mutex

// 非PREEMPT_RT:忙等待// PREEMPT_RT:可睡眠,支持优先级继承

影响

  • • 读操作可能被写者阻塞
  • • 支持优先级继承
  • • 避免读者饿死写者

读写信号量 (rw_semaphore)

增强功能

比rwlock更强大,支持更复杂的语义:

structrw_semaphorerwsem;init_rwsem(&rwsem);// 读操作down_read(&rwsem);// 读取数据up_read(&rwsem);// 写操作down_write(&rwsem);// 修改数据up_write(&rwsem);// 降级(写→读)downgrade_write(&rwsem);

关键特性

状态表示

// 简化的状态机// 正数:读者数量// -1:写者独占// <-1:写者等待者

升级/降级

  • • downgrade_write():写锁降级为读锁(不释放重获取)
  • • 提高性能:写操作完成后转为读操作

PREEMPT_RT问题

文档指出的缺陷

"On PREEMPT_RT, a preempted low-priority reader will continue holding its lock, thus starving even high-priority writers"

原因

  • • 读者无所有者概念
  • • 无法优先级继承
  • • 高优先级写者被低优先级读者阻塞

解决方案

  • • 使用percpu_rw_semaphore(每CPU读写信号量)
  • • 或使用RCU替代

4. 互斥锁进化:从mutex到rt_mutex

标准互斥锁 (mutex)

基本API

structmutexmutex;mutex_init(&mutex);// 获取锁(可睡眠)mutex_lock(&mutex);// 临界区mutex_unlock(&mutex);// 非阻塞尝试if (mutex_trylock(&mutex)) {// 成功获取    mutex_unlock(&mutex);}

内部实现

structmutex {atomic_t count;      // 1: unlocked, 0: lockedstructlist_headwait_list;// 等待队列structtask_struct *owner;// 持有者(用于调试)};

获取流程

  1. 1. 原子递减count
  2. 2. 若成功(count >= 0):获取锁
  3. 3. 若失败(count < 0):加入等待队列,调度出去
  4. 4. 释放时:唤醒等待者

关键特性

  • • ✅ 可睡眠:等待时不消耗CPU
  • • ✅ 可调试:记录持有者,检测死锁
  • • ✅ 递归检测:防止同一线程重复获取
  • • ❌ 无优先级继承:可能导致优先级反转

实时互斥锁 (rt_mutex)

优先级继承 (Priority Inheritance)

问题:优先级反转

高优先级任务T1 → 等待 → 低优先级任务T2T2被中优先级任务T3抢占结果:T1被T3间接阻塞(优先级反转)

解决方案:优先级继承

T2继承T1的高优先级T3无法抢占T2T1快速获得锁

实现

structrt_mutex {raw_spinlock_t wait_lock;    // 保护等待队列structrb_root_cachedwaiters;// 优先级队列structtask_struct *owner;// 持有者};// 使用(与mutex相同API)structrt_mutexrt_lock;rt_mutex_init(&rt_lock);rt_mutex_lock(&rt_lock);rt_mutex_unlock(&rt_lock);

动态优先级调整

// 当T1等待T2的锁时voidadjust_priority(struct task_struct *waiter,struct task_struct *holder) {// 1. 计算继承优先级int new_prio = min(waiter->prio, holder->prio);// 2. 更新持有者优先级    holder->prio = new_prio;// 3. 传播到持有者的持有者(链式继承)if (holder->blocked_on)        adjust_priority(waiter, holder->blocked_on);}

PREEMPT_RT下的转变

关键变化

// 非PREEMPT_RTspinlock_t → raw_spinlock_t(忙等待)// PREEMPT_RTspinlock_t → rt_mutex(可睡眠+优先级继承)

影响

  • • ✅ 消除优先级反转
  • • ✅ 支持实时调度
  • • ⚠️ 增加上下文切换开销
  • • ⚠️ 不能用于中断上下文

5. RCU革命:Read-Copy-Update深度剖析

RCU核心思想

Read-Copy-Update:读取-复制-更新

// 传统锁:读也互斥read_lock(&lock);data = shared_data;read_unlock(&lock);// RCU:读完全无锁data = rcu_dereference(shared_data);// 更新:复制后原子替换structnew_data *new = kmalloc(...);memcpy(new, old);new->field = value;rcu_assign_pointer(shared_data, new);// 延迟释放旧数据call_rcu(&old->rcu, free_old_data);

三阶段协议

1. 读取阶段 (Read)

// 无锁读取rcu_read_lock();  // 仅禁用抢占(非锁)p = rcu_dereference(pointer);  // 内存屏障// 使用prcu_read_unlock();  // 启用抢占

关键点

  • • rcu_read_lock()不阻塞其他读者
  • • 禁用抢占:确保读者不被迁移到其他CPU
  • • rcu_dereference():确保看到完整初始化的数据

2. 更新阶段 (Copy-Update)

// 复制旧数据structentry *new = kmem_cache_alloc(cache);*new = *old;  // 浅拷贝// 修改副本new->value = new_value;// 原子替换指针rcu_assign_pointer(global_ptr, new);// 标记旧数据待释放kmem_cache_free(cache, old);

关键点

  • • rcu_assign_pointer():确保新数据初始化完成后再发布
  • • 旧数据仍可被未完成的读者访问

3. 宽限期 (Grace Period)

// 释放旧数据的回调voidfree_old_data(struct rcu_head *head) {structentry *old = container_of(head, struct entry, rcu);    kmem_cache_free(cache, old);}// 注册回调call_rcu(&old->rcu, free_old_data);

宽限期原理

CPU0: 读者A进入RCU读临界区CPU1: 更新者替换指针CPU2: 读者B使用新指针CPU3: 读者C使用新指针宽限期结束条件:所有CPU都经历过一次上下文切换→ 保证所有旧读者已完成→ 安全释放旧数据

RCU实现机制

经典RCU (Classic RCU)

// 读端rcu_read_lock();p = rcu_dereference(ptr);// 使用prcu_read_unlock();// 写端new = copy_and_update(old);rcu_assign_pointer(ptr, new);call_rcu(&old->rcu, free_func);

宽限期检测

  • • 每个CPU维护quiescent state(静止状态)
  • • 当所有CPU都经历quiescent state,宽限期结束
  • • 触发回调执行

读写RCU (URCU)

// 读端(可睡眠)rcu_read_lock();p = rcu_dereference(ptr);// 使用prcu_read_unlock();// 写端(同步更新)synchronize_rcu();  // 等待宽限期// 安全修改数据

区别

  • • synchronize_rcu():阻塞直到宽限期结束
  • • call_rcu():异步回调

任务RCU (Task RCU)

// 用于可睡眠的长读临界区rcu_read_lock_sched();// 可以睡眠的读操作rcu_read_unlock_sched();

适用场景

  • • 文件系统目录遍历
  • • 内存管理操作

RCU性能分析

优势

读性能

自旋锁:读需要获取锁 → ~100ns互斥锁:读需要睡眠 → ~1μsRCU:读无锁 → ~10ns

扩展性

  • • 读者数量无限制
  • • 读者不阻塞写者
  • • 写者不阻塞读者

劣势

写性能

  • • 需要复制数据(内存开销)
  • • 宽限期等待(延迟开销)
  • • 回调函数执行(CPU开销)

内存占用

  • • 多个版本数据同时存在
  • • 延迟释放导致内存峰值

适用场景

✅ 强烈推荐

  • • 读多写少(90%+读)
  • • 数据结构较大(复制成本高但可接受)
  • • 对读延迟敏感(实时系统)

⚠️ 谨慎使用

  • • 写频繁(复制开销大)
  • • 数据极小(复制成本低,锁更简单)
  • • 需要严格一致性(RCU允许旧读)

6. PREEMPT_RT实时补丁:锁的范式转变

PREEMPT_RT概述

目标:将Linux变为硬实时操作系统

核心改变

  1. 1. 可抢占内核:大部分内核代码可被抢占
  2. 2. 锁语义转变:忙等待→可睡眠+优先级继承
  3. 3. 中断线程化:中断处理程序可被调度

锁类型映射

非PREEMPT_RT → PREEMPT_RT

旧类型
新类型
变化
spinlock_trt_mutex
忙等待→睡眠+PI
rwlock_trt_mutex
忙等待→睡眠+PI
local_lockper-CPU spinlock_t
禁用抢占→互斥
raw_spinlock_traw_spinlock_t不变
(仍忙等待)

代码示例对比

// 非PREEMPT_RTspinlock_t lock;spin_lock(&lock);// 临界区(不可抢占)spin_unlock(&lock);// PREEMPT_RT(相同API,不同语义)spinlock_t lock;spin_lock(&lock);// 临界区(可被高优先级任务抢占)spin_unlock(&lock);

关键区别

  • • 临界区可以被抢占
  • • 支持优先级继承
  • • 可用于可睡眠上下文

中断处理变化

传统中断

// 顶半部(不可睡眠)irq_handler_t {// 快速处理    handle_irq();// 可能禁用中断    disable_irq();// 唤醒底半部    tasklet_schedule();}

PREEMPT_RT中断线程化

// 中断处理程序irq_handler_t {// 仅做最简处理return IRQ_WAKE_THREAD;}// 线程化处理(可睡眠)threaded_irq_handler_t {// 可以睡眠、获取锁    mutex_lock(&data_lock);// 复杂处理    process_data();    mutex_unlock(&data_lock);}

优势

  • • ✅ 中断处理可以睡眠
  • • ✅ 支持优先级继承
  • • ✅ 更好的实时性

代价

  • • ⚠️ 增加延迟(调度开销)
  • • ⚠️ 更高的上下文切换频率

锁嵌套规则

层次结构

1. 睡眠锁(mutex, rt_mutex)   ↓2. CPU本地锁(local_lock, spinlock_t)   ↓3. 原始自旋锁(raw_spinlock_t, bit spinlocks)

嵌套示例

// ✅ 正确:睡眠锁内嵌原始自旋锁mutex_lock(&mutex);raw_spin_lock(&raw_lock);// 临界区raw_spin_unlock(&raw_lock);mutex_unlock(&mutex);// ❌ 错误:原始自旋锁内嵌睡眠锁raw_spin_lock(&raw_lock);mutex_lock(&mutex);  // 死锁风险!raw_spin_unlock(&raw_lock);

原因

  • • 原始自旋锁禁用抢占
  • • 睡眠锁需要调度
  • • 无法在禁用抢占时睡眠

7. 生产环境:最佳实践与性能调优

锁选择指南

决策树

需要锁吗?├─ 否 → 无锁算法(RCU/原子操作)└─ 是   ├─ 读多写少? → RCU   ├─ 读写均衡? → rw_semaphore   ├─ 短临界区? → spinlock_t   ├─ 长临界区? → mutex   └─ 实时需求? → rt_mutex

性能对比

锁类型
获取时间
上下文切换
优先级继承
适用场景
raw_spinlock
~50ns
中断、极短临界区
spinlock_t (RT)
~200ns
短临界区
mutex
~1μs
长临界区
rt_mutex
~1μs
实时系统
RCU读
~10ns
N/A
读多写少

死锁预防

常见死锁模式

模式1:锁顺序反转

// 线程Aspin_lock(&lock1);spin_lock(&lock2);  // 等待lock2// 线程Bspin_lock(&lock2);spin_lock(&lock1);  // 等待lock1 → 死锁

解决方案:全局锁顺序

// 所有线程按相同顺序获取if (lock1 < lock2) {    spin_lock(&lock1);    spin_lock(&lock2);else {    spin_lock(&lock2);    spin_lock(&lock1);}

模式2:中断上下文死锁

// 普通代码spin_lock(&lock);// 被中断抢占// 中断处理程序spin_lock(&lock);  // 死锁!

解决方案

// 普通代码spin_lock_irqsave(&lock, flags);// 临界区spin_unlock_irqrestore(&lock, flags);// 或使用raw_spinlockraw_spin_lock_irqsave(&raw_lock, flags);

模式3:递归死锁

voidfunc() {    spin_lock(&lock);    func();  // 同一线程重复获取    spin_unlock(&lock);}

解决方案:使用mutex(支持递归检测)或手动记录状态

性能调优

1. 锁粒度优化

粗粒度锁(性能差):

spin_lock(&big_lock);// 大量不相关操作spin_unlock(&big_lock);

细粒度锁(性能好):

spin_lock(&lock1);// 操作1spin_unlock(&lock1);spin_lock(&lock2);// 操作2spin_unlock(&lock2);

2. 读写锁优化

场景:读多写少

// 优化前:互斥锁mutex_lock(&lock);if (read_mode)    read_data();else    write_data();mutex_unlock(&lock);// 优化后:读写锁if (read_mode) {    down_read(&rwsem);    read_data();    up_read(&rwsem);else {    down_write(&rwsem);    write_data();    up_write(&rwsem);}

3. RCU优化

场景:频繁读,偶尔更新

// 传统锁mutex_lock(&lock);read_data();mutex_unlock(&lock);// RCU优化rcu_read_lock();data = rcu_dereference(ptr);read_data();rcu_read_unlock();

4. 自旋优化

场景:短等待,高竞争

// 优化前:立即自旋spin_lock(&lock);// 优化后:指数退避int retries = 0;while (spin_trylock(&lock)) {if (retries++ > 100) {        cpu_relax();  // 让出CPU    }    udelay(1);  // 微秒级延迟}

调试与验证

1. Lockdep(锁依赖验证)

# 启用lockdepecho 1 > /proc/sys/kernel/lockdep# 检测死锁dmesg | grep "possible deadlock"# 查看锁图cat /proc/lockdep

检测能力

  • • 锁顺序反转
  • • 递归死锁
  • • 中断上下文死锁
  • • 锁持有时间过长

2. 锁统计

# 启用锁统计echo 1 > /proc/sys/kernel/lock_stat# 查看统计cat /proc/lock_stat# 输出示例:# lock_name: spin_lock# acquire: 1000000 times, 50ns avg# hold: 1000000 times, 100ns avg

3. Ftrace锁事件

# 跟踪锁事件echo 1 > /sys/kernel/debug/tracing/events/lock/enable# 查看跟踪cat /sys/kernel/debug/tracing/trace# 分析锁竞争trace-cmd record -e lock:*

4. RCU诊断

# 查看RCU状态cat /sys/kernel/debug/rcu/rcu*# 检测宽限期延迟echo 1 > /sys/kernel/debug/rcu/rcu_normal# 查看回调cat /sys/kernel/debug/rcu/rcu_pending

实际案例分析

案例1:网络驱动性能优化

问题:高并发下网络吞吐量下降

分析

// 原始代码spin_lock(&rx_lock);process_packet();spin_unlock(&rx_lock);// 性能:100K pps// CPU使用率:80%

优化

// 每CPU队列per_cpu_struct {structsk_buff_headqueue;spinlock_t lock;  // 仅保护本CPU};// 处理spin_lock(&per_cpu->lock);enqueue(per_cpu->queue);spin_unlock(&per_cpu->lock);// 合并处理(RCU读取)rcu_read_lock();for_each_cpu(cpu) {    process_queue(per_cpu(cpu)->queue);}rcu_read_unlock();

结果:1M pps,CPU使用率30%

案例2:文件系统元数据保护

问题:目录遍历与修改冲突

分析

// 传统锁mutex_lock(&dir->lock);list_for_each(entry) { /* 遍历 */ }mutex_unlock(&dir->lock);// 修改时遍历被阻塞

优化

// RCU保护的链表structentry {structlist_headlist;structrcu_headrcu;};// 读取(无锁)rcu_read_lock();list_for_each_entry_rcu(entry, &dir->listlist) {// 使用entry}rcu_read_unlock();// 修改new_entry = kmalloc(...);list_add_tail_rcu(&new_entry->list, &dir->list);// 延迟释放旧entryif (old_entry)    call_rcu(&old_entry->rcu, free_entry);

结果:读操作延迟降低90%


总结

关键要点

  1. 1. 锁的演进:从简单自旋锁到支持优先级继承的rt_mutex,再到无锁的RCU
  2. 2. PREEMPT_RT革命:锁语义的根本性转变,实现硬实时能力
  3. 3. RCU优势:读无锁、高并发、低延迟,适用于读多写少场景
  4. 4. 锁选择:根据临界区长度、读写比例、实时需求选择合适机制

技术局限

机制
局限性
缓解方案
自旋锁
CPU浪费
缩短临界区
互斥锁
上下文切换
使用RCU
RCU
写延迟高
批量更新
PREEMPT_RT
开销增加
精细调优

未来展望

内核6.x+趋势

  • • 锁验证工具:Lockdep持续增强
  • • 新型锁机制:如MCS锁、Qspinlock
  • • 硬件辅助:原子操作、内存屏障优化
  • • 无锁算法:RCU在更多子系统应用

实时性演进

  • • PREEMPT_RT主线化(已合并)
  • • 更低延迟的调度器
  • • 硬件实时扩展支持

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-09 08:59:40 HTTP/2.0 GET : https://f.mffb.com.cn/a/459447.html
  2. 运行时间 : 0.094757s [ 吞吐率:10.55req/s ] 内存消耗:4,842.17kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=ad70b4c7212b1f87a3cd9a89ec914f9f
  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.000912s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001472s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000795s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000644s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001341s ]
  6. SELECT * FROM `set` [ RunTime:0.000599s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001381s ]
  8. SELECT * FROM `article` WHERE `id` = 459447 LIMIT 1 [ RunTime:0.001041s ]
  9. UPDATE `article` SET `lasttime` = 1770598780 WHERE `id` = 459447 [ RunTime:0.001348s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000640s ]
  11. SELECT * FROM `article` WHERE `id` < 459447 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000959s ]
  12. SELECT * FROM `article` WHERE `id` > 459447 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001259s ]
  13. SELECT * FROM `article` WHERE `id` < 459447 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003550s ]
  14. SELECT * FROM `article` WHERE `id` < 459447 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002405s ]
  15. SELECT * FROM `article` WHERE `id` < 459447 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002760s ]
0.096384s