news 2026/9/16 5:19:40

Scale-up互联三国杀:NVLink、UALink与以太网

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Scale-up互联三国杀:NVLink、UALink与以太网

最近被问得最多的一个问题是:NVLink 到底还有没有对手?UALink 会不会是那个对手?更直白一点,以太网凭什么也来掺和?做 AI 基础设施的朋友聚在一起,几乎绕不开这几张“牌”。但要真把 NVLink、UALink、以太网这三套方案掰开看,你会发现它们争的并不完全是同一个东西,而是在“Scale-up 互联”这条赛道上,各自代表了一种技术路线、一种生态立场,甚至是一种商业策略。

这篇内容就当作一次同行之间的技术闲聊。我会从底层原理讲到当前实际落地状态,再给你一份可以直接抄作业的对比表,最后聊聊我在实际机房、训练集群里踩过的坑。不管你是做算力规划的、搞网络运维的,还是单纯想搞清楚“这三个名词到底在比什么”,这篇应该都能给你一个清晰的答案。

1. Scale-up 是什么,为什么突然成了必争之地

1.1 Scale-up 和 Scale-out 根本不是一回事

很多人会把 Scale-up 和 Scale-out 混在一起聊,这是第一个要分清的概念。

Scale-out 是横向扩展,意思是我把一万张卡通过网络连在一起,让它们协同工作。从 8 台服务器扩到 80 台、800 台,靠的是机器数和网络规模的增加。数据中心里已经跑得很成熟的那套东西——以太网、InfiniBand、调度器、分布式文件系统——主要都是为 Scale-out 服务的。

Scale-up 则是纵向扩展,意思是把一颗“逻辑算力芯片”里的能力做大,让一个 AI 加速器域内的多颗 GPU,像一颗 GPU 一样被使用。这里的关键词是“域”。在 Scale-up 体系里,GPU 之间的通信不经过网络交换机,或者说尽量少经过交换机,而是走专门的高速互连总线。

打个比方:Scale-out 是“多盖几个厨房,每个厨房里几个厨师各炒各的菜”;Scale-up 是“一个厨房里围一圈厨师,大家对着同一个灶台干活”。后者对沟通的实时性、配合度要求高得多。

1.2 GPU 之间的通信模式决定了 Scale-up 的硬性指标

要理解为什么 Scale-up 这么关键,得从分布式训练的通信模式说起。

大模型训练是天然分布式的。张量并行、流水线并行、数据并行,这三种并行策略对通信的需求完全不同。其中张量并行对通信的时延和带宽要求最苛刻——它把一个算子的计算切到多张卡上,每次前向、反向都要做 AllReduce 或 AllGather,这些操作里流动的是高频、低延迟、带宽密集的数据块。

这类通信量大不大?大。但对 Scale-up 来说,更要命的是“频繁”和“同步”。同步意味着整个训练步长要等最慢的那次通信完成,只要有一跳的尾部时延抖动,整个集群的吞吐就往下掉。这就是为什么传统以太网那一套先入队、再转发、偶尔丢包、重传的机制,在 Scale-up 场景里完全行不通。

原本 GPU 之间的互连走的是 PCIe,但 PCIe 是通用总线,既要连 CPU,又要连 NVMe,带宽被摊薄了。PCIe Gen5 的 x16 单向带宽大概也就六七十 GB/s,而 NVLink 已经做到了单 GPU 九百 GB/s 以上,量级完全不在一个层面上。所以 GPU 厂商必须为“卡与卡之间”专门修一条更宽、更直、时延更低的路,这就是 Scale-up 互联出现的根本原因。

2. NVLink 为什么能在封闭生态里称王

2.1 NVLink 不是一根线,而是一整套系统

很多人一提 NVLink 就想到“一根高速线缆”,这是不对的。NVLink 实际上是 NVIDIA 从 GPU 片内到片间、从 PHY 到协议栈、从驱动到通信库的全套解决方案。

从硬件上看,NVLink 至少包含三块:GPU 芯片上的 NVLink 接口,主板上的高速走线或线缆,以及一个非常关键的组件——NVSwitch。NVSwitch 是 NVIDIA 自研的高性能交换芯片,它的作用是在多个 GPU 之间做一个无阻塞的全交换网络,让任意两张卡都能以全带宽通信。

以 HGX H100 平台为例,8 张卡通过 9 颗 NVSwitch 组成一台 DGX,任意两个 GPU 之间的通信带宽都能到 900GB/s。到了 Blackwell 这一代,NVLink 5 直接把单 GPU 双向带宽推到了 1.8TB/s,同时把 NVLink 的能力从机器内部延伸到了机架级互联。

NVLink 强大的地方不止是带宽,它还实现了共享内存语义。多张卡的显存可以在统一地址空间里被读写,支持原子操作,GPU 之间可以直接读写对方的显存,而不需要先拷到主机内存、再由 CPU 中转。这一套能力总结成一句大白话就是:让一群 GPU“看起来像一块 GPU 那么大”。

2.2 NVLink 速度快的底层逻辑

和以太网、InfiniBand 相比,NVLink 最大的优势是它根本不需要遵守任何外部互操作协议。NVLink 知道对面连的一定是同一代 NVIDIA GPU,所以可以把协议栈做得很短,把链路做得很宽,把时延压到极低。

这里有三个维度值得分开看:

  • 带宽:NVLink 的物理层带宽远高于网络设备。H100 的 NVLink 双向 900GB/s,换算一下就是 7.2Tbps。而当时最强的 InfiniBand NDR 是 400Gbps,以太网也是 400G/800G 的节奏。这是一个数量级的差距。
  • 时延:NVLink 的点到点时延在微秒级甚至更低,走以太网的话,即使是 RoCEv2 无损网络,一次跨节点 RTT 也要几微秒到十几微秒,加上排队、拥塞、抖动,差距进一步拉大。对张量并行这类小消息密集型通信,时延就是生命线。
  • 语义:NVLink 支持原子操作和零拷贝,开发者可以直接把多卡看成一个大显存设备。NCCL 通信库在这些语义上做了深度优化,同一个 AllReduce 操作,在 NVLink 域内跑和在以太网上跑,性能差距能到几倍。

2.3 生态壁垒才是最深的护城河

说到底,NVLink 赢的不只是硬件,更是整套软件栈。CUDA 的统一虚拟地址、NCCL 的拓扑感知优化、cuBLAS 和 cuDNN 对 NVLink 的天然适配,这些才是让 NVIDIA 可以“闭着眼睛靠生态碾压”的核心资产。

我试过在一些开放平台上手动优化通信代码,结果发现同样的算法,NCCL 在 NVLink 上的表现就是比自定义方案稳定。原因很简单,NCCL 对链路拓扑的测绘、对小消息的调度、对故障的降级处理都积累了足够多的脏数据和教训。这种软件财富,很难靠一套开放标准在三五年里追平。

所以如果你现在要建一个纯 NVIDIA 集群,根本不用纠结,用 NVLink 就完了。它的性能最稳,工具链最全,排障方案最成熟。唯一的问题是贵,以及被锁定。

3. UALink 想做什么:开放阵营的“类 NVLink”

3.1 UALink 联盟:一场针对 NVIDIA 的“合纵”

UALink 全称是 Ultra Accelerator Link,是由 AMD、博通、思科、Google、HPE、Intel、Meta、微软等公司于 2024 年联合成立的联盟推动的开放加速器互连标准。

这个名字一出来,很多人就明白了:这不是单纯的技术方案,这是冲着 NVLink 生态去的。目标就一句话:在 NVIDIA 之外,做一个开放、可互操作的 Scale-up 互联标准,让不同厂商的 AI 加速器、交换芯片、服务器平台能像插电源一样互通。

从技术层面看,UALink 要做的确实就是 NVLink 正在做的事:互联一组加速器,提供超高带宽、低时延、内存语义、原子操作等能力。

3.2 UALink 1.0/2.0 的目标与规格

按联盟公布的规划,UALink 1.0 规格支持最多 64 个加速器设备互联,每端口物理速率 200Gb/s,可以组成全连接的 Scale-up 域。这个规模直接对标的场景就是 NVIDIA 的 8 卡、16 卡、64 卡 GPU 域。

UALink 2.0 计划把每端口速率提到 400G 甚至更高,聚合带宽会进一步逼近甚至对齐 NVLink 的指标。目前最新的进展是像 AMD MI400 系列这类芯片已经规划支持 UALink,交换芯片厂商也在跟进。

需要特别注意一个容易误判的点:UALink 并不是跑在 PCIe 或者 CXL 上面的通用协议,它是专为加速器之间的高带宽、低时延通信设计的,类似 NVLink 但更开放。它也可以和 PCIe/CXL 共存,各管各的:PCIe 管通用 IO,CXL 管内存扩展,UALink 管加速器之间的数据搬运。

3.3 为什么 UALink 有戏,但也别抱不切实际的期待

UALink 最大的价值在于开放。它的标准不是某一家公司闭门造车,而是由一票产业巨头共同定规则。如果 UALink 成熟起来,未来 AMD、Intel 的加速器、自研芯片的云厂商、乃至第三方交换芯片公司,都可能围绕它构建出一套独立于 NVIDIA 的 Scale-up 体系,让用户在采购时有更多选择。

但冷静下来看,UALink 目前还处于规范发布和早期硅片验证阶段。协议栈、工具链、驱动、通信库都还在爬坡期。我接触过的一些做网络芯片的团队反馈,UALink 的协议复杂度不低,真正的规模部署大概率要到下一代 GPU/加速器平台才能看到。

所以现在你不可能跑到市场上买到一台支持 UALink 的服务器,也别拿它和已经跑了两代以上的 NVLink 比成熟度。它更像是一种“未来资产”。

4. 以太网凭什么来掺和 Scale-up

4.1 传统以太网做不了 Scale-up,问题出在哪

很多人一听到以太网做 Scale-up 的第一反应是:这不胡闹吗?传统以太网那一套 TCP 加丢包重传的机制,在同步 AllReduce 这种最怕抖动的场景里,确实跟没穿鞋在火上跑一样。

三大物理问题:

  • 丢包重传:TCP 只要丢了一个包,整个流就要等着重传。AI 通信里一个大消息被切成几十万个包,任何一个包晚到,那个 GPU 就得干等。
  • 排队时延:以太网交换机为处理高并发流,缓存很深,但深缓存带来的是高低起伏的排队时延。可以接受平均时延,接受不了“99 百分位时延突然飙到几毫秒”这种尾部延迟。
  • 拥塞控制:传统以太网的拥塞控制是为了公平共享链路,不是为了提前完成某个同步通信组。AI 训练场景要的是“这个 AllReduce 尽快结束”,而不是“大家公平地用链路”。

所以过去十年,做高性能 AI 网络的团队基本都绕开了传统以太网,要么用 InfiniBand,要么用 RoCEv2 无损以太网。RoCEv2 通过 PFC(优先级流控制)制造一个“看起来不丢包”的链路,但 PFC 的副作用是队头阻塞——一个慢队列能卡住整条物理链路。这也是很多从业者在实际机房抠头的地方。

4.2 UEC 在做的事:对以太网进行“大手术”

以太网阵营当然不服。2023 年,AMD、Arista、博通、思科、Intel、Meta、微软等公司成立了超以太网联盟(Ultra Ethernet Consortium),目标是用以太网的开放生态,把 Scale-out 甚至 Scale-up 的性能做到 InfiniBand 和 NVLink 的级别。

UEC 的做法不是微调,而是大改。它重新定义了以太网的链路层和传输层,提出了一套新的拥塞控制、流控和信号面(Signant/Control Plane)机制,目标是把尾部时延降下来、把带宽利用率提上去,同时支持几千卡级别的同步通信组。

我看到的公开信息是,UEC 1.0 规范已经发布,2025 年陆续有厂商开始出支持 UEC 特性的交换芯片和网卡设备。这项技术对 RoCEv2 那种“打了补丁的无损网络”进行了系统性的重写,如果能按预期落地,以太网拿下一个相当可观的 Scale-out 市场份额是没有悬念的。

不过这仍然不能等同于“以太网直接做 Scale-up”。想做 Scale-up,需要的是一个 GPU 域内的广播/同步通信体系,UEC 里的很多设计目前可以把 Scale-out 的时延和可靠性拉高,但要达到 NVLink 那种几百 GB 甚至 TB 级带宽的 Scale-up 域,还需要结合上一节说的 UALink 这类的专门方案。

4.3 以太网的最佳武器:生态和成本

以太网做 Scale-up 的底气到底在哪?很多人会忽略一点:Scale-up 不是凭空造的,它要接住 Scale-out 的存量资产。

现在任何一家互联网公司、云厂商的数据中心里,跑着的绝大多数流量都是以太网。运维团队对以太网交换机的配置习惯、监控工具、故障排查方法已经沉淀了一二十年。如果 Scale-up 方案能尽量沿用以太网的运维模型,那么学习成本、运维成本、厂商绑定成本就能压到最低。

从成本说也有明显优势。专有的 NVSwitch 和 NVLink 线缆虽然能带来性能,但一机柜下来几十万上百万很常见。以太网交换芯片是通用量产的,竞争者多,价格被压得相当低。在算力规模大到一定程度时,每 Gbps 的硬件成本会成为决定性因素。

但这套逻辑有一个前提:以太网必须先把性能和可靠性做上来。如果技术上达不到,再便宜也只能用在容错性更强的数据并行和专家并行场景,而无法支撑张量并行这种高敏感性通信。

5. 一张表看懂 NVLink、UALink、以太网 Scale-up 的差异

5.1 核心参数对照表

为了直观,我把三者的关键维度整理成一张表。注意数据会根据具体代数、规格有所浮动,但量级和方向是具有代表性的。

维度NVLink(含 NVSwitch)UALink以太网(含 UEC 方向)
核心定位GPU/加速器域内 Scale-up 互连开放加速器域内 Scale-up 互连服务器/加速器 Scale-out 互连,逐步往 Scale-up 演进
单设备典型带宽H100 约 900GB/s,Blackwell 约 1.8TB/s 双向1.0 每端口 200Gb/s,2.0 提升到 400G/800G 级,聚合带宽对齐 NVLink单网卡 400G/800G 起步,做 Scale-up 需依赖新流控和并行链路聚合
时延微秒级以下,确定性高,尾部时延极低目标对齐 NVLink,处于验证阶段传统以太网时延抖动大;RoCEv2 可用但受 PFC 影响;UEC 目标大幅改善尾部时延
通信语义内存共享、原子操作、RDMA 式读写支持内存语义和原子操作,规范在完善传统以消息收发为主;UEC 尝试引入更丰富的通信原语
所有者/生态NVIDIA 封闭生态,与 CUDA、NCCL 深度绑定开放联盟,多家芯片/服务器/云厂商共建开放标准 + 开源生态,硬件供应商极多
成熟度已在 H100、B200 等平台大规模商用多年规范发布,早期硅片验证阶段以太网本身极成熟;UEC 特性刚开始落地
适合场景纯 NVIDIA 集群、追求极致性能多厂商混合集群、希望摆脱 NVIDIA 锁定超大集群、云厂商、成本敏感且规模优先

看到这里你会发现,三家不是简单的“谁快谁慢”的关系。NVLink 是现役主力,UALink 是挑战者,以太网则在努力从 Scale-out 的大本营向高带宽、低时延的方向渗透。

5.2 三个典型场景怎么选

场景一:纯 NVIDIA 大规模 GPU 集群。这个不用犹豫,NVLink 就是最优解。CUDA 和 NCCL 的搭配已经非常成熟,随便找一个跑过千卡训练的团队,都能给你讲一堆基于 NVLink 的调优案例。你要做的是接受价格和生态锁定,换来最快的上线速度和最低的试错成本。

场景二:混合异构集群,或者平台方有自研 AI 芯片。那 UALink 是你需要关注的重点。一旦 UALink 成熟,它能让你把不同厂商的加速器放进同一个 Scale-up 域里,避免被单一厂商卡脖子。目前确实还早,但做长远规划的话,现在就该派人跟踪协议演进了。

场景三:超大集群、几万卡、强规模效应。这种体量的瓶颈通常不在单机性能,而在海量节点的调度、故障恢复和成本。以太网加逐步升级的 UEC 特性会是主流方向。Scale-up 域可以提高单节点性能,但比例不会太高。关键是要保证 Scale-up 域和 Scale-out 网络能无缝衔接。

5.3 别把 UALink 和 UEC 混为一谈

这是我在聊技术方案时经常要纠正的误区。UALink 和 UEC 虽然名字很像,成立时间也差不多,但它们是两套完全不同的技术体系。UALink 管的是加速器之间的 Scale-up 直连;UEC 管的是以太网链路层和传输层的优化,主要面向 Scale-out,也能为 Scale-up 提供辅助。你可以理解为 UALink 是“横向连接卡与卡的高速管道”,UEC 是“把以太网这套公路系统重新修一遍、增加几车道”。

很多文章把这两者混在一起说,容易让读者以为 UALink 就是以太网的一个分支,这种理解会直接影响技术选型判断。记住一点:UALink 更像是一个“开放的 NVLink”,而不是“更快的以太网”。

6. 别踩的坑:Scale-up 互联的四个认知误区

6.1 “带宽大就等于时延低”

这是我见过最多人搞错的地方。带宽只是链路的一个维度。同样一条 900GB/s 的链路,如果协议栈做得很长,比如数据要先从 GPU 显存拷贝到主机内存、再经过驱动、再进协议栈包装,时延会高得离谱。

AI 训练里的 AllReduce 有大量小消息,比如几 KB 到几十 KB 的梯度更新消息。这种流量对带宽不敏感,对时延和消息处理速率极度敏感。NVLink 厉害的地方不仅是带宽,更深层的是它用内存语义和零拷贝把端到端路径缩短了。单一带宽大不是性能的充分条件。

6.2 “开放协议的性能一定不如封闭方案”

这种说法不严谨。协议只是纸面标准,最终性能取决于实现。NVLink 到了 Blackwell 这一代能做到 1.8TB/s,UALink 2.0 的纸面目标已经和它对标了,未来开放硬件厂商在物理层、交换芯片、PCIe 集成方面有大量经验可以复用,性能差距会逐渐收窄。

更关键的是,开放生态可以通过“更便宜地扩展”来弥补单点性能差距。一个 NVL72 机柜的 NVLink 域规模是固定的,但 UALink 域可以随着标准迭代越做越大。做基础设施的人要算总账,不能只盯着峰值带宽。

6.3 “Scale-up 随便拉根线就能组”

Scale-up 互联是典型的高鲁棒性系统工程。它要求所有设备必须处于同一个故障域、同一个时序域、同一套配置管理面。你不可能用几条散装的 NVLink 线缆把两台服务器串起来就组成一个域。

真正做一台 8 卡的 HGX 服务器,要保证 PCB 走线等长、供电稳定、散热均匀、固件版本匹配。到了 NVLink 域跨机柜扩展时,还要处理光模块、交换芯片、拓扑管理、软件升级的一致性。很多团队第一次搭大规模 GPU 集群时,问题恰恰出在这些“看起来只是插根线”的地方,最后变成排障噩梦。

6.4 “NVLink 生态一定不会被替代”

这个话别说得太死。历史上封闭高速互连被开放方案替代的例子并不少见。今天 UALink 之所以能在巨头之间快速达成共识,核心原因就是大家希望早点把话语权从一家公司手里拿回来。

NVLink 和 CUDA 的绑定确实深,但技术生态从来不是靠不可替代性,而是靠“够不够用”和“有没有替代成本”。当 UALink 的带宽达到同类水平、工具链补上来之后,你看云厂商的反应就知道谁会先动摇。可以预见,三五年后的 AI 集群不会只有一个形态,开放标准会有一席之地。

7. 从实战角度给几点建议

7.1 给做算力规划的人

如果你明年要交一份 GPU 集群采购方案,别只看单卡算力,要把互连系统当成整体设计。NVLink 域内的性能和域外的网络带宽是强耦合的。一台 H100 服务器上 NVLink 900GB/s,但如果节点间只有两张 400G 网卡,那么跨节点通信的比例如果高了,网络就会变成短板,NVLink 的优势根本发挥不出来。

建议把训练模型的通信模式拆出来,算清楚“单域内通信占比”和“跨域通信占比”,再做带宽规划。很多已经上车的团队都吃过这个亏:花了大价钱配了最好的 GPU,网络却用老一代 100G 网卡,结果训练吞吐完全上不来。

7.2 给做网络运维的人

以后你面临的很可能不是一个纯以太网机房,而是以太网、RoCEv2、UEC、UALink 并存的混合环境。建议从现在就练好三件事:第一,无损网络的体征排查,PFC 风暴和丢包定位能力;第二,GPGPU 集群的监控体系指标建设,包括 NVLink/RoCE 链路利用率、通信库的等待时长;第三,多链路故障定位,Scale-up 域内一处故障会影响整个同步通信组,定位思路和传统网络完全不同。

7.3 给做芯片和板卡的人

UALink 的机会窗口就在这一两年。如果你在做 AI 加速器、DPU、交换芯片,建议趁早把 UALink IP 接进去,PDK、验证环境和参考设计都提前搭好。等客户真正要下单时,你手里如果没有支持 UALink 的方案,很可能直接被 Pass 掉。

另外提醒一点,协议演进期间上下游还没有形成标准测试体系,千万别依赖某一家厂商的私有扩展去实现“更快”。在开放标准赛道上,兼容性比单点性能更能创造长期价值。

在我个人的实际体验里,Scale-up 互联的选型从来不是一个纯技术问题,它往往牵涉到预算结构、供应商策略、团队技能栈甚至公司长期技术路线。NVLink 很好,但如果你问我会不会把所有鸡蛋都放在一个篮子里,我的答案是不会。UALink 和 UEC 的成熟确实还需要时间,但它们带来的开放选择权,对整个行业的价值怎么强调都不为过。最后再分享一个小经验:评估这些技术时,多看看它在故障场景下的表现,比如链路抖动、设备掉线、协议降级,这些才是决定一个方案能否真正在生产环境里站住脚跟的关键。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 5:19:00

Spring Boot公寓报修系统毕设实战:状态机、并发控制与文件处理

简介:本资源是一套基于Spring Boot与Vue开发的公寓报修管理系统完整毕业设计项目,面向计算机专业本科生及Java全栈初学者,解决高校或中小型公寓物业中报修流程线上化、工单闭环管理、多角色协同等实际问题。压缩包共460个文件,9.8…

作者头像 李华
网站建设 2026/9/16 5:18:58

Pentagi:AI智能体驱动的渗透测试新架构

1. “Pentagi”不是拼写错误,而是一个正在成型的技术概念锚点你搜“pentagi”,页面上跳出来的全是“pentest”“penetration testing”“AI agents”“Docker”“Neo4j”——没有官方文档、没有GitHub仓库、没有公司主页,甚至没有一篇像样的技…

作者头像 李华
网站建设 2026/9/16 5:18:55

LTE/NR信道模型全解析:从TDL/CDL参数配置到外场测试避坑

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

作者头像 李华
网站建设 2026/9/16 5:17:20

Windows 11临时文件清理全指南:从系统工具到bat脚本,彻底释放C盘空间

C盘又红了?开机右下角弹出“磁盘空间不足”的时候,别急着装那些什么C盘清理大师、垃圾清理全家桶,先冷静一下。绝大多数情况下,Windows 11自己的临时文件清理加上几条命令,就已经能解决大半问题。这篇我就把我自己平时…

作者头像 李华
网站建设 2026/9/16 5:17:07

Kimi K2.8 Preview:AST级代码理解如何重塑IDE智能开发

1. Kimi K2.8 Preview 不是“又一个大模型更新”,而是开发者工作流的临界点突破最近在几个技术群和开源社区里,大家聊得最多的一句不是“Kimi又发新模型了”,而是“Kimi Code插件一装,我本地的VS Code突然会‘读代码’了”。这背后…

作者头像 李华
网站建设 2026/9/16 5:16:40

56G PAM4 SerDes发射端为何必须用4-tap数字FFE

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

作者头像 李华