当前位置:首页>Linux>深入理解Linux 内核 veth pair 驱动:一根“软件网线”的完整生命周期

深入理解Linux 内核 veth pair 驱动:一根“软件网线”的完整生命周期

  • 2026-08-20 13:21:20
深入理解Linux 内核 veth pair 驱动:一根“软件网线”的完整生命周期

你在容器里 ping 8.8.8.8 能通,但宿主机 ip addr 里看不到容器的 eth0;反过来容器 ip addr 也看不到宿主的网卡。两边明明"插着网线",却活在不同的世界里。把这两个世界接起来的,就是 veth pair。

很多人把 veth 当成"一张虚拟网卡",这是个误解。它其实是一对背靠背的虚拟以太网设备——像一根两头各焊了一个 RJ45 接头的网线,只不过这根线完全活在内存里,由内核代码实现。容器网络能成立,靠的不是什么黑魔法,而是 ip link add 一行命令背后那套精确的内核机制。

这篇文章把 veth pair 从创建、跨命名空间、数据包发送、接收上行、直到接上桥的全过程讲清楚,重点放在驱动层 drivers/net/veth.c。读完你应该能回答一个很实际的问题:一个 ICMP 包,是怎么"穿过" veth 从容器走到宿主协议栈的。

一、veth 在内核里到底是什么

ip link add veth0 type veth peer name veth1 这行命令,最终走进内核的 rtnl_link_ops veth_link_ops

staticstructrtnl_link_opsveth_link_ops = {    .kind          = DRV_NAME,    .priv_size     = sizeof(struct veth_priv),    .setup         = veth_setup,    .newlink       = veth_newlink,    .dellink       = veth_dellink,    .policy        = veth_policy,    .maxtype       = VETH_INFO_MAX,    .get_link_net  = veth_get_link_net,};

关键在于 veth_newlink。它做的事很直白:用 rtnl_create_link 创建两个struct net_device(一个叫 dev,一个叫 peer),各自 register_netdevice,最后让它们互相记住对方:

/* veth_newlink 结尾的互指 */priv = netdev_priv(dev);rcu_assign_pointer(priv->peer, peer);priv = netdev_priv(peer);rcu_assign_pointer(priv->peer, dev);

记住 struct veth_priv 长什么样,它是 veth 的"灵魂":

structveth_priv {structnet_device __rcu *peer;/* 对端设备,xmit 时靠它找路 */atomic64_t dropped;                     /* 丢弃计数 */structbpf_prog __rcu *_xdp_prog;/* peer 上挂的 XDP 程序 */structveth_rq *rq;/* 接收队列 + NAPI */unsignedint requested_headroom;};

两个 net_device各自持有一份veth_priv,不是共享一份。常见误解是"veth pair 共享一个 priv",其实不然——每个设备独立,靠 peer 指针互指。后面你会看到,发包就是顺着这根指针摸到对端。

veth_setup 把一个设备初始化成以太网设备,并注册自己的操作集:

staticvoidveth_setup(struct net_device *dev){    ether_setup(dev);    dev->priv_flags &= ~IFF_TX_SKB_SHARING;    dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;    dev->priv_flags |= IFF_NO_QUEUE;        /* veth 没有发送队列深度限制 */    dev->priv_flags |= IFF_PHONY_HEADROOM;    dev->netdev_ops = &veth_netdev_ops;     /* ndo_start_xmit = veth_xmit */    ...}

IFF_NO_QUEUE 值得停一下:普通网卡有发送队列(qdisc + tx ring),veth 没有——它的"发送"是即时的,不存在排队等硬件。这一点直接决定了 veth 的性能画像。

二、跨命名空间:一根线两头各接一个世界

刚创建时,两个 veth 设备都在当前命名空间(通常是 init_net)。把一端搬进容器,靠的是:

ip linkset veth1 netns container1

这行命令触发 dev_change_net_namespace(实现在 net/core/dev.c),核心就一句:

intdev_change_net_namespace(struct net_device *dev, struct net *net, ...){    ...    dev_net_set(dev, net);   /* 把 dev->nd_net 指向新的 net */    ...}

为什么 veth 能被搬走,而 lovxlan 不行?看 dev_change_net_namespace 开头:

if (dev->features & NETIF_F_NETNS_LOCAL)goto out;   /* 返回 -EINVAL */

lo、VXLAN 等设备带 NETIF_F_NETNS_LOCAL 标志,意味着"它只属于创建它的那个 netns",内核拒绝移动。veth 不带这个标志——这正是由它"一根连线、两头各接一个世界"的本质决定的。

搬完之后:veth0 留在宿主 netns,veth1 进了容器 netns。ip link 里能看到 link-netnsid 字段标识对端在哪;ip netns exec container1 ip link 才能看到 veth1。此时一端发包,另一端就在对端 netns 里被"接收"——容器网络连通的原子,到此就齐了。

三、发送路径:veth_xmit 没有"硬件"

这是全文的核心。先看物理网卡怎么发:协议栈把 skb 交给驱动,驱动配置 DMA 描述符,真正的比特流由网卡硬件发出,发完硬件产生中断通知 CPU。

veth 没有硬件。它的 ndo_start_xmit 长这样:

staticnetdev_tx_tveth_xmit(struct sk_buff *skb, struct net_device *dev){structveth_priv *priv = netdev_priv(dev);structnet_device *rcv;int length = skb->len;bool rcv_xdp = false;structveth_rq *rq =NULL;int rxq;    rcu_read_lock();    rcv = rcu_dereference(priv->peer);     /* 1. 找到对端设备 */if (unlikely(!rcv)) {        kfree_skb(skb);goto drop;    }    rxq = skb_get_queue_mapping(skb);if (rxq < rcv->real_num_rx_queues) {        rq = &rcv_priv->rq[rxq];        rcv_xdp = rcu_access_pointer(rq->xdp_prog);if (rcv_xdp)            skb_record_rx_queue(skb, rxq);    }if (likely(veth_forward_skb(rcv, skb, rq, rcv_xdp) == NET_RX_SUCCESS)) {structpcpu_vstats *stats = this_cpu_ptr(dev->vstats);        u64_stats_update_begin(&stats->syncp);        stats->bytes   += length;        stats->packets++;        u64_stats_update_end(&stats->syncp);    } else {drop:   atomic64_inc(&priv->dropped);    }    rcu_read_unlock();return NETDEV_TX_OK;}

几个要点:

  • 不拷贝、不 DMA、不排队等中断。它直接把同一个 skb 顺着 peer 指针交给对端设备。
  • rcu_dereference(priv->peer) 用 RCU 保护:对端可能正在被移走或删除,RCU 保证这一刻拿到的指针有效。
  • 返回 NETDEV_TX_OK 只是告诉上层协议栈"我收下了",实际上包在这一刻就已经"送到"对端了。如果 peer 为 NULL(对端已被删),skb 被丢弃并计入 dropped

真正的转发在 veth_forward_skb

staticintveth_forward_skb(struct net_device *dev, struct sk_buff *skb,struct veth_rq *rq, bool xdp){return __dev_forward_skb(dev, skb) ?:           xdp ? veth_xdp_rx(rq, skb) : netif_rx(skb);}

先调用 __dev_forward_skb,它把 skb 从"发送侧状态"清理成"接收侧状态"——清掉原 netns 残留的路由缓存、分片、tw 等信息,并把 skb->dev 设为对端设备(eth_type_trans)。然后分叉:

  • 若对端挂了 XDP 程序xdp 为真)→ 走 veth_xdp_rx,入 NAPI 接收队列;
  • 否则 → 走 netif_rx,进入传统软中断收包路径。

四、接收与协议栈上行:软中断里的接力

netif_rx 这条经典路径:netif_rx_internal → enqueue_to_backlog,把 skb 塞进当前 CPU 的 softnet_data->input_pkt_queue,然后 __napi_schedule 触发 NET_RX_SOFTIRQ

软中断上下文里:

net_rx_action → process_backlog → __netif_receive_skb → 按协议 deliver 到 ip_rcv

注意一个反直觉的点:veth 的"接收"实际上发生在发送端的 CPU 上。因为 veth_xmit 直接调用 netif_rx,而 netif_rx 用的是当前 CPU 的 softnet 队列。这解释了为什么 veth 的吞吐与 CPU 软中断亲和性高度相关——包的收发都在同一颗核上接力完成。

对比物理网卡:物理网卡有硬中断唤醒 NAPI poll,poll 里调 napi_gro_receive。veth 走的是 netif_rx 这条"软件入队"路径,全程没有硬中断,是纯软件转发。

五、NAPI 与 GRO:现代内核的批量优化与坑

每包一次 netif_rx + 一次软中断,在高频小包场景下软中断开销吃不消。现代内核给 veth 的接收队列(veth_rq)配了 napi_struct(即 xdp_napi)和 ptr_ring。当对端挂了 XDP 程序时,skb 走 veth_xdp_rx 入 ptr_ringnapi_schedule 唤醒 veth_poll,由它在 NAPI 上下文里批量取出 skb 并调 napi_gro_receive 交给协议栈。

GRO(Generic Receive Offload)就在 napi_gro_receive 这一层生效:把多个连续的 TCP 小段合并成一个大 skb,减少上层协议栈的处理次数。代价是合并后的包变大、延迟增加。实测数据里,关掉 GRO 能让跨容器通信延迟下降约三成,代价是吞吐掉约两成——延迟敏感型微服务常常这么调。

# 查看 veth 的 offload 状态ethtool -k veth0 | grep -E 'gro|gso|tso'# 关 GRO 换延迟(牺牲吞吐)ethtool -K veth0 gro off

一个经典诊断误区:用 ethtool -k veth0 查到的 offload 设置,显示的其实是 peer(对端 veth1) 的状态,因为 veth pair 的 offload 能力是对称的。在容器侧看 veth 的 GRO 开关,得去宿主侧对应的那根 peer 上查,否则会被"明明关了却还生效"骗到。

六、checksum 与 offload 的真相

veth 的 dev->features 里带 NETIF_F_HW_CSUMNETIF_F_GSO_SOFTWARE 等,所以 GSO/GRO 在 veth 上是软件实现的。两个要点:

  • veth 不支持 TSO(硬件分段),只支持 GSO(软件分段)。大包在 veth 上由 GSO 处理,而不是交给"网卡"去切。这就是为什么容器出口启用 TSO 时,包会在 veth 上被降级成 GSO,多一层软件分段开销。
  • checksum:因为包根本没离开这台机器,veth 上的 skb 校验和可以在发送侧就标记为无需重算(CHECKSUM_PARTIAL / CHECKSUM_UNNECESSARY)。tcpdump 抓 veth 包时常看到 checksum: validation disabled,不是网卡坏了,而是这层根本不需要硬件校验。

还有一个高频踩坑点:MTU 必须两端对齐。若 veth0 是 1500 而 veth1 是 9000,GSO 产生的大包在接收端因 MTU 不匹配被丢弃,表现就是诡异的"大包不通、小包通"。ip link set veth0 mtu 1500 两端要一起改。

七、当它接上 bridge:rx_handler 的拐点

容器网络里,宿主侧那根 veth 通常被加进 Linux bridge(docker0 / cni0)。一旦加入,bridge 会通过 netdev_rx_handler_register 把自己的 br_handle_frame 注册成该设备的 rx_handler

于是数据包到达宿主侧 veth(仍是从容器经 veth_xmit 转发来的)后,在 __netif_receive_skb_core 里不再直接进 IP 协议栈,而是先执行 rx_handler——也就是 br_handle_frame:查 FDB、学 MAC、决定洪泛 / 转发 / 上送。

这里要分清:veth 自身不走 rx_handler,它在发送侧就直接 forward 了;rx_handler 是装在"接收端设备"(被桥接的那根 veth)上的钩子。正是这个钩子,把"veth pair 点对点连线"升级成了"多端口二层交换"——Docker/K8s 默认网络能连通任意容器,根源在此。

八、性能画像与调优

veth 是纯软件转发:没有物理驱动、没有 DMA、没有硬中断,单包延迟通常低于物理网卡,但每个包都吃 CPU(软中断)。

瓶颈几乎总在宿主的软中断:cat /proc/net/softnet_stat 里 dropped 增长、top 里 %si 飙高,往往就是多容器高 PPS 把单核 softnet 队列打满。调优思路:

  1. RPS/RFS 把软中断分散到多核;
  2. 关 GRO 降延迟(见第五节);
  3. MTU 对齐(见第六节);
  4. 根本加速:eBPF 在 veth 上做 bpf_redirect / bpf_redirect_peer。Cilium 的做法是把包从容器 netns 通过 eBPF 直接 redirect 到宿主 netns 的对应设备,完全 bypass 掉"veth_xmit → netif_rx → 软中断 → 协议栈"这一整段来回。注意 eBPF 不是替代 veth,而是在 veth 这层"抄近路"——理解 veth 的原生路径,才知道 eBPF 省掉了什么。

九、收束:一个 ping 的完整旅程

把前面所有点串起来,容器里 ping 8.8.8.8 的包走过的路:

回到开头那个困惑:宿主机 ip addr 看不到容器的 eth0,因为它们根本不在同一个 netns 里——而 veth pair,正是跨过这道墙的那根"软件网线"。veth_xmit 不过几十行,却撑起了整个容器网络。理解它的内核路径,排障时就知道该往哪一层看:peer 指针断了?dropped 在涨?GRO/MTU 不对齐?软中断打满了?——问题出在哪一层,答案就在这套机制里。

动手验证

# 1. 建一对 veth 并跨 nsip netns add ns1ip link add veth0 type veth peer name veth1ip linkset veth1 netns ns1ip addr add 192.168.100.1/24 dev veth0ip netns exec ns1 ip addr add 192.168.100.2/24 dev veth1ip linkset veth0 upip netns exec ns1 ip linkset veth1 up# 2. 两端都能抓到同一个包(验证"一根线")ip netns exec ns1 tcpdump -n -i veth1 icmp &ping 192.168.100.2# 3. 看对端在哪、丢包计数ip link show veth0          # 关注 link-netnsidcat /sys/class/net/veth0/statistics/rx_dropped# 4. 看 offload 与软中断ethtool -k veth0 | grep -E 'gro|gso|tso'cat /proc/net/softnet_stat

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 14:36:54 HTTP/2.0 GET : https://f.mffb.com.cn/a/511419.html
  2. 运行时间 : 0.157033s [ 吞吐率:6.37req/s ] 内存消耗:4,935.32kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=40f79b596446ae8a54cf012e5925ad4a
  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.000574s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000752s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.018833s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000337s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000515s ]
  6. SELECT * FROM `set` [ RunTime:0.000197s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000559s ]
  8. SELECT * FROM `article` WHERE `id` = 511419 LIMIT 1 [ RunTime:0.014452s ]
  9. UPDATE `article` SET `lasttime` = 1787294214 WHERE `id` = 511419 [ RunTime:0.001728s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000242s ]
  11. SELECT * FROM `article` WHERE `id` < 511419 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000395s ]
  12. SELECT * FROM `article` WHERE `id` > 511419 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000989s ]
  13. SELECT * FROM `article` WHERE `id` < 511419 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.017680s ]
  14. SELECT * FROM `article` WHERE `id` < 511419 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004510s ]
  15. SELECT * FROM `article` WHERE `id` < 511419 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.028556s ]
0.158444s