当前位置:首页>Linux>linux内核6.18 UDP接收性能提升50%:10个commit解析

linux内核6.18 UDP接收性能提升50%:10个commit解析

  • 2026-02-26 07:09:23
linux内核6.18 UDP接收性能提升50%:10个commit解析

前段时间看内核6.18版本发布的新闻,发布说明里有一条是UDP接收性能提升了50%,第一感觉是不太可能,内核协议栈应该已经做得很好了。 我很好奇,怎么会有如此大的性能提升,于是把关于这个性能优化相关的10个commit看了一遍,这里做一个记录。

核心操作速看:

  1. 结构体瘦身与 Cache Line 重新布局(消灭 False Sharing)
  2. 无锁化与减少原子操作(降低总线锁竞争)
  3. 读写变量物理隔离(保护冷数据 Cache)
  4. 化全局锁为 Per-Socket 锁(解决 NUMA 跨节点延迟)
  5. 内存延迟释放 (Deferred Free) (消除跨核内存释放的分配器锁竞争)

这批commit的作者是Eric Dumazet,来自Google,长期做内核网络系统的开发。 根据合并记录来看,commit合计有10个,总计提升了47%的性能,主要测试数据是120字节的ipv6小包recv。

官方Merge记录

这是Linus合并这个优化系列时的官方记录,Eric Dumazet详细说明了优化思路。

(提示:代码块部分支持左右滑动查看)

Merge branch 'udp-increase-rx-performance-under-stress'    Eric Dumazet says:    ====================    udp: increase RX performance under stress    This series is the result of careful analysis of UDP stack,    to optimize the receive side, especially when under one or several    UDP sockets are receiving a DDOS attack.    I have measured a 47 % increase of throughput when using    IPv6 UDP packets with 120 bytes of payload, under DDOS.    16 cpus are receiving traffic targeting a single socket.    Even after adding NUMA aware drop counters, we were suffering    from false sharing between packet producers and the consumer.    1) First four patches are shrinking struct ipv6_pinfo size       and reorganize fields to get more efficient TX path.       They should also benefit TCP, by removing one cache line miss.    2) patches 5 & 6 changes how sk->sk_rmem_alloc is read and updated.       They reduce reduce spinlock contention on the busylock.    3) Patches 7 & 8 change the ordering of sk_backlog (including       sk_rmem_alloc) sk_receive_queue and sk_drop_counters for       better data locality.    4) Patch 9 removes the hashed array of spinlocks in favor of       a per-udp-socket one.    5) Final patch adopts skb_attempt_defer_free(), after TCP got       good results with it.

这段官方记录透露了几个关键信息:

  1. 优化主要针对DDoS攻击场景下的UDP接收性能
  2. 测试环境是16核CPU处理单socket,属于高并发压力测试
  3. 主要解决了 False Sharing(伪共享)这个隐形性能杀手
  4. 优化是系统性的,从结构体、原子操作Cache布局、锁机制到内存管理

【背景小知识】

  • Cache Line:CPU为了加速内存访问,在内部集成了cache(L1、L2、L3),访问cache和访问内存的粒度都是 Cache Line。一个 Cache Line 是64字节(8个uint64类型),哪怕是要从内存中读一个int,也是一次性读一个 Cache Line。
  • False Sharing(伪共享):当线程A访问变量a,线程B访问变量b时,它们并没有逻辑上的冲突,所以不用加锁。但是如果这个a和b刚好处于同一个 Cache Line,那么线程A修改a后,会导致整个 Cache Line 失效,线程B需要重新从内存读取。线程B修改b以后,Cache Line 会再次失效。数据在两个核心的缓存之间来回跳跃,原本并行的操作变成了事实上的串行,性能损耗极大。

commit 1-4:结构体瘦身,Cache Line布局优化

commit1 (3fbb2a6f3a70) 和 commit2 (5489f333ef99) 改动很小,都是修改结构体成员类型,把结构体里的两个指针类型,改为bool类型,因为这两个指针没有被解引用过,使用逻辑都是在判断空值。 于是两个commit每个给结构体减少7个字节,合计减少14字节:

-       conststructin6_addr           *saddr_cache;+       bool                    saddr_cache;-       conststructin6_addr           *daddr_cache;+       bool                    daddr_cache;

commit3 (9fba1eb39e2f) 有两个改动,一个是对 Cache 的优化,另一个是对数据竞争的问题修复。

staticintrawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,if (flags & MSG_ERRQUEUE)return ipv6_recv_error(sk, msg, len, addr_len);-   if (np->rxpmtu && np->rxopt.bits.rxpmtu)+   if (np->rxopt.bits.rxpmtu && READ_ONCE(np->rxpmtu))return ipv6_recv_rxpmtu(sk, msg, len, addr_len);    skb = skb_recv_datagram(sk, flags, &err);

if 条件有短路特性,后面的判断可能不做执行。np->rxopt这个成员在后面的代码也要用到,但是np->rxpmtu几乎没用。调整顺序后,这样就保证np->rxopt这个地址永远被读到,是热点 Cache Line,下次再用,就不用访问RAM了。利用 C 语言的短路求值特性来“预热”热点 Cache,虽然能看懂原理,但是还是觉得非常巧妙。

另外,给rxopt->rxpmtu加上READ_ONCE不是性能优化,算是bug修复,防止编译器过度优化导致的数据竞争问题。

commit4 (b76543b21fbc) 的修改是调整了结构体的成员布局,把常用的成员全部放在了第一个 Cache Line(包括commit3使用的np->rxopt),并且把发送路径用的变量和接收路径用的隔离到不同 Cache Line 上。

CPU从内存中读数据,一次不是一个字节,而是一个 Cache Line。把常用成员全放在第一个 Cache Line 上,就避免了多次访问内存,减少 Cache Miss。而把数据集中在同一个 Cache Line 上,防止其他 Core 的修改造成 False Sharing

/* 调整前:Legacy Layout */structipv6_pinfo {structin6_addrsaddr;// 16 字节structin6_pktinfosticky_pktinfo;// 20 字节 (跨行隐患)    // ... 这里夹杂了一些不常改动的 cache 配置 ...bool saddr_cache;bool daddr_cache;    __be32 flow_label;   // 发包常用,但排在中间    __u32 frag_size;     // 中间    s16 hop_limit;       // 发包常用,排在后面    u8 mcast_hops;// ... 很多其他字段 ...structipv6_txoptions __rcu *opt;// 发包极其核心,却排在最后面!structsk_buff *pktoptions;// ...};/* 调整后:Optimized Layout (Linux 6.18) */structipv6_pinfo {/* --- 核心发送热点字段 (聚集在第一个 Cache Line) --- */structin6_addrsaddr;// 源地址 (16字节)    __be32 flow_label;              // 流标签 (4字节) - 挪到了前面    u32 dst_cookie;                 // 路由缓存验证 (4字节) - 挪到了前面structipv6_txoptions __rcu *opt;// 发送选项指针 (8字节) - 猛提到了前面    s16 hop_limit;                  // 跳数限制 (2字节) - 挪到了前面    u8 pmtudisc;                    // MTU 发现 (1字节)    u8 tclass;                      // 流量类别 (1字节)/* --- 接下来是接收选项和控制标志 --- */#ifdef CONFIG_IPV6_SUBTREESbool saddr_cache;#endifbool daddr_cache;    u8 mcast_hops;    u32 frag_size;    // ... rxopt 等字段 .../* --- 极少使用的冷数据 (踢到了最后面) --- */structin6_pktinfosticky_pktinfo;// 占空间大且发包不常用structsk_buff *pktoptions;structsk_buff *rxpmtu;structinet6_corkcork;};

commit 5-6:减少原子操作与锁竞争

commit5 (9aaec660b5be) 的修改很妙,把逻辑正确的代码,改成了工程上最优的代码。

// 修改前 rmem = atomic_read(&sk->sk_rmem_alloc);// ...if (rmem + size > rcvbuf) {// ...if (rmem > rcvbuf)goto drop; }// ...    atomic_add(size, &sk->sk_rmem_alloc);// 修改后    rmem = atomic_read(&sk->sk_rmem_alloc);// ...if (rmem + size > rcvbuf) {// .../* Accept the packet if queue is empty. */if (rmem)goto drop; }

rmem是socket已使用的内存大小,收到一个包,这里会增加,用户态recv一次,这里会减少。rcvbuf是socket允许的最大内存。

修改前的逻辑是,如果socket的rmem+当前包的size大于了rcvbuf,但是rmem还没超过rcvbuf(socket允许使用的最大内存),就再接收一个包,然后在后续的逻辑里用 atomic(原子) 的方式增加rmem,多核竞争的情况下,这个数据在Cache里会频繁失效,导致大量 Cache Miss。

修改后的逻辑是,如果socket的rmem+当前包的size大于了rcvbuf,只要rmem不为0,就丢弃,避免了对rmem的写操作,优化了性能。

这里需要说明的是:在系统遭受 DDoS 攻击时,队列往往是满的。旧逻辑下,即使包最终会被丢弃,也会先执行一次代价昂贵的 atomic_add(随后再减回去或在别处处理),这在多核下会引发灾难性的 Cache Miss。新逻辑直接在满载时直接丢弃,连原子变量都懒得碰。

commit6 (faf7b4aefd5b) 调整了合法性检查和锁的顺序,只有合法的包才去做获取锁的逻辑,减少了锁的调用。

commit 7-8:struct sock 的读写分离

commit7 (4effb335b5da) 也是对 Cache Line 的优化,调整结构体的布局,解决 False Sharing 问题。

/* 修改前:Legacy Layout */structsock {/* ... 之前的字段 ... */// --- 缓存行 X ---atomic_t    sk_drops;          // 4字节    __s32       sk_peek_off;        // 4字节structsk_buff_headsk_error_queue;// 24字节 (关键点:它在这里!)structsk_buff_headsk_receive_queue;// 24字节// --- 缓存行 X + 1 ---struct {atomic_t  rmem_alloc;      // 4字节 <--- 【高频写热点】int       len;             // 4字节structsk_buff *head;// 8字节structsk_buff *tail;// 8字节    } sk_backlog;                  // 总计 24 字节/* 此时缓存行还没填满,只读字段紧随其后 */structdst_entry *sk_rx_dst;// 8字节 <--- 【只读字段开始】int               sk_rx_dst_ifindex; // 4字节unsignedint      sk_napi_id;  // 4字节 <--- 【高频只读】int               sk_rcvbuf;   // 4字节 <--- 【高频只读】// ...}; /* 修改后:Optimized Layout (6.18) */structsock {/* ... 之前的字段 ... *//* --- 写入密集区 (sock_write_rx) --- */atomic_t            sk_drops;    __s32               sk_peek_off;structsk_buff_headsk_receive_queue;// 往前挪了struct {atomic_t  rmem_alloc;      // 【高频写热点】int       len;structsk_buff *head;structsk_buff *tail;    } sk_backlog;structsk_buff_headsk_error_queue;// 【被挪到了这里,充当“防火墙”】/* --- 显式结束写区域 --- */    __cacheline_group_end(sock_write_rx); /* --- 只读密集区 (sock_read_rx) --- */    __cacheline_group_begin(sock_read_rx);structdst_entry *sk_rx_dst;unsignedint      sk_napi_id;         // 【现在它在另一个缓存行了】int               sk_rcvbuf;          // 【安全了!】// ...};

在修改前,struct sock 的内存布局中,sk_rmem_alloc(计数器)和一些只读/频率极低的字段挤在了同一个 Cache Line 里:

  • 热数据(频繁写)sk_rmem_alloc。每一个 UDP 包进来,都要原子增加这个值。
  • 冷数据(只读/频率极低)sk_napi_id(用于 RFS 路由)、sk_rcvbuf(限额)。

后果就是每当核心 A 修改 sk_rmem_alloc 时,CPU 硬件会强制让所有其他核心缓存中包含该变量的整个 Cache Line 失效。这意味着,即使核心 B 只是想读取一下完全没变的 sk_rcvbuf(限额),也必须重新从内存加载。

重排之后,利用 sk_error_queue 充当物理空间上的缓冲带(Padding)防火墙,把高频写的 sk_backlog 和下面只读的字段物理隔离开:

  • 写操作:核心 A 在写 sk_rmem_alloc 时,只会污染到其他同样需要写的字段(如 sk_receive_queue.tail)。
  • 读操作:核心 B 读取 sk_rcvbuf 时,该字段所在的 Cache Line 处于 Shared 状态,永远不会因为 rmem_alloc 的变化而失效。

commit8 (9db27c80622b) 有两个改动,第一个还是 Cache Line 相关的优化。

#ifdef CONFIG_MEMCGstructmem_cgroup *sk_memcg;#endif#ifdef CONFIG_XFRMstructxfrm_policy __rcu *sk_policy[2];#endifstructnuma_drop_counters *sk_drop_counters; __cacheline_group_end(sock_read_rxtx); __cacheline_group_begin(sock_write_rxtx);socket_lock_t  sk_lock; u32   sk_reserved_mem;int   sk_forward_alloc; u32   sk_tsflags;

作者发现,sk_drop_counters这个成员在sock_read_rxtx这组Cache末尾,刚好导致sock_write_rxtx这一组Cache没有对齐,把它踢出去就能对齐了,于是调整了这个成员的位置。

第二个改动,是针对丢包统计的优化,原来的方案,丢包统计是用sk_drops_inc函数:

staticinlinevoidsk_drops_inc(struct sock *sk){ sk_drops_add(sk, 1);}staticinlinevoidsk_drops_add(struct sock *sk, int segs){structnuma_drop_counters *ndc = sk->sk_drop_counters;if (ndc)  numa_drop_add(ndc, segs);else  atomic_add(segs, &sk->sk_drops);}

sk_drop_counters在sock结构体里是一个指针,修改这个计数器时,访问指针数据要做一次内存操作。新方案里,直接使用了udp.h里的drop_counters,避免了一次指针访问。

commit9: Per-Socket自旋锁替代全局锁数组

commit9 (3cd04c8f4afe) 之前的旧方案,为了避免内存浪费,并没有给每个socket分配一个自旋锁,而是设计了一种公用机制。 如代码所示:udp_busylocks 是一个全局的自旋锁数组,在UDP协议初始化函数里,数组被初始化。 socket需要加锁的时候,先计算hash,映射到这个数组的某一把锁上。

staticspinlock_t *udp_busylocks __read_mostly;void __init udp_init(void){// ...for (i = 0; i < (1U << udp_busylocks_log); i++)  spin_lock_init(udp_busylocks + i);// ...}

这里面有两个问题:

  1. udp_init函数在某个CPU A上执行,在多NUMA环境下,这个初始化的内存也在CPU A的NUMA上,另一个NUMA访问这些锁的时候,就要跨NUMA访问,延迟很高。
  2. 不同的 Socket 可能会哈希到同一把锁上。这意味着两个完全无关的进程(比如一个是 DNS,一个是游戏逻辑)可能会因为碰巧分到了同一把锁而互相排队,导致性能下降(共享肯定比不过独占)。

这个commit就是以空间换时间,给每个socket实现了一把自旋锁,在socket创建的时候做初始化。

structudp_sock {structhlist_nodetunnel_list;structnuma_drop_countersdrop_counters;+   spinlock_t              busylock ____cacheline_aligned_in_smp;};staticinlinevoidudp_lib_init_sock(struct sock *sk){// ...    sk->sk_drop_counters = &up->drop_counters;+   spin_lock_init(&up->busylock);    skb_queue_head_init(&up->reader_queue);// ...}

并且给自旋锁加了____cacheline_aligned_in_smp,让这把锁独占一个 Cache Line。解决了上面两个问题,代价就是 UDPv6 socket 的size增大到了1600字节。

commit 10:内存延迟释放 (Deferred Free)

commit10 (6471658dc66c) 把吞吐量提升了20%-30%,它是把TCP上的延迟释放(Deferred Free)移植到了UDP。

在以前的处理流程中:

  • CPU A(软中断 BH 路径)负责从网卡接收数据包,并为 skb 分配内存。
  • CPU B(用户态路径)调用 recvmsg() 读取数据,并执行 consume_skb() 释放内存。

当 CPU B 尝试释放由 CPU A 分配的内存时,会触发内存分配器(如 SLUB)的跨核操作。这会导致:

  • 缓存行抖动:分配器内部的状态(如本地 CPU 缓存池)需要在两个核心之间同步。
  • 锁竞争:在高并发下,多个用户态核心同时释放来自不同软中断核心的内存,会引发严重的分配器锁竞争。

通过引入 skb_attempt_defer_free() 改变了这一现状:当用户态(CPU B)处理完 UDP 包后,不再直接执行昂贵的释放操作。如果条件允许(skb 非共享),内核会将这个 skb 放入一个远程 CPU 队列,重新投递回当初分配它的 CPU A。CPU A 在下一次处理软中断时,会批量释放这些“归乡”的包。

这其实是把跨核的内存管理锁竞争,巧妙地转换成了单核内部的 SoftIRQ 批量处理。此时,内存的分配和释放都发生在 CPU A 的 L1/L2 缓存中,完全是本地操作。

voidskb_consume_udp(struct sock *sk, struct sk_buff *skb, int len)if(unlikely(READ_ONCE(udp_sk(sk)->peeking_with_offset)))sk_peek_offset_bwd(sk, len);+       if (!skb_shared(skb)) {+               if (unlikely(udp_skb_has_head_state(skb)))+                       skb_release_head_state(skb);+               skb_attempt_defer_free(skb);+               return;+       }+if (!skb_unref(skb))return;

总结:本以为 Linux 内核的协议栈已经千锤百炼,没什么油水可榨了,没想到 Eric Dumazet 依然能从中抠出 50% 的性能提升。这 10 个 Commit 大部分都是在和 CPU Cache 较劲,只有对计算机体系结构、多核并发、内存分配器有极深的理解,才能发现这些隐秘的瓶颈。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-28 08:55:55 HTTP/2.0 GET : https://f.mffb.com.cn/a/476367.html
  2. 运行时间 : 0.089389s [ 吞吐率:11.19req/s ] 内存消耗:4,532.78kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=acd3fe8abf32c983a8f72954b38f4714
  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.000464s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000729s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000318s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000265s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000518s ]
  6. SELECT * FROM `set` [ RunTime:0.000205s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000508s ]
  8. SELECT * FROM `article` WHERE `id` = 476367 LIMIT 1 [ RunTime:0.000435s ]
  9. UPDATE `article` SET `lasttime` = 1772240155 WHERE `id` = 476367 [ RunTime:0.012454s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.003175s ]
  11. SELECT * FROM `article` WHERE `id` < 476367 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000492s ]
  12. SELECT * FROM `article` WHERE `id` > 476367 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001689s ]
  13. SELECT * FROM `article` WHERE `id` < 476367 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001650s ]
  14. SELECT * FROM `article` WHERE `id` < 476367 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000917s ]
  15. SELECT * FROM `article` WHERE `id` < 476367 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000800s ]
0.090927s