news 2026/9/7 15:51:37

GPU电压噪声根因与压测复现:从di/dt到IR drop的硬核解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GPU电压噪声根因与压测复现:从di/dt到IR drop的硬核解析

说起来有点巧,前几天我们一台GPU服务器在跑24小时高负载压测的时候突然掉驱动,排查到最后不是散热不行,也不是显存坏块,而是供电电压在某个瞬间跌过了阈值。这让我重新翻出那篇关于GPU电压噪声的芯片压测论文,边看边对着测试数据比对,很多之前模糊的理解一下子就对上了。这篇文章就是围绕那篇论文的解读,核心就一个:GPU在压力测试下产生的电压噪声,它的根因到底有哪些,以及我们怎么在实际压测中复现和验证这些问题。适合正在做芯片验证、GPU服务器运维,或者对体系结构和电源完整性感兴趣的朋友参考。

1. 芯片压测到底在测什么:电压噪声为什么值得单独立项

1.1 压测不仅仅是“跑分”,更是在制造最恶劣电气条件

说到芯片压测,很多人第一反应是跑个FurMark、跑个3DMark,或者让显卡挖矿一整天,温度不爆、不死机就算通过。但从芯片设计和验证的角度看,这些做法只能算“发热测试”,远算不上真正的电气压力测试。芯片压测的目标是在受控条件下制造最大瞬态电流、最小电压余量、最高温度梯度等综合最差工况,用来提前暴露设计或系统集成层面的缺陷。论文里反复强调一个点:一个芯片可能跑性能benchmark全绿,却在某些特定指令序列下出现毫秒级的电压跌落,进而引发频率降档甚至逻辑错误。这就是为什么压测必须专门针对电压噪声来做设计,而不能拿通用负载顺手顶替。

从物理层面看,GPU的功耗模型可以粗略表示为P约等于C乘V平方乘f乘翻转率。压测程序的作用就是把翻转率人为拉到一个接近1的水平,让电流在极短时间内达到峰值。别小看这个公式,它解释了为什么“空转-满载-空转”这种循环负载比持续满载更容易暴露问题。持续满载时,电流虽然大,但变化率相对平缓;反而是空转瞬间切回满载,电流在几个时钟周期内猛增,供电网络的寄生电感立刻产生感应电压,把核心电压往下拽。论文里的典型实验也是这么设计的:先让SM进入高占空比计算,再瞬间切到访存密集指令,记录片上电压轨迹,一条条电压峡谷就这么出来了。

1.2 电压噪声和时间余量的关系:为什么“看起来能跑”其实很危险

许多人对电压噪声的危害没有直觉。GPU内部有数以万计的触发器,每个时钟沿都要采样数据。如果供电电压在采样沿附近出现几十毫伏的跌落,触发器的建立时间和保持时间都会恶化,轻则临界路径延迟超限,重则直接采到错误数据。为了对抗这种噪声,芯片设计人员会预留电压裕量,但裕量越大,功耗越高,频率上不去,所以设计上总是尽量压缩裕量。这就形成了一对天然矛盾:你越追求能效,芯片对电压噪声就越敏感。

论文里描述了一个很有意思的观察:在一些低频工况下,电压噪声反而比高频时更严重。原因并不复杂,频率低的时候芯片可以进入更深的低功耗状态,唤醒瞬间的电流变化率可能比稳态满载时还大,这种“待机-唤醒”的瞬态冲击是电压噪声的重要来源。对做GPU服务器运维的人来说,这意味着你不能只看满载状态,空转、低负载以及负载切换这些状态都要纳入压测观察范围。我在实际压测中见过太多次“满载稳如老狗、一开一停瞬间死机”的场景,本质上都是电压噪声在切换瞬间爆表。

2. GPU电压噪声的四个根因,逐个拆解

2.1 根因一:di/dt瞬态电流冲击,电压噪声的“主力”

先上公式:电压噪声等于回路寄生电感乘以电流变化率。供电回路里只要有寄生电感L,电流变化越快,感应出来的电压噪声就越大。GPU一旦出现大规模负载切换,比如线程块密集启动、全局内存访问风暴、或者内核切换,电流可以在几个纳秒内发生剧烈变化,于是供电网络上就会感应出电压尖峰或跌落。

这里可以拿水管做类比。水管里水在高速流动时,你突然把阀门拧死,管道会“哐当”一声震动,这就是水锤效应。电感里的电流突变也是同理,电流本身不想瞬间改变,外力强制它变,它就会在供电网络上砸出一个电压坑。论文里做了一个很有价值的实验:他们用不同种类的指令混合负载输入GPU,发现浮点计算密集型负载并不一定产生最大电压噪声,反而是“计算-访存交替型”负载把电压跌落拉到了极限。原因就是这类负载让电流在计算单元和存储系统之间来回摆动,形成纳秒级别的电流摆动。如果程序里还配合原子操作,多个线程同时命中同一个L2分区,局部电流密度会更高。因此评估一个压测程序是否有效,不能只看它把GPU占用率拉到多高,而要看它是否制造了足够大的电流变化率。

注意:压测时如果用了功耗锁,比如在Linux下执行nvidia-smi -pl把功耗上限卡死,电流变化会被功率限制器平滑掉一部分,导致电压噪声被“隐藏”。要复现论文中的最恶劣电压噪声,建议在默认功耗墙下跑,或者把功耗上限调到允许范围内的最大值。

2.2 根因二:IR drop与供电网络阻抗,高频噪声之外的另一半

如果说di/dt管的是瞬态“冲击”,IR drop管的则是稳态“落差”。电压降等于电流乘以电阻,供电网络从电源模块到片上晶体管之间,隔着PCB走线、封装引脚、焊球、片上金属层,每一段都有寄生电阻。电流越大,沿途的电压损失就越大,到达核心深处时电压已经比电源标称值低了不少。论文中通过片上传感器测量了GPU不同位置的实际电压,发现中心区域与边缘区域之间存在明显压差,个别热点区域的IR drop可以占总噪声预算的三成以上。

继续用水管类比,IR drop就像水管沿路有渗漏和阻力,水从源头流到末端,末端的压力和流量都变小了。GPU核心内部的供电网格也是一样,供电输入点在芯片某几个位置,电流要穿过密密麻麻的金属层才能到达各个SM,距离供电点远的模块天生就“吃”到的电压更低。如果恰好那个远端模块还在跑高功耗计算,局部电压缺口会更大。论文里给出的对策思路也很清晰:不是盲目加高输入电压,而是优化片上供电网络的金属密度,以及在热点区域附近布置去耦电容。对压测来说,IR drop意味着你不能只在板卡供电端测电压,最好能拿到片上数据,否则会严重低估核心区域的实际电压跌幅。普通用户拿不到片上传感器数据,但可以通过DCGM读取部分型号GPU的电压读数,再结合板级示波器测量做推算。

2.3 根因三:封装和供电网络的LC谐振,最容易被忽略的“放大器”

继续往深处挖,供电网络本质上是一个由封装电感、去耦电容、片上电容构成的二阶系统。电容器件和电感器件组合在一起,自然会有谐振频率。当负载电流的波动频率接近谐振频率时,很小的激励就能激起很大的电压振荡,这个效应在工程上叫电源完整性谐振。打个比方,就像弹簧上挂了重物,你每次推它的频率正好撞上它的固有频率,弹簧的反弹幅度会被越推越大,哪怕每次推的力气不大,最终振幅也能大到吓人。

论文中记录的GPU电压噪声频谱里,通常能看到一个明显的低频峰,大概在几十MHz到几百MHz之间,这个峰往往就是封装和基板谐振造成的。压测程序要想把电压噪声拉满,就需要有意让内核产生与谐振频率接近的电流周期。论文作者的做法是扫描不同长度的循环体,找到让电压振荡最大的指令序列长度,再把它固化成专门的“电压噪声压测核”。这里有一个误区需要注意:不是指令执行越密集噪声越大,而是指令周期宽度越接近谐振周期,噪声越大。实际工作中,我曾见过一个CUDA kernel开始时电压纹波异常大,后来发现是for循环的展开因子把电流周期推到了谐振点附近,稍微改了改循环结构,纹波立刻降下去了。做压测时要明白这个道理,扫频是必须的,不能只凭感觉选一组固定参数就开跑。

2.4 根因四:负载调度不均匀和子系统耦合

四个根因里,最让系统级工程师头疼的是负载在芯片空间和时间上的分布不均匀。GPU有几十个SM,如果调度器把大量线程块集中到靠近供电输入的位置,而芯片远端区域空闲,供电网络里的电流路径就会集中,局部IR drop加重;反过来,如果调度器把负载分散到整颗芯片,虽然平均IR drop可能减小,但会带来更大的空间电流摆动,同样会产生噪声。论文的实验里对比了几种不同的线程块调度策略,发现同一个kernel在占用率相同的情况下,仅因调度顺序不同,电压噪声幅度就能差出两倍以上。

还有一个常被忽略的耦合路径是CPU和GPU共享供电或共享散热。在集成显卡或部分笔记本平台上,CPU和GPU的VRM可能共用一路输入,CPU突然进入睿频会拉低输入电压,GPU这边的电压也随之波动。论文里把这部分归为“系统级根源”,并且强调单芯片级压测没办法完全覆盖这类问题,必须放到整机环境里做联合压测。这也是为什么服务器运维人员在GPU压测时最好同时给CPU施加负载,否则无法真实模拟最恶劣电压条件。把四个根因放到一起看,它们的触发条件、时间尺度和侧重点都不太一样,我用一个表格整理了出来:

根因物理机制典型触发场景时间尺度主要对策
di/dt瞬态冲击寄生电感感应电压负载切换、内核唤醒、访存风暴纳秒级去耦电容、软启动、负载渐变
IR drop供电路径寄生电阻压降高功耗热点、供电边界区域稳态到亚微秒优化供电网络、局部去耦、预留电压裕量
LC谐振封装电感与电容谐振放大指令循环周期接近谐振点数十到数百MHz调整负载周期、阻尼策略、扫频规避
调度不均匀电流空间分布不均、子系统耦合线程块调度、CPU睿频联动微秒到毫秒级调度优化、系统级联合压测

实际压测中,这四个根因往往是叠加出现的,比如一次内核切换既触发di/dt冲击,又因为切换后的负载热点分布改变而加重IR drop,同时还可能踩中谐振频率。所以复现电压噪声问题时,不能指望单靠一种手段解决,要有一套系统级的方法论。

3. 从论文到实践:如何复现并观测GPU电压噪声

3.1 构造一个“电压噪声优先”的压测程序

理解了根因之后,下一步就是动手重现。这里给出一个基于CUDA的简化版压力核设计思路,它不是论文里的原代码,但复刻了论文的核心方法,用来在真实GPU上放大电压噪声是比较有效的。

设计原则有三条:

  • 制造高频电流切换:在一个kernel里密集交替执行计算指令和访存指令,避免长时间停留在同一种指令上。
  • 制造局部电流热点:让多个线程块并发访问同一个L2分区,利用原子操作制造冲突和阻塞。
  • 扫频找谐振点:把主循环体长度做成参数,从小到大扫描,观察电压噪声或频率波动,找到最坏情况。

下面是一段示例代码,只保留关键结构:

__global__ void volt_noise_kernel(float* out, const float* in, int loop_len, int access_stride) { int idx = blockIdx.x * blockDim.x + threadIdx.x; float acc = 0.0f; // 计算密集段:高flops,高占空比 for (int i = 0; i < loop_len; i++) { acc += sinf(in[idx] + i) * 0.001f; } // 访存密集段:制造大量内存请求,触发电流切换 for (int i = 0; i < loop_len; i++) { int addr = (idx + i * access_stride) & (BUF_SIZE - 1); acc += in[addr]; } // 原子操作段:在限定地址上制造竞争 for (int i = 0; i < loop_len / 4; i++) { atomicAdd(&out[0], acc); } out[idx % 64] = acc; }

这段代码故意做得“不那么高效”,因为压测目标本来就是制造异常负载。使用时把loop_len从几百调到几万,配合occupancy配置,比如每SM跑满2048线程,再用NVIDIA DCGM或示波器观察电压和频率变化。实测中loop_len落在某个区间时,GPU核心频率会出现明显周期性掉档,那就是电流波动撞上谐振点的信号。我在测试中遇到过loop_len设成8192时一切正常,改成16384后掉频明显,再改成32768又恢复稳定,这基本就是谐振点扫出来了。

跑这个程序的时候,建议每个loop_len档位至少跑3分钟,让温度和功耗达到稳态后再记录数据。只跑几十秒的话,温度还在爬坡期,电压、频率、功耗三者之间的关系没有稳定下来,数据参考价值会差很多。

3.2 观测手段:示波器、DCGM与片上传感器如何配合

压测程序跑起来之后,怎么知道电压噪声真的被放大了?最直接的方式是示波器。GPU供电输入端的测量点通常在PCIe金手指附近的12V供电电感两端,或者VRM输出端的电容网络处。示波器探头要用短地线弹簧针,接地路径一长,探头本身的寄生电感会把几毫伏的噪声放大成几十毫伏的假信号。测量时建议用20MHz带宽限制,既滤掉示波器自身的高频噪声,又能保留供电网络中真正有影响的低频振荡。

软件层面,NVIDIA的DCGM可以读取GPU的电压传感器和时钟频率历史,虽然它采样率不够高,不可能看到纳秒级瞬态,但用来观察毫秒到秒级的电压跌落趋势和频率掉档已经足够。论文里除了示波器,还用了芯片内部的电压传感器,测量点直接分布在GPU核心各个位置,能精确捕获IR drop造成的空间分布差异。普通用户拿不到这种片上数据,但可以通过对比不同kernel的DCGM电压曲线,推断出哪类负载对供电系统冲击最大。

读DCGM日志时,重点看三个字段:GPU核心电压、GPU核心频率、GPU功耗。一次完整的负载切换应该能看到“功耗先冲高,电压跟着下探,然后频率掉档”的现象。如果功耗变化明显但电压纹丝不动,先怀疑传感器采样率不够,再怀疑压测程序根本没制造出真正的瞬态冲击。实操时我建议三样工具同时用:示波器看瞬态毛刺,DCGM看秒级趋势,再加一台电子负载或烤机程序做对照。只有三组数据能互相印证,才是可信的电压噪声结论。

3.3 判断标准:电压噪声到什么程度算“出问题”

论文里给了一个判断框架,核心指标有三个:最大电压跌落幅度、跌落持续时间、以及跌落的重复频率。最大电压跌落幅度直接反映电压噪声的峰值强度;跌落持续时间决定了触发器是否有机会在下一次采样沿上采到错误值;重复频率则影响长期可靠性,比如电迁移效应。论文建议,当最大跌落幅度超过标称电压的5%时就要特别关注,超过10%基本可以断定存在供电设计问题。

看到这里可能有朋友会问,10%的跌落听起来不算大啊,芯片真这么脆弱?这里要提醒一句:GPU核心电压通常在1V以下,10%就是100mV,而触发器在接近临界路径延迟时的电源灵敏度往往是几十毫伏级别,所以100mV的跌落足够让原本有50mV时序裕量的电路瞬间失稳。这也是为什么论文反复强调,压测时不能只记录“死没死机”,而要记录“电压最低到过多少”“掉了多少次”。如果服务器在压测中驱动重启、CUDA报错、挂起,这些外部表现往往都对应着一次真实的电压踩线事件。

对于GPU服务器运维来说,可以建立一套简单的健康基线:在出厂默认频率下跑一轮标准压测,记录DCGM中的电压最小值、频率掉档次数、功耗曲线;之后每次驱动升级、BIOS更新、换电源或迁移机房后,再跑同一套压测,对比基线是否明显劣化。这比单次压测通过还是失败更有参考价值。需要注意的是,基线数据必须在相同的环境温度下采集,夏天机房30度和冬天机房18度测出来的电压轨迹差异会很大,对比时要做好温度补偿。

4. 压测现场实录:GPU电压噪声排查中的坑与经验

4.1 压测过程中掉驱动、ECC报错、整机重启,可能都不是“显卡的错”

先说一个最典型的案例。之前给一台深度学习服务器做24小时压力验证,跑了三个小时CUDA kernel,机器突然重启。第一反应是显卡问题,但换卡后问题依旧。后来发现是压测程序循环里频繁调用cudaMemcpy,导致PCIe总线上的瞬时功耗波动增大,而服务器电源模组功率余量不足,加上另一路CPU也在同时跑满负载,最终触发了电源保护。这个案例说明,GPU电压噪声的根因往往延展到系统供电层面,单看GPU板卡本身是看不出问题的。

类似的经验还有:掉驱动不一定是显存损坏,很可能是显卡瞬时功耗超过PCIe插槽供电上限,或者电源线接口氧化导致接触电阻变大。压测前把12V供电线的每一个端子都重新插拔一遍,万用表量一下线端电压,是成本最低的排查手段。在Linux服务器上遇到压测掉驱动时,先别急着看dmesg里的NVRM报错,先去查ipmitool里的电源健康信息和主板事件日志,经常能看到“Power Supply Predictive Failure”之类的记录,那才是根因。

4.2 图形压测与计算压测的差异:为什么FurMark跑10小时没事,训练模型却崩了

很多人以为GPU压测就是跑图形工具,但实际服务器场景里跑的往往是CUDA计算负载。FurMark这类工具主要把GPU的Shader单元和显存控制器压满,它产生的电流模式是相对稳定的;而深度学习训练、推理、科学计算中会出现频繁的kernel切换、动态库调用、CPU-GPU数据同步,这些操作产生的电流变化比纯图形负载猛烈得多。论文里也提到,不同指令类型的混合比例对电压噪声的影响非常大,图形负载和计算负载根本不在同一条噪声曲线上。

我自己遇到过一个很反直觉的案例:一台GPU服务器跑pytorch训练一切正常,结果部署到生产环境跑yolov8推理时,显卡偶尔会瞬间掉频,画面表现为推理延迟抖动。排查到最后发现是推理框架里频繁调用小尺寸卷积核,导致SM占用率在每个batch之间剧烈波动,电流反复冲击供电网络。后来在推理循环里插入了预热机制,让占用率变化平缓,问题就消失了。这说明在生产环境做压测时,不能只跑一个“全能型压力测试”,还要针对实际业务的负载特征做定制化压测。比如用pytorch跑大模型微调,就不能只在启动时跑一个满载kernel就算完,要把训练循环里前向、反向、参数更新、checkpoint保存这些完整流程都压一遍,因为每一步的电流特征都不一样。

4.3 压测前环境检查清单:照着做,能省一半排查时间

结合论文内容和我的实际经验,整理了一份GPU压测前的检查清单,每次压测前过一遍,能省很多事:

  • 确认供电余量:PSU额定功率至少是整机峰值功耗的1.5倍以上,单卡功耗墙在BIOS或nvidia-smi中设置为可运行区间。
  • 检查接线:GPU供电线、PCIe供电线全部重新插紧,条件允许时用示波器或万用表测一下12V电压纹波。
  • 确认散热与风道:压测会使GPU核心温度接近上限,温度升高会让漏电流变大,进而加剧IR drop。风扇策略建议手动拉高,避免温度、频率、功耗三者之间来回震荡。
  • 锁定驱动与固件版本:同一块GPU在不同驱动版本下,电压调度策略可能完全不同,强烈建议压测前用nvidia-smi -q记录驱动版本、VBOS版本和当前功耗上限。
  • 关闭无关服务:压测期间关闭桌面合成器、远程监控工具、自动更新等进程,它们会制造额外负载切换。
  • 观察基线:先跑5分钟轻负载,记录电压、频率、温度基线,再进入正式压测。
  • 设置自动恢复:压测脚本要写在异常挂起时自动重启、保存日志的逻辑,这样无人值守时才不会白跑一夜。
  • 检查Linux环境配置:如果用的是CentOS或Ubuntu系统,确认nouveau驱动已禁用、正确的NVIDIA驱动已加载,避免压测过程中驱动模块加载错误。

这些点看着琐碎,但每一条都对应着我踩过的真实坑。比如说驱动版本这一点,曾经一块GPU在旧驱动下压测稳定,升级驱动后出现周期性掉驱动,回滚到旧版本又恢复正常。电压调度策略在不同驱动里确实有差异,压测记录里必须带上驱动版本才能复现问题。还有温度基线,如果压测时机房空调恰好坏了,所有数据都会偏离正常值,容易被误判成硬件缺陷。

4.4 长期跟踪:建立你手头所有GPU的电压噪声档案

如果把这篇论文里的核心思想浓缩成一句话,我觉得是:压测的本质不是把硬件跑到冒烟,而是用最可控的方式激发出最恶劣的电气边界条件,然后观察系统在边界处的表现。GPU电压噪声的四个根因——di/dt瞬态冲击、IR drop、LC谐振、负载调度不均匀——在真实环境中往往是叠加出现的,单独分析哪一个都不够,必须用系统级视角去处理。

我自己在看完论文后做了一件事:给手头所有GPU服务器建立了一份“电压噪声档案”,每台机器在固定压测程序下记录电压最小值、掉频次数、重启次数,并随着固件和驱动更新持续更新。这样一旦线上出现异常,我就能快速判断是环境变动导致的劣化,还是芯片本来就有的问题。这个方法也推荐给做GPU服务器运维的朋友,数据积累多了之后,很多玄学问题都会变得有迹可循。

如果你手头正好有GPU服务器,又不确定自己的压测流程是否覆盖了电压噪声,我建议从今天开始做一次“扫频式压测”:把论文里那条循环长度参数从几百扫到几万,配合DCGM日志记录电压和频率变化。运气好的话,一晚上就能看到一条完整的电压和频率波动曲线;运气不好,说明你的供电设计相当扎实,这本身也是一个好消息。

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

扫地机器人选购技术拆解:导航避障拖地基站四大维度怎么判断

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

作者头像 李华
网站建设 2026/9/7 15:50:07

用Makefile一键构建DIFY本地Web镜像,告别docker build卡顿

在本地跑过 DIFY 的人应该都经历过这种抓狂时刻&#xff1a;官方文档说得明明白白&#xff0c;docker compose up -d一把梭&#xff0c;结果镜像拉取慢得像蜗牛&#xff0c;前端 Web 那个镜像更是动不动就构建到一半卡死&#xff0c;甚至直接报错退出。尤其当你改了 DIFY Web 端…

作者头像 李华
网站建设 2026/9/7 15:47:14

ADS7950实战:12位8通道SAR ADC的SPI驱动与硬件设计全解析

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

作者头像 李华
网站建设 2026/9/7 15:45:12

深入解析MCP Transport层:从Stdio到HTTP的选型与排坑指南

1. MCP的Transport到底在解决什么问题先说结论&#xff1a;MCP的Transport层是整个协议的地基&#xff0c;它决定了你的MCP server怎么被找到、怎么被连接、怎么传数据、怎么处理断连。前面几篇笔记我分别梳理了MCP的协议模型、工具调用链路和资源体系&#xff0c;这篇专门把Tr…

作者头像 李华
网站建设 2026/9/7 15:44:50

VirtualLab+Unity:折衍混合红外物镜三维交互仿真展示

1. 项目概述&#xff1a;当光学仿真遇上交互引擎做光学设计仿真的人&#xff0c;日常工作基本都绕不开 VirtualLab、Zemax 这类专业软件。而 Unity 这名字一出来&#xff0c;大家第一反应基本是游戏开发。老实说&#xff0c;把 VirtualLab 和 Unity 放在同一个项目里&#xff0…

作者头像 李华
网站建设 2026/9/7 15:44:24

2026年AI毕业论文生成工具怎么选?五款实测对比

论文季一到&#xff0c;宿舍楼里全是熬夜改稿的人。开题报告被导师打回三次、查重率卡在红线边缘、文献综述写了删删了写——这些场景每个毕业生都不陌生。市面上号称能辅助论文写作的AI工具不少&#xff0c;但真正上手好用的没几个。这次挑了五款实测了一圈&#xff0c;从生成…

作者头像 李华