高性能网络协议栈优化:从内核瓶颈到数据面设计实践
提到“高性能网络协议栈”可能很多人第一反应是“那不就是换一套更底层的API把收包速度拉上去”但实际做下来会发现瓶颈从来不在某一个点而是一整条链路的问题。前阵子我在维护一个网关类服务业务逻辑非常简单转发、限流、统计结果流量涨到一定程度之后CPU占用率直线上升延迟曲线出现明显拖尾。排查到最后问题不在业务代码而在一整条操作系统默认的接收路径上系统调用、数据拷贝、锁竞争、缓存失效每一个环节都在为协议栈的通用性买单。这也是我写这篇内容的原因想从“协议栈到底慢在哪”开始结合自己实践过的轮询收发、内存池、无锁队列、多队列绑核这些手段把高性能网络协议栈从设计到落地验证的完整思路说清楚。适合看这篇内容的主要是服务端开发、中间件维护者、云原生网络相关从业者或者正准备把数据面性能往上推的同学。如果你只是写普通业务接口优化思路一样适用只是不需要做到那么极端。1. 高性能协议栈到底在解决什么问题先说清楚它解决的是什么问题不然很容易上来就陷入技术细节。1.1 典型瓶颈场景小包、高并发、长连接传统服务端最头疼的流量特征不是大带宽而是小包、高并发、长连接。想象一个代理网关每个连接每分钟可能只发几个几十字节的心跳包但连接数动辄百万级再想象一个消息推送服务每秒要处理几十万个几十字节的确认帧。这两种场景下网络带宽几乎没有压力真正的压力在CPU处理每个包的开销上。64字节的小包线速千兆口每秒大约可以跑148万包万兆口每秒接近1480万包。如果处理一包要消耗1万周期单核CPU通常只有几十到上百个包的处理能力这显然不够。高性能网络协议栈的目标就是尽量压低“每包CPU成本”让单核能突破百万级包处理能力。1.2 两个优化方向改内核与绕内核优化协议栈性能业内基本两条路线。第一条优化内核协议栈。比如调整网卡多队列、中断合并、内存调优、协议参数调整再配合RSS、SO_REUSEPORT之类的手段。优点是改动小、兼容性好但天花板相对明显因为内核协议栈要兼顾所有应用很多通用性开销是省不掉的。第二条绕开内核协议栈。用轮询模式直接收发数据包用户态接管协议处理或者干脆用硬件完成数据放置。这条路提升明显适合PPS要求极高的场景但需要应用配合实现对整体架构的影响也比较大。两者不是对立关系实践中常常混用。比如我挂载在框架中的网关为了保证四层转发效率和流量可观测性就选择绕内核方案而普通业务接口仍然走常规内核协议栈。1.3 谈性能之前先统一度量衡优化之前必须把性能指标定义清楚否则后面的一切数字都没有意义。对协议栈来说核心指标有三个PPS每秒处理包数、带宽Bps、连接处理能力CPS / 并发连接数。还有一个容易被忽视的指标是延迟分布尤其是p99、p999。我习惯先把“目标场景”定下来是给高并发短连接做接入还是给大量长连接做转发还是给分布式存储做RDMA类的大块数据搬运。不同场景优化重点完全不同。短连接看重新建连接的处理速度长连接看重并发数下的CPU稳定性大块数据看重带宽和内核拷贝开销。提示先想清楚指标再想清楚技术。一个方案是降延迟还是升吞吐结论完全不同别混在一起评估。2. 内核协议栈的瓶颈究竟在哪里不把内核协议栈的瓶颈讲透你就不知道高性能方案在“高”什么。2.1 一条收包路径上的七道关卡一次普通的UDP小包接收数据从网卡到应用大概经过这条路径网卡DMA到环形缓冲区触发硬中断中断处理函数唤醒软中断ksoftirqd软中断里调用网络协议的处理流程先做协议分发接着交给传输层处理完放进套接字接收队列最后唤醒正在等待的进程。用户态再通过read或recvmsg发起系统调用从内核缓冲区把数据拷贝到用户态缓冲区。看起来没问题但这套流程每一步都有成本。硬中断会打断当前CPU上的进程软中断占用CPU时间协议分发要遍历哈希链表传输层有队列锁通知唤醒需要一次进程调度。把一个64字节的包完整走一遍普遍需要消耗上千乃至几千个CPU周期。更关键的是这些成本有很大一部分是“固定成本”跟包大小无关。哪怕只发一个字节系统调用、数据拷贝、上下文切换一样都少不了。所以小包高并发的场景传统内核协议栈的天花板非常明显。2.2 系统调用与数据拷贝的隐藏成本系统调用不是免费的。每次进入内核态涉及上下文切换、参数检查、CPU缓存扰动。如果是通用socket调用还涉及一次从内核sk_buff到用户缓冲区的数据拷贝。在万兆网卡上大包场景拷贝拷走一部分CPU性能小包场景系统调用开销甚至会超过协议处理本身。很多高性能方案做零拷贝本质不是玄学而是想“拖走”系统调用和数据拷贝这两座大山。要么让用户态直接掌控网卡队列要么通过内存映射的方式减少拷贝次数。重点不是拷贝本身花多少纳秒而是它引发了系统调用的连锁开销。2.3 并发竞争与缓存局部性比CPU计算更贵内核协议栈还有一个常被低估的隐藏成本并发竞争。一个多核CPU上的协议栈要保证多个进程、多个socket并发收发不出错必须靠锁。而锁竞争的代价不在于锁本身的CAS指令而在于“等待”和“缓存同步”。设想一个典型场景大量请求集中在同一个CPU核上产生软中断同时另一个核上的应用线程还在不停读socket。这个socket的队列头部、统计字段需要我们两个CPU来回同步。每同步一次涉及缓存行在多个核心之间切换这个代价比CAS本身高得多。这就是为什么简单的自旋锁在高PPS下也能成为致命瓶颈。2.4 先取样再动手用数据锁定瓶颈层排查瓶颈时别猜直接看证据。我用得最多的流程先用perf top看CPU时间分布再用火焰图定位热点在硬中断、软中断、系统调用还是用户态接着用网卡工具观察实际收包率、丢包率、中断次数最后用strace或者bpftrace这类工具看系统调用次数。有一次我一台转发服务器CPU满负荷perf top显示热点集中在传输层接收处理函数和锁等待上。原因就是单队列网卡把所有流量都压到了一个CPU核上。后来改成多队列并绑核CPU使用率立刻下降超过一半。这类问题靠猜是猜不出来的必须先取样再动手。3. 设计数据面时的关键选型轮询、批处理与零拷贝这里进入高性能协议栈本身的设计环节。不是让你从头造一个完整协议栈而是把最核心的数据面设计思路讲清楚很多方案可以直接借用到自己的模块里。3.1 轮询模式为什么更适合高吞吐传统中断模式适合低负载、低功耗场景负载上来之后中断风暴会占满CPU。高性能协议栈普遍采用轮询模式CPU不停扫描网卡的描述符队列有新包就立刻处理。轮询带来的最大收益是“确定性”。没有中断唤醒、没有软中断调度抖动CPU时间完全花在处理包上。代价是CPU持续跑满哪怕没有流量也会空转损耗功耗。所以轮询模式经常搭配动态调节流量低时退回到中断模式流量高时切换到轮询。我在实现转发面时采用的方式就是网卡以轮询方式收包但把轮询空闲的时间片让出来主线程循环里没有包可收时主动让出CPU既保留了低延迟又不会完全占死一个核。3.2 批处理的摊销逻辑单包处理效率再高也有上限真正拉开差距的是批处理。每次从网卡队列里不是拿一个包而是一次性取走一整批包比如128个集中做协议解析、分类、转发。批处理的收益来自于摊销一次批量取包只用一个循环入口指令缓存和分支预测的命中率大幅提高锁竞争次数减少内存分配可以批量从池里取出。实测下来同样的设备批处理比逐包处理吞吐能提升几倍这并不夸张。代码上体现为这样的循环结构while (1) { uint16_t nb rxpoll(port, rx_pkts, BATCH_SIZE); if (nb 0) { sched_yield(); continue; } for (uint16_t i 0; i nb; i) { process_pkt(rx_pkts[i], out_pkts[out_cnt]); } if (out_cnt 0) { txflush(port, out_pkts, out_cnt); out_cnt 0; } }关键点在于收包、处理、发包三段都强调批量。你可以在自己的用户态收包loop里借鉴这个结构收益立竿见影。3.3 零拷贝不是玄学是一条边到边的路径零拷贝的常见误解是“不用拷贝就快”。实际上任何能绕开内核缓冲区、避免用户态再复制一份的方案核心收益在于绕开了系统调用和上下文切换而不是省掉memcpy那几百纳秒。现实中可行的做法有两类一类是用mmap映射网卡DMA环形缓冲区和包缓冲区让用户态直接访问网卡写入的数据另一类是借助RDMA之类硬件能力数据从网卡到应用内存全程DMA不需要CPU逐包搬运。两者都叫零拷贝但实现路径完全不同。选择时建议保守一点。映射方案对内存生命周期管理要求高稍不注意就出现包缓冲区被重复写的问题RDMA则要求应用和网络拓扑都配合虽然性能出色但系统复杂度明显上升。如果只是普通业务加速优先考虑批处理和轮询收益会稳健得多。3.4 多队列与核绑定让每个核干独立的活网卡多队列相当于把输入流量按哈希分散到多个硬件队列每个队列绑定一个CPU核处理。关键点是队列与核心之间一对一绑定不要随意迁移否则缓存局部性会衰减。绑核之后每个CPU只处理自己队列里的包整条路径上几乎没有锁竞争。现在我维护的网关8个接收队列绑定8个核配合rss的哈希分发单核处理不均的问题基本消除。如果发现某个核比其他核忙得多先怀疑哈希配置再看队列数是否匹配实际核数。4. 内存与同步协议栈优化里最容易翻车的“第二战场”处理路径优化之后接着一定撞上内存和同步的问题。这部分是大多数优化项目真正翻车的地方。4.1 内存池从频繁分配/释放中解放出来传统分配器适合动态大小、不可预知的分配模式。但协议栈收发路径上的包缓冲区大小范围非常集中生命周期短分配释放频率极高。这种情况下通用分配器在并发场景下会触发锁和缓存竞争。实践里最好用内存池。预先分配一整块内存切分成等大的对象用无锁队列维护空闲对象列表。收包前从池里取处理完归还没有内核态参与速度非常快。内存池要注意两个细节。一是池的大小要覆盖突发流量否则会退化成频繁慢路径分配二是不同包大小可以分多个池避免大包浪费小包池的空间。用内存池替换通用分配之后我最直观的感受是火焰图里分配相关的热点几乎全部消失了。4.2 无锁队列的适用边界无锁队列是高性能数据面的一等公民但无锁不代表没有代价。SPSC单生产者单消费者环形缓冲是最高效的模式一个生产者一个消费者完全不需要锁但要求严格的顺序语义非常脆弱。MPSC多生产者单消费者和MPMC多生产者多消费者则需要额外的原子操作和内存屏障性能下降不少。需要想清楚的是场景属于哪种模式。我的网关里网卡队列到协议处理线程是SPSC天然匹配线程之间传递事件则是MPSC。无锁队列在任何情况下不能替代业务层的逻辑设计它只负责解决并发控制业务顺序和可靠性依然是你的责任。4.3 cache line对齐与伪共享协议栈处理包时多个线程会频繁更新同一个结构的原子计数或队列状态。如果这些字段恰好同时位于一个64字节的cache line中一个核修改字段会让另一个核的这条cache line失效迫使对方重新读取。这就是伪共享。排查伪共享最常用的办法是在关键结构的字段之间填充padding让它们落到不同cache line。比如struct rx_stats { uint64_t packets; char pad[56]; }; struct tx_stats { uint64_t packets; char pad[56]; };对齐之后两个字段分别占不同的缓存行交叉访问时互不干扰。这个问题初看不明显但在高频更新场景下修复后可能直接带来20%到50%的性能提升。4.4 NUMA感知分配多路服务器上内存访问不是等价的。CPU访问本地内存远快于远端内存。如果收包线程在Node 0缓冲区内存却从Node 1分配每次收包访问都可能是远端延迟。对高性能协议栈来说缓冲区、队列状态、统计信息最好都做NUMA感知分配尽量让它们和消费线程所在的Node一致。如果用的是操作系统默认分配策略在高频小包场景下跨Node访问可能让性能出现意想不到的下降。分配时指定Node这个细节成本极低收益稳定。5. 实测与调优让优化结果说话的正确姿势优化做没做对最终还是靠测。很多项目死在“感觉快了很多但上线后没人觉得快”其实就是验证方法没做对。5.1 基准测试工具与正确打流方法测协议栈时打流工具和被测系统不能跑在同一台机器上否则你自己生成流量就把CPU占没了。我会用专门的压测机配合pktgen这类工具直接构造高速小包流或者用集成工具做多流压测。压测机网卡要能撑住线速通常用同型号甚至更高规格的网卡。测试时记录四个数字收包率、丢包率、CPU使用率、延迟分布。别忘了测试时长要拉长至少持续十分钟以上再下结论很多问题几秒钟内根本暴露不出来。5.2 三个指标对照表PPS、带宽、延迟不同优化对不同指标的影响差异非常大我整理了一份最简单的对照关系指标最大影响因素典型优化手段PPS系统调用、锁竞争、批处理轮询、批处理、无锁队列带宽数据拷贝、DMA效率零拷贝、大包聚合延迟中断合并、调度抖动低延迟队列、轮询模式、CPU隔离这里有个实际的观察中断合并对带宽友好但会让延迟增加批处理对吞吐友好但如果batch过大单包延迟会有可感知的影响。所以务必分清你当前最在意哪个指标再做对应取舍。5.3 用火焰图还原CPU时间去哪了我每次调优必做的第一件事是采一个火焰图。采集手段不复杂在压测进行时用perf record记录一段时间然后生成火焰图。看火焰图时重点关注三个区域最宽的“平顶”是CPU真正忙的热点两条路径合并处的“瓶颈”往往暗示锁或缓存等待尖刺状区域通常说明有频繁调用。一个常见的优化特点是改完之后热点从“内核协议栈”转移到了“用户态业务处理”。很多人看到用户态热点升高会以为变慢了其实不是说明内核开销已经让位给了真正的业务逻辑这正是理想结果。5.4 一次调优观察从单核瓶颈到线性扩展我调过一个转发模块最初所有流量压在单核上PPS在40万左右就到顶了CPU使用率百分百系统调用占了将近一半。优化顺序是先切成轮询加批处理PPS升到90万然后上内存池和无锁队列PPS上到150万最后配多队列绑核8个核基本线性扩展跑到1000万以上。这次调优最有价值的经验其实不在具体数字而在顺序先解决收发路径再解决内存分配最后解决并发扩展。每一步改动都单独验证性能出了问题能立刻定位是哪一步引起的。6. 踩坑记录高性能协议栈实施中常见的坑与排查链路最后分享几个踩过多次的坑。这些坑单独看都不算大但叠加起来能毁掉整个优化项目。6.1 中断合并带来的延迟毛刺一次做低延迟调优吞吐指标很好看但延迟p99非常高。排查链路是这样先看延迟分布发现每隔一段时间就会出现一批毫秒级延迟尖刺再看CPU火焰图软中断占比不高最后查网卡中断配置发现中断合并设置得太激进网卡攒够一堆包才中断一次。改法很简单降低合并阈值或者直接改成每包中断。代价是CPU开销明显上升但延迟毛刺消失。这里提醒大家做延迟敏感业务时网卡中断合并参数务必先检查不要想当然认为网卡默认配置是对的。6.2 锁优化后吞吐没变的根因有一次我把核心路径上的一个自旋锁换成了无锁队列压测结果毫无变化这让我困惑了很久。后来抓火焰图发现真正的瓶颈根本不在那把锁而在内核协议栈的全局统计计数上这属于被自己的预设判断带偏了。从这里学到的教训是优化前必须用性能分析工具定位真实热点而不是凭代码直觉替换“看起来有问题”的部分。锁只是嫌疑犯之一协议栈里的缓存一致性、内存分配、系统调用都有可能是真凶。6.3 轮询空转导致的高功耗与调度冲突轮询模式有个绕不开的副作用空转。没有流量时轮询线程依然在扫描队列CPU功耗很高。另一个更麻烦的问题是如果不做绑定隔离轮询线程会被调度器频繁迁移缓存和队列的亲和性被彻底打乱。我的做法是用CPU隔离把轮询线程固定到专门的物理核上同时设置调度优先级。这相当于牺牲几个核的功耗换取转发路径的确定性。真实业务里如果对功耗有要求应该加入动态中断/轮询切换机制不要一根筋开轮询。6.4 业务场景决定方案没有银弹高性能协议栈的方案选择必须回到业务场景本身。连接数几十万的网关和纯高速转发网关适合的数据面设计是不一样的云原生Sidecar和裸金属上的负载均衡器约束条件也不一样。如果在自己的服务里做轻量加速我建议从最温和的组合开始打开多队列绑核调整中断合并优化一下内存分配。把这些先做了测一轮再决定要不要走向轮询、零拷贝等重方案。高性能系统的代价通常不在技术本身而在它带来的运维复杂度和心智负担。最后一个实用建议每一层优化做完都要保留压测基线和环境快照方便随时对比。高性能网络协议栈不是写一次就能一劳永逸的东西流量的特征会变硬件的能力会变甚至业务上线后的调度方式也会变。把测量、分析、验证这套循环沉淀成习惯比记住任何具体方案都有用。

相关新闻

Linux进程切换与环境变量:从原理到排错实践

Linux进程切换与环境变量:从原理到排错实践

1. 从一段“卡顿”说起:为什么进程切换值得我们死磕先抛个场景。你在终端里同时开着编译任务、一个网页服务、还有编辑器,系统看起来“同时”在跑所有东西。但只要你做过性能分析,或者写过对延迟敏感的程序,你一定被下面这类问题折…

2026/10/18 8:51:22 阅读更多 →
Spy++ Lite 3.1.0.1:Windows窗口句柄调试与消息监控实战指南

Spy++ Lite 3.1.0.1:Windows窗口句柄调试与消息监控实战指南

简介:Spy Lite 3.1.0.1 是一款轻量级但功能完备的Windows窗口调试与分析工具,面向C/C、Win32 API开发者及逆向初学者,用于快速获取窗口句柄、解析窗体层级结构、监控控件状态,解决UI元素定位难、消息机制理解浅、跨进程窗口调试无…

2026/10/18 8:51:22 阅读更多 →
主流Shell选型指南:从Bash到Nushell的取舍与迁移

主流Shell选型指南:从Bash到Nushell的取舍与迁移

前两年我给自己手头那套“命令行环境选型清单”起了个代号,就叫WHAT——全称是We Have Alternatives in Terminal。说白了这个清单就回答一个问题:默认shell到底该换哪个。这个问题看着简单,实际踩的人不少。我见过太多“换过去又换回来”的案…

2026/10/18 8:51:22 阅读更多 →

最新新闻

快鹭办公、通达OA、奥哲、360织语怎么选:关注上手成本与日常易用性的对比横评

快鹭办公、通达OA、奥哲、360织语怎么选:关注上手成本与日常易用性的对比横评

从上手成本和日常易用性出发,一站式 AI 智能办公平台选哪个,关键看搭建入口是否降低门槛、日常操作是否集中、以及上线到习惯的迁移代价。本文围绕这条主线,比较快鹭办公、蓝信、360织语、奥哲、通达OA 五个同产品线候选:快鹭办公…

2026/10/18 13:44:05 阅读更多 →
Rust泛型算法库实战:契约设计、IntoIterator抽象与const泛型

Rust泛型算法库实战:契约设计、IntoIterator抽象与const泛型

简介:本资源是一份面向Rust中高级开发者与系统编程学习者的实战型技术文档,聚焦泛型编程核心能力培养,解决通用算法库设计中类型安全、复用性与性能兼顾的典型难题。文档完整覆盖泛型函数/结构体、trait约束、关联类型、生命周期注解、错误处…

2026/10/18 13:44:05 阅读更多 →
MySQL 主从复制报错 1133:从库缺少 repl 用户导致 SQL 线程中断的排查与修复

MySQL 主从复制报错 1133:从库缺少 repl 用户导致 SQL 线程中断的排查与修复

一、问题现象当前这个从库的 SQL 线程已经断了,原因是回放主库传来的这条语句时报错GRANT REPLICATION SLAVE ON *.* TO repl%报错Last_Errno: 1133Last_Error: Cant find any matching row in the user table说明从库的 mysql.user 里没有 repl% 这行用户记录&…

2026/10/18 13:44:05 阅读更多 →
变量化提示词:用占位符实现提示词的灵活复用

变量化提示词:用占位符实现提示词的灵活复用

在上一篇文章中,我们讨论了提示词模板引擎的整体架构。今天,我们要深入其中最基础也最实用的核心技术——变量化提示词。掌握它,你的提示词将从"一次性用品"变成"可复用的资产"。这就像编程中从硬编码到使用变量的飞跃—…

2026/10/18 13:44:05 阅读更多 →
电信BOSS系统接口契约规范:字段语义、同步机制与错误降级

电信BOSS系统接口契约规范:字段语义、同步机制与错误降级

简介:本资源是中国移动通信集团公司于2004年9月发布的《经营分析系统与BOSS系统互动技术规范》(企业标准QB-╳╳-╳╳╳-╳╳╳╳,V1.0.0)正式文档,面向电信行业系统架构师、BOSS/经营分析系统开发与集成工程师&#x…

2026/10/18 13:44:05 阅读更多 →
Python属性拦截四钩子:__setattr__、__getattr__、__delattr__与__call__实战

Python属性拦截四钩子:__setattr__、__getattr__、__delattr__与__call__实战

简介:这份PDF资料面向已掌握Python基础、希望深入理解面向对象机制的开发者,系统讲解__setattr__、 getattr 、__delattr__与__call__四个魔法方法的用法。内容从属性设置、属性读取、属性删除到实例可调用四个维度展开,每个方法均配有可运…

2026/10/18 13:43:05 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →