当前位置:首页>Linux>Linux 内核:RCU机制全解(读多写少场景的性能神器)

Linux 内核:RCU机制全解(读多写少场景的性能神器)

  • 2026-07-01 03:03:24
Linux 内核:RCU机制全解(读多写少场景的性能神器)
大家好,我是蟹老板~

各位啃 Linux 源码的时候,有没有发现一个细节:很多链表、指针后面有个 __rcu 后缀?比如 struct list_head __rcu *next; 或者 rcu_dereference() 这些 API。

今天这篇文章,主要目的是把 RCU(Read-Copy Update)讲透。

走起!

Part1RCU 到底是什么?

RCU 全称 Read-Copy Update,直白翻译就是“读-拷贝-更新”

它的核心思想超级简单:读者可以随意读,几乎零开销;写者想改数据时,先拷贝一份副本,在副本上改完,再一次性把指针指向新数据。

为什么这么设计?因为 Linux 内核里大量场景是读多写少。比如:

  • 文件系统里频繁查找目录(读);

  • 路由表查询(读);

  • 系统调用审计、SELinux AVC、dcache 等。

传统锁(rwlock)在读多的时候会让所有读者排队,性能差。RCU 直接干掉读端的锁竞争,让多个读者同时读,甚至读者和写者也能并发(写者自己加锁就行)。

读到这,我打赌你现在脑子里肯定冒出了好多问号:RCU怎么这么厉害?写数据的时候读数据居然不用等?有了读写锁为啥还要搞个RCU?别担心,下面这张图能让你恍然大悟!"

官方文档在内核源码 Documentation/RCU/ 目录下非常齐全,主实现者 Paul E. McKenney 也写了大量文章。想深挖的同学可以直接去看源码。

Part2RCU 解决了哪些难题?

RCU 在设计时重点解决了三个关键问题:

  1. 读者正在读的时候,写者删除了节点写者可以把节点从链表移除,但不能立刻释放内存。必须等到所有读者都读完(宽限期 Grace Period)才能销毁。这就是 RCU 的“延迟释放”机制。

  2. 读者正在读的时候,写者插入了新节点需要保证读者读到的节点是完整初始化的。这里用到了发布-订阅机制(Publish-Subscribe),靠内存屏障保证可见性。

  3. 链表遍历不能因为增删而断链RCU 保证遍历不会从中间断开,但不保证一定能读到最新节点(这也是它和普通锁的区别)。

一句话总结就是RCU 让读者几乎无感,写者承担所有复杂性

Part3RCU 原理

RCU 可以看作 rwlock 的升级版,但更激进:

  • 读者:几乎零开销。不加锁、不用原子指令(除 Alpha 外无需内存屏障),也不会导致死锁。

  • 写者:先拷贝副本 → 修改副本 → 注册回调 → 等待 Grace Period → 真正替换/释放。

Grace Period(宽限期) 是 RCU 的灵魂:它指“所有 CPU 都经历一次上下文切换(Quiescent State,安静状态)”的时间。为什么用上下文切换判断?因为 RCU 读端要求读者在临界区内不能被调度(rcu_read_lock 期间关抢占)。一旦切换发生,说明读者已经安全退出。

内核里会维护 per-CPU 变量来标记每个 CPU 是否经历过一次安静状态。写者挂起后:

  1. 重置所有 per-CPU 变量为 0;

  2. 每个 CPU 切换一次就把自己的变量设为 1;

  3. 全部变为 1 后,唤醒写者,执行回调。

Part4一个简单的例子看穿本质

我们先看内核文档 whatisRCU.txt 里的经典例子(保护一个全局指针):

struct foo {    int a;    char b;    long c;};DEFINE_SPINLOCK(foo_mutex);struct foo *gbl_foo;voidfoo_read(void){    struct foo *fp = gbl_foo;   // 普通读(后续会改成 rcu 版)    if (fp != NULL)        dosomething(fp->a, fp->b, fp->c);}voidfoo_update(struct foo *new_fp){    spin_lock(&foo_mutex);    struct foo *old_fp = gbl_foo;    gbl_foo = new_fp;           // 指针切换    spin_unlock(&foo_mutex);    kfree(old_fp);              // 危险!可能被读者还在用}

如果去掉 spinlock,直接并发更新,会出现释放后使用(use-after-free)的 bug。RCU 改造后变成这样(注意关键变化):

voidfoo_read(void){    rcu_read_lock();                    // 声明读临界区    struct foo *fp = gbl_foo;    if (fp != NULL)        dosomething(fp->a, fp->b, fp->c);    rcu_read_unlock();                  // 退出临界区}voidfoo_update(struct foo *new_fp){    spin_lock(&foo_mutex);    struct foo *old_fp = gbl_foo;    gbl_foo = new_fp;    spin_unlock(&foo_mutex);    synchronize_rcu();                  // 等待所有读者退出!    kfree(old_fp);}

RCU 允许多个读者并发,也允许读者和写者并发,但多个写者之间仍需锁同步(这里用了 spinlock)。

Part5RCU 核心 API

rcu_read_lock();          // 进入读临界区(关抢占)rcu_read_unlock();        // 退出读临界区synchronize_rcu();        // 写者等待 Grace Period(核心阻塞点)rcu_assign_pointer();     // 写者安全发布新指针(带内存屏障)rcu_dereference();        // 读者安全解引用(带内存屏障)

后面会逐个讲解它们在链表里的真实用法。

Part6链表上的实例

6.1 增加链表项

内核里增加 RCU 链表项的经典代码:

#define list_next_rcu(list)     (*((struct list_head __rcu **)(&(list)->next)))static inline void __list_add_rcu(struct list_head *new,                struct list_head *prev, struct list_head *next){    new->next = next;    new->prev = prev;    rcu_assign_pointer(list_next_rcu(prev), new);  // 关键发布    next->prev = new;}

__rcu 后缀是 Sparse 工具的标注,强制开发者必须用 rcu_dereference() 访问。

重点看 rcu_assign_pointer()

#define __rcu_assign_pointer(p, v, space) \    ({ \        smp_wmb();                     // 写内存屏障        (p) = (typeof(*v) __force space *)(v); \    })

为什么需要内存屏障?

CPU 乱序执行可能导致:新节点还没初始化完,就被读者看到!内存屏障保证 new->nextnew->prev 先写完,再把指针发布出去。

注意:如果多个线程同时 add,仍需额外 spinlock 保护。

6.2 访问链表项

标准读模式:

rcu_read_lock();list_for_each_entry_rcu(pos, head, member) {    // do something with pos}rcu_read_unlock();

list_for_each_entry_rcu 内部最终调用 rcu_dereference()

#define __rcu_dereference_check(p, c, space) \    ({ \        typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \        rcu_lockdep_assert(c, "suspicious rcu_dereference_check() usage"); \        rcu_dereference_sparse(p, space); \        smp_read_barrier_depends();     // 读依赖屏障        ((typeof(*p) __force __kernel *)(_________p1)); \    })

在 Alpha 架构上,这条屏障能防止编译器/CPU 猜测优化导致的乱序;在 x86/arm 上则是空实现(性能无损)。

读临界区全局可见:只要有任何一个读者还在临界区,synchronize_rcu() 就会阻塞,直到所有读者退出。这就是 Grace Period 的直观体现。

6.3 删除链表项

p = search_the_entry_to_delete();list_del_rcu(p->list);      // 只移除,不释放synchronize_rcu();          // 等待 Grace Periodkfree(p);

list_del_rcu() 源码很简单:

staticinlinevoidlist_del_rcu(struct list_head *entry){    __list_del(entry->prev, entry->next);    entry->prev = LIST_POISON2;  // 毒化,防止误用}

6.4 更新链表项

p = search_the_entry_to_update();q = kmalloc(sizeof(*p), GFP_KERNEL);*q = *p;                    // 拷贝q->field = new_value;       // 修改副本list_replace_rcu(&p->list, &q->list);synchronize_rcu();kfree(p);                   // 老版本延迟释放

list_replace_rcu() 内部同样使用 rcu_assign_pointer() 安全替换。

Part7实战:RCU 在系统调用审计中的应用

场景一:只有增加/删除(最常见、最容易转换)

原来用 rwlock 的读端:

read_lock(&auditsc_lock);list_for_each_entry(e, &audit_tsklist, list) { ... }read_unlock(&auditsc_lock);

改成 RCU 后:

rcu_read_lock();list_for_each_entry_rcu(e, &audit_tsklist, list) { ... }rcu_read_unlock();

写端原来用 write_lock,现在只需把 list_add/list_del 换成 _rcu 版本,并用 call_rcu() 异步释放(代替 synchronize_rcu())。

场景二:需要修改链表条目

必须先拷贝 → 修改副本 → list_replace_rcu() → call_rcu() 释放旧条目。

场景三:不能容忍旧数据(立即可见)

在每个条目里加 deleted 标志 + 每个条目自己的 spinlock:

读端检查 if (e->deleted) 立即跳过;写端删除时先标记 deleted = 1,再 list_del_rcu() + call_rcu()

总结

RCU 是 Linux 2.6 引入的重量级同步机制,用好它,内核性能能上一个大台阶。

优点

  • 读端几乎零开销,完美适配“读多写少”场景;

  • 在路由表、dcache、SELinux AVC、IPC 等地方已大规模替换 rwlock,性能提升明显。

缺点

  • 写端延迟释放会短暂占用内存(嵌入式系统需谨慎);

  • 写者较多或不能容忍旧数据时,仍需额外锁,收益会打折扣。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-04 11:05:32 HTTP/2.0 GET : https://f.mffb.com.cn/a/487890.html
  2. 运行时间 : 0.094897s [ 吞吐率:10.54req/s ] 内存消耗:4,493.02kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=eead78d73d06add7b9ff5da7ce348521
  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.000704s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000962s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000339s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000285s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000519s ]
  6. SELECT * FROM `set` [ RunTime:0.000242s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000525s ]
  8. SELECT * FROM `article` WHERE `id` = 487890 LIMIT 1 [ RunTime:0.000852s ]
  9. UPDATE `article` SET `lasttime` = 1783134332 WHERE `id` = 487890 [ RunTime:0.006212s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000236s ]
  11. SELECT * FROM `article` WHERE `id` < 487890 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000504s ]
  12. SELECT * FROM `article` WHERE `id` > 487890 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000568s ]
  13. SELECT * FROM `article` WHERE `id` < 487890 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001898s ]
  14. SELECT * FROM `article` WHERE `id` < 487890 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.011175s ]
  15. SELECT * FROM `article` WHERE `id` < 487890 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001440s ]
0.096516s