当前位置: 首页 > news >正文

HPCC:高精度拥塞控制

HPCC:高精度拥塞控制

文章目录

    • HPCC:高精度拥塞控制
      • 摘要
      • 1 引言
        • 1.1 背景
        • 1.2 现有CC的局限性
        • 1.3 HPCC的提出
      • 2 研究动机
        • 2.1 大型RDMA部署
        • 2.2 RDMA目标
        • 2.3 当前RDMA CC中的权衡
          • DCQCN
          • TIMELY
        • 2.4 下一代高速CC
      • 3 技术方案
        • 3.1 INT
        • 3.2 HPCC设计
        • 3.3 HPPC的参数
      • 4 仿真结果
      • 5 结论

摘要

TCP是最基础的网络传输层通信协议,其拥塞控制算法是为Internet这种相对低速、高延迟的网络环境设计的。在新一代的高速云网络中,TCP的拥塞控制算法无法充分发挥底层网络能力,而现有高速网络拥塞控制算法(如:RDMA协议中的拥塞控制算法DCQCN、TIMELY)都存在有一定的局限性。HPCC(高精度拥塞控制)是一种新的高速CC机制,它利用网络遥测(INT)获得精确的链路负载信息并精确控制流量。通过解决诸如在拥塞期间延迟INT信息和对INT信息的过度反应等难题,HPCC可以快速收敛以利用空闲带宽,同时避免拥塞,并且可以在网络队列中保持接近零的数据堆积以实现超低的延迟,HPCC也更加公平且易于在硬件中部署。

1 引言

1.1 背景

在过去的十年中,数据中心网络的链路速度从1Gbps增长到100Gbps,而且这种增长还在继续。超低延迟和高带宽是当今和未来高速网络的两个关键要求,越来越多的应用要求超低延迟和高带宽。近年来,数据中心部署了大规模网络,通过聚合以太网版本2(RoCEv2,Converged Ethernet Version 2)实现RDMA(远程直接内存访问)作为当前的硬件卸载解决方案。但是,在运行大规模RoCEv2网络多年后,我们发现RDMA网络在协调低延迟、高带宽利用率和高稳定性方面面临着根本性的挑战。这是因为高速意味着流量以线路速率开始,并积极攫取可用网络容量,这很容易在大规模网络中造成严重拥塞。此外,高吞吐量通常会导致深度数据包排队,这会破坏延迟敏感流的性能以及网络处理意外拥塞的能力。

1.2 现有CC的局限性

为了解决协调延迟、带宽/利用率和稳定性的困难,良好的CC设计是关键。这是因为CC是在高流量负载下避免数据包缓冲或丢失的主要机制。如果CC频繁失败,像PFC或数据包重传这样的备份方法要么会带来稳定性问题,要么会遭受巨大的性能损失。现有的CC如DCQCN和TIMELY,有一些基本的局限性:

收敛慢。对于粗粒度反馈信号,如ECN或RTT,当前的CC方案不知道增加或减少多少发送速率,需要使用启发式来猜测速率更新,并尝试迭代收敛到稳定的速率分布。这种迭代方法处理大规模拥塞事件的速度很慢。

不可避免的数据包排队。DCQCN发送方利用一位ECN标记来判断拥塞风险,TIMELY发送方使用RTT的增加来检测拥塞,发送方只有在队列建立后才开始降低流量,这些构建的队列会显著增加网络延迟。

复杂的参数调整。当前CC算法用于调整发送速率的启发式算法有许多参数需要针对特定网络环境进行调整。例如,DCQCN需要设置15个参数。

1.3 HPCC的提出

前面三个限制的根本原因是传统网络中缺少细粒度的网络负载信息。ECN是终端主机可以从交换机获得的唯一反馈,RTT是一种纯端到端的测量,没有交换机的参与。然而,随着新的交换ASIC中提供的网络遥测(INT,In-network telemetry)功能,在生产网络中获得细粒度网络负载信息并使用它改进CC已成为可能。

HPCC(高精度拥塞控制)是一种新的CC机制,用于大规模高速网络。HPCC背后的关键思想是利用来自INT的精确链路负载信息来计算准确的流量更新。与通常需要大量迭代才能找到合适流速的现有方法不同,HPCC在大多数情况下只需要一个流速更新步骤。使用INT提供的精确信息使HPCC能够解决当前CC方案中的三个限制。

2 研究动机

2.1 大型RDMA部署

数据中心中采用RDMA,以满足分布式存储、数据库和深度学习训练框架等多个关键应用程序的超低延迟和大带宽需求。一般而言,数据中心网络是一个Clos拓扑结构,有三层:ToR、Agg和核心交换机。PoD(交付点,point-of-delivery)是一个基本部署单元,由数十个ToR交换机组成,这些交换机由多个Agg交换机互连。不同的PoD通过核心交换机互连。每台服务器都有两条上行链路,与两个ToR交换机相连,以根据客户的要求实现服务器的高可用性。在当前的RDMA部署中,每个PoD都是一个独立的RDMA域,这意味着只有同一PoD中的服务器才能使用RDMA通信。

大规模RDMA部署可能涉及成千上万的节点,每个节点都在进行高速、低延迟的通信。在这种环境下,拥塞控制的研究需要考虑如何适应大规模并行通信,确保网络稳定性和性能。而现有的CC算法都有一定的局限性,因此需要设计出更高效、更高精度的CC算法。

2.2 RDMA目标

除了超低延迟和高带宽之外,网络稳定性和操作复杂性在RDMA网络中也至关重要,因为RDMA网络比TCP/IP网络面临更多的风险和更严格的性能要求。

RDMA网络有四个基本目标:(1)延迟应尽可能低;(2)带宽利用率应尽可能高;(3)拥堵和PFC暂停应尽可能少;(4)操作复杂性应尽可能低。实现这四个目标将为我们的客户和我们自己提供巨大的价值,我们相信实现这四个目标的关键是一个适当的CC机制。

2.3 当前RDMA CC中的权衡
DCQCN

对于DCQCN,权衡方面:

1、分布式控制:DCQCN引入了分布式控制的思想,允许数据中心网络中的交换机独立地进行拥塞检测和控制。这种分布式方法可以更好地适应大规模网络的动态性和异构性。

2、基于标记的拥塞信号:DCQCN使用基于标记的拥塞信号(PFC标记)来传达网络拥塞状态,这使得交换机能够更精确地指导终端节点的传输速率。

3、快速收敛:DCQCN致力于实现快速的拥塞状态收敛,以减小对网络性能的影响。

局限性:

1、PF开销:基于标记的拥塞信号需要使用PFC(Priority Flow Control)来暂停交换机上的输出队列。PFC的开销可能导致网络的低效利用,尤其在面对短流时。

2、对带宽敏感:DCQCN对带宽非常敏感,可能导致在某些情况下过度保护,并在网络中形成不均衡的流量分布。

TIMELY

对于TIMELY,权衡方面:

1、时延感知:TIMELY引入了对网络时延的感知,以便更精确地调整拥塞控制策略。通过考虑时延,TIMELY可以更好地适应不同的网络环境和负载。

2、弹性多资源:TIMELY考虑了多个资源的弹性调整,包括带宽和排队时延。这种综合考虑可以使算法更全面地适应不同的网络条件。

3、抗噪声能力:TIMELY设计了一种抗噪声的拥塞信号采样方法,有助于更准确地捕捉网络拥塞状态。

局限性:

1、复杂性:TIMELY的设计相对较为复杂,需要综合考虑多个资源的调整,这可能使得实现和管理相对繁琐。

2、对时钟同步的依赖:TIMELY对时钟同步要求较高,需要确保网络中的时钟同步性能良好,否则可能影响算法的准确性。

2.4 下一代高速CC

下一代应用于RDMA的CC或其他类型的高速网络应同时具备以下特性,以显著提高应用性能和网络稳定性:

(1)快速收敛。网络可以快速收敛到高利用率或避免拥塞。流量调整的时间应该适合特定的网络环境,而不是手动配置。

(2)接近空队列。网络内缓冲区的队列大小保持稳定的低,接近于零。

(3)参数很少。新的CC不应该依赖于需要操作员调整的大量参数。相反,它应该适应环境和流量模式本身,以便降低操作复杂性。

(4)公平。新的CC确保了流之间的公平性。

(5)易于在硬件上部署。新的CC算法非常简单,可以在商品NIC硬件和商品交换机硬件上实现。

目前有两个关键趋势,它们有可能实现满足上述所有要求的CC。第一个趋势是交换机在数据平面上更加开放和灵活;特别是网络遥测技术(INT)正在迅速普及。使用INT,发送方可以从ACK数据包准确地知道流路径上的链路负载,这有助于发送方进行准确的流量调整。第二个趋势是NIC硬件的功能和可编程性越来越强,它们有更快的速度和更多的资源来公开数据包级别的事件和处理。利用这些新的硬件特性,设计并实现了HPCC,同时实现了所需的CC特性。

3 技术方案

设计HPCC有两个主要挑战。首先,链路拥塞会延迟数据包上承载的INT信息,从而延迟流量降低以解决拥塞。HPCC旨在限制和控制繁忙链路的传输中总字节数(total inflight bytes),防止发送方发送额外流量,及时反馈延迟。第二,尽管所有ACK数据包中都包含INT信息,但如果发送方盲目地对所有信息做出快速反应,则可能会出现破坏性的过度反应。因此,CC算法需要通过结合每次确认和每次RTT反应,选择性地使用INT信息,实现快速反应而无过度反应。

3.1 INT

In-band Network Telemetry(INT)是一种利用数据转发平面来收集、携带、整理和上报网络状态信息的技术。它不需要使用单独的控制面管理流量来进行上述信息收集,而是通过在数据流中嵌入INT指令,让中间转发设备收集并上报所需的数据。

INT技术利用了数据平面和转发设备的处理能力,通过在数据流中嵌入INT指令,让转发设备在处理数据流的同时收集网络状态信息。这些信息可以包括网络延迟、带宽利用率、丢包率等,以便于网络管理员及时了解网络状况并进行相应的优化调整。
INT技术还具有以下优点:

减少控制平面负载:INT技术不需要使用单独的控制面管理流量进行信息收集,从而减少了控制平面的负载,提高了网络的性能和稳定性。

实时性:INT技术可以实时收集网络状态信息,并快速上报给网络管理员,以便于及时发现和解决问题。

灵活性:INT技术可以根据不同的需求和场景,灵活地嵌入不同的INT指令,以满足不同的网络监控和管理需求。

3.2 HPCC设计

HPCC是一个发送方驱动的CC框架。 如图3所示,采用逐包确认,即sender发送的每个数据包都会得到receiver的确认。 数据包从sender传播到receiver的过程中,路径上的每个交换机都会利用其交换 ASIC 的 INT 功能插入一些元数据,报告数据包出端口的当前负载,包括时间戳(ts)、队列长度(qLen)、传输字节(txBytes)和链路带宽容量(B)。当receiver收到数据包时,会将交换机记录的所有元数据通过ACK发送给sender。然后sender根据带有网络负载信息的 ACK 决定如何调整其流量。

在这里插入图片描述

HPCC是一种基于窗口的CC方案,使用窗口控制infligh字节数。inflight字节数表示已发送但尚未确认的数据量。这里需要解释下,为啥采用控制inflight字节数,而不是控制发送速率。在没有拥塞的情况下,inflight字节数和速率的关系等价于等式inflight=速率×T,其中T是base RTT。与纯粹基于速率的CC方案(在反馈到来之前不断发送数据包)相比,对inflight字节数的控制可以确保inflight字节数在限制范围内,使得sender在达到限制时立即停止发送,无论反馈(ack)延迟了多长时间。 这样一来,整个网络就大大稳定了。

在这里插入图片描述

3.3 HPPC的参数

HPCC具有三个易于设置的参数:η、maxStage和。η控制带宽利用率和队列长度之间的简单权衡(由于数据包随机到达造成的临时冲突。),因此默认将其设置为95%,仅损失5%的带宽,但实现了几乎零排队。maxStage控制状态稳定性和回收可用带宽的速度之间的简单权衡。控制链路上可维持buffer接近零排队的最大并发流数与公平收敛速度之间的权衡,通常设置一个非常小的 来支持链路上的大量并发流。

4 仿真结果

1、使用ns3仿真,下图是HPCC、DCQCN的队列长度的CDF曲线,从图中可以看出HPCC的队列长度维持在比较低的水平。

在这里插入图片描述

2、下图是FCT延迟和流的大小对应的图像关系,从图中可以看出,HPCC的FCT延迟相对于其他现有的算法而言,在绝大多数的流的大小对应的情况之下都要低,只有在流的大小非常大的时候才会比其他算法差一些。

在这里插入图片描述

5 结论

在本文中,我们介绍了一种新型的高精度拥塞控制机制,即HPCC(High Precision Congestion Control),它旨在解决现有高速网络中TCP拥塞控制算法的局限性。在新一代高速云网络中,传统的TCP拥塞控制算法无法充分发挥底层网络能力,而现有的高速网络拥塞控制算法也存在一定的局限性。

HPCC利用网络遥测(INT)技术获取精确的链路负载信息,并通过解决在拥塞期间延迟INT信息和对INT信息的过度反应等难题,实现了快速的拥塞状态收敛,充分利用空闲带宽,同时避免拥塞的发生。与现有的拥塞控制算法相比,HPCC在网络队列中保持接近零的数据堆积,从而实现了超低的延迟,同时更加公平且易于在硬件中部署。
研究动机主要源于大规模RDMA部署和对RDMA网络的目标,包括超低延迟、高带宽、网络稳定性和操作复杂性。分析了现有拥塞控制算法(如DCQCN和TIMELY)的局限性,提出了HPCC的设计思想,通过利用INT信息和设计新的控制机制,实现了快速收敛、接近空队列、参数很少、公平、易于在硬件上部署等特性。

在仿真结果中,HPCC在各项性能指标上展现出明显的优势,特别是在大规模RDMA部署中,其快速收敛和低延迟的特性使其成为下一代高速网络拥塞控制的有力候选。因此,HPCC为满足未来高速网络的需求提供了一种创新的解决方案。

相关文章:

HPCC:高精度拥塞控制

HPCC:高精度拥塞控制 文章目录 HPCC:高精度拥塞控制摘要1 引言1.1 背景1.2 现有CC的局限性1.3 HPCC的提出 2 研究动机2.1 大型RDMA部署2.2 RDMA目标2.3 当前RDMA CC中的权衡DCQCNTIMELY 2.4 下一代高速CC 3 技术方案3.1 INT3.2 HPCC设计3.3 HPPC的参数 4…...

centos 配置 git 连接 github

centos 配置 git 连接 github 首先安装 git 创建 ssh key ssh-keygen -t rsa复制公钥 cat ~/.ssh/id_rsa.pub # 打印出公钥内容然后复制配置 github 登录网页 github 账号;进入 setting;点击 SSH and GPG keys,点击 New SSH keytitile 随便填…...

SpringBoot发布项目到docker

Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…...

sheng的学习笔记-卷积神经网络

源自吴恩达的深度学习课程&#xff0c;仅用于笔记&#xff0c;便于自行复习 导论 1&#xff09;什么是卷积神经网络 卷积神经网络&#xff0c;也就是convolutional neural networks &#xff08;简称CNN&#xff09;&#xff0c;使用卷积算法的神经网络&#xff0c;常用于计…...

数据库:园林题库软件(《中国古代园林史》答题卷一 )

《中国古代园林史》答题卷一 填空题 1、中国古代园林曾被誉为“世界园林之母”。国际风景园林师联合会(IFLA)的创始人、著名风景园林师和教育家杰里柯爵士( Sir Geoffrey Alan Jellicoe)把中国古代园林和西亚园林以及古希腊园林列为世界三大园林体系之首。 2、中国古代园林是…...

upset 绘制

好久没有更新,今天来一个upset图的绘制 1.1 安装包 #绘制upset的包现在看来有三个 ## UpSet ### 最基本的upsetR包,使用方便,但是扩展不方便 devtools::install_github("hms-dbmi/UpSetR") ## complex-upset ### UpSet的升级款 支持ggplot2 devtools::install_git…...

声明 | 为打击假冒账号、恶意抄袭账号等诈骗活动,提升本账号权威,本博主特此郑重声明

声明 | 为打击假冒账号、恶意抄袭账号诈骗活动&#xff0c;提升本账号权威&#xff0c;本博主特此郑重声明 一、本账号为《机器学习之心》博主CSDN唯一官方账号&#xff0c;唯一联系方式见文章底部。 二、《机器学习之心》博主未授权任何第三方账号进行模型合作、程序设计、源…...

云计算:OpenStack 配置二层物理网卡为三层桥的接口

目录 一、理论 1.OpenStack 二、实验 1. Linux系统修改网卡 2.OpenStack 配置二层物理网卡为三层桥的接口 一、理论 1.OpenStack &#xff08;1&#xff09;概念 OpenStack是一个开源的云计算管理平台项目&#xff0c;是一系列软件开源项目的组合。由NASA(美国国家航空…...

Python sanic框架钉钉和第三方打卡机实现

同样还是需要开通钉钉应用这里就不错多说了 第一步:梳理逻辑流程 前提&#xff1a;打卡的机器是使用postgres数据库&#xff0c;由于因为某些原因&#xff0c;钉钉userId 我已经提前获取到了存放到数据库里。 1.用户打卡成功后&#xff0c;我们应该监听数据库进行查询&#xf…...

微信小程序性能优化

1. 代码包不包含插件大小超过 1.5 M 建议&#xff1a;小程序代码包单个包大小限制为2M。因此我们建议开发者在开发时&#xff0c;如果遇到单包体积大于1.5M的情况&#xff0c;可以采取分包的方式&#xff0c;把部分代码拆分到分包去&#xff0c;降低单个包的体积&#xff0c;提…...

java并发编程六 ReentrantLock,锁的活跃性

多把锁 一间大屋子有两个功能&#xff1a;睡觉、学习&#xff0c;互不相干。 现在小南要学习&#xff0c;小女要睡觉&#xff0c;但如果只用一间屋子&#xff08;一个对象锁&#xff09;的话&#xff0c;那么并发度很低 解决方法是准备多个房间&#xff08;多个对象锁&#xf…...

深度学习 | DRNN、BRNN、LSTM、GRU

1、深度循环神经网络 1.1、基本思想 能捕捉数据中更复杂模式并更好地处理长期依赖关系。 深度分层模型比浅层模型更有效率。 Deep RNN比传统RNN表征能力更强。 那么该如何引入深层结构呢&#xff1f; 传统的RNN在每个时间步的迭代都可以分为三个部分&#xff1a; 1.2、三种深层…...

代理模式:中间者的故事

代理模式&#xff1a;中间者的故事 介绍需求分析代理模式代码实现代理模式整理和用途第一种用途第二种用途第三种用途第四种用途 总结 介绍 本文引用《大话设计模式》第七章节的内容进行学习分析&#xff0c;仅供学习使用 需求&#xff1a;小明拜托自己好朋友小王给他朋友小美…...

中间件系列 - Redis入门到实战(高级篇-多级缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 JVM进程缓存Lua语法入…...

是德科技E9304A功率传感器

是德科技E9304A二极管功率传感器测量频率范围为9 kHz至6 GHz的平均功率&#xff0c;功率范围为-60至20 dBm。该传感器非常适合甚低频(VLF)功率测量。E系列E9304A功率传感器有两个独立的测量路径&#xff0c;设计用于EPM系列功率计。功率计自动选择合适的功率电平路径。为了避免…...

视频格式网络地址转换视频到本地,获取封面、时长,其他格式转换成mp4

使用ffmpeg软件转换网络视频&#xff0c;先从官网下载对应操作系统环境的包 注意:网络地址需要是视频格式结尾&#xff0c;例如.mp4,.flv 等 官网地址&#xff1a;Download FFmpeg window包&#xff1a; linux包&#xff1a; 如果下载缓慢&#xff0c;下载迅雷安装使用…...

企业私有云容器化架构运维实战

什么是虚拟化: 虚拟化&#xff08;Virtualization&#xff09;技术最早出现在 20 世纪 60 年代的 IBM 大型机系统&#xff0c;在70年代的 System 370 系列中逐渐流行起来&#xff0c;这些机器通过一种叫虚拟机监控器&#xff08;Virtual Machine Monitor&#xff0c;VMM&#x…...

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数&#xff08;C&#xff09; Baumer工业相机Baumer工业相机NEOAPISDK中UserSet的技术背景代码案例分享第一步&#xff1a;保存相机当前参数设置UserSet_Save第二步&#xff1a;载入已经保存…...

STM32的以太网外设+PHY(LAN8720)使用详解(3):PHY寄存器详解

0 工具准备 1.野火 stm32f407霸天虎开发板 2.LAN8720数据手册 3.STM32F4xx中文参考手册1 PHY寄存器 前面介绍到&#xff0c;站管理接口&#xff08;SMI&#xff09;允许应用程序通过2线时钟和数据线访问任意PHY寄存器&#xff0c;同时该接口支持访问最多32个PHY&#xff0c;也…...

缓存和缓冲的区别

近期被这两个词汇困扰了&#xff0c;感觉有本质的区别&#xff0c;搜了一些资料&#xff0c;整理如下 计算机内部的几个部分图如下 缓存&#xff08;cache&#xff09; https://baike.baidu.com/item/%E7%BC%93%E5%AD%98 提到缓存&#xff08;cache&#xff09;&#xff0c;就…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...