DPDK QOS 3 -- rte meter令牌桶的实现

DPDK的meter库(双速率三色算法) 前面一篇讲了dpdk的单速率三色桶算法,这篇解析一下双速率三色桶。 流程和单速率完全相同,区别在于数据结构以及颜色判断的逻辑上。仍然看色盲模式 相比于单速率模式,我感觉双速率模式更好理解,有两个桶C和P以及两个令牌产生速率。两个桶同时跟随时间增加令牌数,超过容量则丢弃。报文速率如果介于cir和pir,超过cir部分的报文返回黄色,低于cir的返回绿色。 报文速率超过pir,所有超过pir部分的报文都返回红色,介于cir和pir部门的返回黄色,低于cir的返回绿色 报文速率低于cir,所有的报文绿色~ 阅读详情

为了解决各种限速的问题,我们先来解决TB的实现。

令牌桶(Token-Bucket)是目前最常采用的一种流量测量方法,用来评估流量速率是否超过了规定值。

关于令牌桶处理报文的方式,RFC 中定义了两种令牌桶算法:

  1. 单速率三色标记(single rate three color marker,srTCM,RFC2697定义,或称为单速双桶算法)算法,主要关注报文尺寸的突发。
  2. 双速率三色标记(two rate three color marker,trTCM,RFC2698定义,或称为双速双桶算法)算法,主要关注速率的突发。

实际中比较常见的有两种实现方式:

  1. 周期性的添加,添加的时间间隔就是令牌桶的容量与添加速率的比值:△t=CBS/CIR,每次添加的令牌数为 CBS 个。
  2. 一次性添加,添加令牌的数量是△t×CIR(△t 是当前时间与上次添加令牌的时间之差),且是一次添加完毕,并不是按照一定速率添加。

当前业界都采用的第二种方式,第一种方式涉及定时器精度不太好控制。

 

由于报文过令牌桶的时候我们很容易能获取到的是报文长度和时间,这两个度量我们分别取单位为:

1个字节和1个cycle,然后我们使用这两个单位来展开令牌桶的换算:

1秒时间单位内有CIR(CIR已经换算成字节了)个字节,而1秒的时间单位有HZ * 1个cycle,利用这层关系我们假设:

CIR * 1个字节 = HZ * 1个cycle,换算后我们可以得到两个公式:

  1. 1个字节  = HZ/CIR * 1个cycle
  2. 1个cycle = CIR/HZ * 1个字节

两种实现方式的基本思想是一直的,只是细节上有一些差别,我们下面具体来看

3.1 第一种实现方式

根据公式:1个字节  = HZ/CIR * 1个cycle 我们来实现第一种方式的令牌桶,也是DPDK当前的实现方式,代码分散在dequeue的各个出队状态机里面。

3.1.1 基本实现

当CIR太大的时候,1个字节计算出来的cycle数会为小数,为了解决这个问题,我们引入扩大因子,扩大因子越大,分辨率越高,同时需要考虑HZ和最大支持的CIR的关系和溢出的风险,扩大因子又不能太大,那么公式就变成如下:

1个字节  = (HZ/CIR * 1个cycle) << 5 (扩大因子) ①

以此为依据我们看下过srTCM的整个过程:

获取当前的cycle,记为new_cycle

获取这段期间的cycle数,记为diff_cycle = new_cycle – old_cycle

获取diff_cycle的字节数 diff_bytes = diff_cycle/① * 扩大因子

然后使用diff_bytes过桶:

1、计算TC 和TE:

IF tc + diff_bytes >= CBS,

    tc = CBS;

    diff_bytes -= (CBS – tc);

   IF te + diff_bytes >= EBS

       te = EBS;

    ELSE

       te += diff_bytes;

ELSE

tc += diff_bytes;

2、计算颜色

IF tc >= Pkt_len

   Color = GREE;

   Tc -= Pkt_len;

ELSE IF te >= Pkt_len

   Color = YELLOW;

   Te -= Pkt_len;

ELSE

   Color = RED;

3.1.2 优化方法

上面的实现由两个地方可以优化:

1、diff_bytes 使用了除法,这个代码是很昂贵的,DPDK 实现了一个使用移位代替除法的算法,来提高性能,但没怎么看明白。

我们可以使用空间换时间的想法,使用以下的方法,提高整个过桶的过程:

  • 根据公式:1个字节  = HZ/CIR * 1个cycle * << 5(扩大因子),我们已经知道了一个字节代表的cycle数,那么可以可以把所有的都转化为cycle的时间单位来计算。

创建令牌桶的时候,CBS、EBS 根据公式换算成 cycles数保存,同时计算数组(下标是字节数)L2T[1 … 512] = [x cycle …… ycycle],为过桶做好准备。

 

过桶的时候,获取报文长度pkt_len,然后计算cycle,公式如下:

tmp_len = pkt_len / 扩大因子,然后计算tc_cycle,这里考虑tmp_len的计算,扩大因子不能太大,32是一个比较好的值。

IF tmp_len > 512

    tc_cycle = (tmp_len / 512) * L2T[512] + L2T[tmp_len & 511];

ELSE

tc_cycle = L2T[tmp_len];

然后在根据tc_cycle去过桶。

解决了除法的问题,同时使用数组和移位加快计算,不在乎内存的话,L2T的数组可以定义为MTU的大小,任何报文长度都可以根据数组一次得到tc_cycle。

2、过桶的时候,使用的是比较tc >= pkt_len,没有实现借贷,可能会导致报文不平滑,举个例子:

  • 假设设备端口的CIR设置为1Mbps,CBS为2000bytes, EBS为2000bytes,初始状态时C桶和E桶满。
  • 假设第1个到达的报文是1500 bytes 时,检查C桶发现令牌数大于数据包的长度,所以数据包被标为绿色,C桶减少1500 bytes,还剩500 bytes,E桶保持不变。
  • 假设1ms之后到达第2个报文1500 bytes,新增令牌 CIR*1ms=1000bit=125bytes,此时C桶共有625 bytes,令牌不够。检查E桶有足够令牌,因此报文标记为黄色,E桶减少1500bytes,剩 500bytes,C桶不变。
  • 假设又过1ms后到达第3个报文1000 bytes,新增令牌 CIR*1ms=1000bit=125bytes,此时C桶共有750bytes,令牌不够,检查E桶也不够,因此报文被标记为红色, C桶、 E桶令牌数不变。
  • 假设又过20ms后到达第4个报文1500bytes,新增令牌CIR*20ms=20000bit=2500bytes,C桶此时令牌数3250 bytes,CBS=2000bytes,因此溢出1250bytes 添加到E桶,此时E桶有1750bytes。由于此时C桶大于报文长度,报文标记为绿色,C桶减少1500bytes剩500bytes,E桶不变。

……………………

整个过程如下表所示:

序号

时间(ms)

报文长度

时间间隔

本轮新增令牌

新的后TC

新的后TE

剩余TC

剩余TE

颜色

-

-

-

-

-

2000

2000

2000

2000

-

1

0

1500

0

0

2000

2000

500

2000

GREE

2

1

1500

1

125

625

2000

625

500

YELLOW

3

2

1500

1

125

750

500

750

500

RED

4

22

1500

20

2500

2000

1750

500

1750

GREE

 

如果使用了借贷后,计算颜色的过程变成:

IF tc > 0

   Color = GREE;

   Tc -= Pkt_len;

ELSE IF te > 0

   Color = YELLOW;

   Te -= Pkt_len;

ELSE

   Color = RED;

 

上面的过程变成:

序号

时间(ms)

报文长度

时间间隔

本轮新增令牌

新的后TC

新增后TE

剩余TC

剩余TE

颜色

-

-

-

-

-

2000

2000

2000

2000

-

1

0

1500

0

0

2000

2000

500

2000

GREE

2

1

1500

1

125

625

2000

-875

2000

GREE

3

2

1500

1

125

-750

2000

-750

500

YELLOW

4

22

1500

20

2500

1750

500

250

500

GREE

 

20ms这个上对于上面的过程tc没有溢出1250bytes的令牌,整个报文输出表现的更为平滑。

3.2 第二种实现方式

根据公式:1个cycle = CIR/HZ * 1个字节,我们来实现第二种方式的令牌桶,也是VPP CAR当前的实现方式。

当CIR 太小的时候,这个计算出来的值会为小数,同第一种方式,我们引入扩大因子:

1个cycle * << 17 = CIR/HZ * 1个字节 * << 17, 扩大因子VPP使用的是 1 << 17

我们现在把1个cycle * 217 称为新的时间单位,后续计算都以这个新的时间单位为基准。

以此为依据我们看下过srTCM的整个过程:

获取当前的cycle,记为new_cycle,单位为新的时间单位,计算为cycle >> 17。

获取这段期间的cycle数,记为diff_cycle = new_cycle – old_cycle(单位也是新的时间单位)

获取diff_cycle的字节数 diff_bytes = diff_cycle * CIR/HZ * 1个字节 * << 17

 

然后在根据diff_bytes去过桶,实现和上面的流程一致。

为了考虑乘法溢出的可能,可以使用64位存储。

VPP 还把TC/TE/CIRHZ * 1个字节 * 217,同时扩大了 2N,N根据前面3个最大值的log2N计算来的,然后过桶的时候把报文长度也扩大2N次,然后在过桶,代码注释是:

  // Scale if possible. Scaling helps rate accuracy, but is constrained

  // by the scaled rates and limits fitting in 32-bits.

  // In addition, we need to insure the scaled rate is no larger than

  // 2^22 tokens per period. This allows the dataplane to ignore overflow

  // in the tokens-per-period multiplication since it could only

  // happen if the policer were idle for more than a year.

  // This is not really a constraint because 100Gbps at 1Ghz is only

  // 1.6M tokens per period.

// Scale packet length to support a wide range of speeds

其实也是扩大因子,为了支持更小的CIR,比如800 bps。而第一种方式就没有这种忧虑。

DPDK与QoS(服务质量) 在DPDK提供的QoS框架中,一个复杂的处理流程被分成了几个不同的处理阶段,如下图所示:对于这些流程中模块,其具体解释是这样的:从这个图中可以看出,整个包的处理过程被分成了4个阶段完成。1.第一阶段是在线程0中的,主要的工作就是接收包然后进行检查校验。2.第二阶段是一个重点,主要工作是进行流分类,测速和负载均衡。把不同的流量导到不同的工作负载核上。3.第三阶段是在不同的负载核上处理业务报文。4.第四阶段也是一个非常重要的阶段,主要工作是根据算法调度,丢弃,最后发送出去。...... 阅读详情

相关推荐

HQoS层级限速与Meter Offload实践:三层限速的硬件卸载之路

带宽限速是网络设备的基础能力,但面对多用户、多业务的复杂场景,单级限速难以兼顾公平与优先级。层级限速(HQoS)通过多级令牌桶构建树形调度结构,能精细控制每个用户、队列的带宽。然而纯软件Meter在10G线速下会消耗大量CPU资源,成为性能瓶颈。将计量动作卸载到网卡硬件(Meter Offload),由硬件执行高频令牌桶计算,软件只负责策略配置与统计,是解决性能问题的关键方向。本文从HQoS模型构建、令牌桶级联原理出发,结合DPDK环境下的工程实践,详细分析Meter Profile管理、Flow规则下发、

weixin_34199764的博客 212

DPDK的meter库(单速率三色算法)

DPDK提供了丰富的基础库,其中就有利用令牌桶来实现meter功能,可以参考例子中的qos_meter。这篇博客主要就是解读这个例子。令牌桶算法分为单速率三色算法和双速率单色算法,单速率只有一个速率桶C桶以及一个EBS。关注点在于报文的突发尺寸,双速率有两个速率桶C和P,更关注突发的报文速率。 首先来看单速率三色,令牌产生的速率是cir,C桶容量为cbs,当C桶满时,再去添加E桶,E桶也满时,令牌丢弃。 在取令牌时,先取C桶,C桶满足,不管E桶,E桶保持不变,C桶减少相应数量令牌返回绿色。 C桶不满,

the_dog_tail_grass的博客 2113

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 267

DPDK-服务质量(QOS)框架

0x01 缘由      继续学习dpdk相关文档。QoS听了、看了好多次,但是从来没接触,趁现在学习下。      QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力, 是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。 0x02 介绍       DPDK Quality of Service

3-Number 3815

DPDK — 性能优化手段

如果编译器的版本不支持该款 CPU 的特性,比如 Intel AVX 指令,那么它在编译时只会选用自己支持的指令集,这可能导致编译后生成的 DPDK 应用的性能下降。下图展示了一个通用双路处理器(2 个 CPU Socket)服务器的内部架构,它包含了 2 个 CPU,配有 2 个分离的内存控制单元来连接各自的 Main Memory,芯片组会扩展出大量高速的 PCIe 2.0/3.0 接口,用于连接外设,如 10Gbps 或者 25Gbps 网卡外设。

烟云的计算 1857

OVDK-QoS:在 DPDK OVS 上提供流量控制

OVDK-QoS 在 DPDK OVS 上提供流量控制 Intel(R) DPDK Accelerated Open vSwitch (Intel(R) DPDK vSwitch/OVDK) 是开源 Open vSwitch 多层虚拟交换机的一个分支,可在找到。 有关该项目的更多信息,请查看英特尔(R) DPDK vSwitch/OVDK 主页 01.org。 OVDK-QoS是具有QoS能力的OVDK,提供类似于linux TC模块的流量控制功能。 OVDK-QoS 提供了一个用户配置工具,即 ovdk-tc,可以配置 TC 结构对象:Qdisc 和 Class。 OVDK-QoS 提供了一个用户配置工具,即 ovs-ofctl,它可以配置流表并使用 enqueue 对网络流量进行分类。 作用:enqueue 可以为匹配流表的数据包指定目标输出端口和队列。

QoS令牌桶工作原理

QoS的一个重要作用就是对端口流量进行监管,也就是限制端口流量。但QoS是如何做到这点的呢?那就是QoS的令牌桶机制了。下面是在笔者刚刚出版的《Cisco/H3C交换机高级配置与管理技术手册》一书中,经过笔者充分理解后的全面诠释,大家看一下是否可以理解。http://book.360buy.com/10959197.html 6.3.3 QoS令牌桶工作原理 QoS中的流量...

数据库天地 1035

python如何实现点云可视化交互——Open3D实例教程(获取所选点的信息)保姆级教学

python如何实现点云可视化交互——Open3D实例教程(获取所选点的信息)保姆级教学

qq_45912037的博客 1万+

DPDK 限速模块 qos_meter

cd dpdk-2.1.0/examples/qos_meter vim main.c 调用函数app_configure_flow_table();初始化限速参数。 限速参数在app_srtcm_params[]中设置值,可以自行赋值 对于收到的数据包调用函数app_pkt_handle进行限速 static inline intstatic inline int app_pkt_hand...

weixin_41666796的博客 2702

局域网tcp通信实验

IPv4 地址 . . . . . . . . . . . . : 192.168.92.79。IPv4 地址 . . . . . . . . . . . . : 192.168.92.59。子网掩码 . . . . . . . . . . . . : 255.255.255.0。子网掩码 . . . . . . . . . . . . : 255.255.255.0。使用这篇文章的小工具。

weixin_51883798的博客 431

python 编程 安卓脚本_详解基于Android的Appium+Python自动化脚本编写

1.AppiumAppium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试, 它使用WebDriver协议驱动iOS,Android和Windows应用程序。通过Appium,我们可以模拟点击和屏幕的滑动,可以获取元素的id和classname,还可以根据操作生成相关的脚本代码。下面开始Appium的配置。appPackage和APPActivity的获取任意下载一个app解压...

weixin_39523625的博客 2928

为什么限速100Mbps,却能瞬间跑到500Mbps?——一次运营商QoS误判,彻底理解DPDK rte_meter 与 Token Bucket(上)

某运营商部署DPDK业务网关后,为企业专线配置了100Mbps限速。然而客户测速时却多次达到400~600Mbps,质疑QoS配置失效。研发团队逐层排查,最终发现限速策略没有任何问题,真正被误解的是Token Bucket算法本身。本文结合真实现网案例,深入解析DPDK librte_meter 的设计思想,从Token Bucket、CIR、CBS到srTCM、trTCM,讲透为什么QoS限制的是平均速率,而不是瞬时速率,以及DPDK为什么采用RFC2697/RFC2698作为流量计量标准。

MrHeBoYan的博客 488

倍福--实现TCP/IP的配置

控制器为CX5120,需要和上位机做通信,选择TCP/IP的通讯方式,本文介绍TCP/IP通信的操作步骤。 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 1.2. 串口调试助手 3 1.2.1. TCP调试通信助手 3 授权文件 3 2.1 Lib文件 3 2.2. CAB文件 4 PLC程序编写 4 3.1. 引入TCP/IP库文件 4 3.2. Client端程序 5 3.2.1. 建立相关变量 5 3.3.2. 编写连接功能块

weixin_41883890的博客 5730

DPDK QoS_meter 源码阅读

main.c /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2016 Intel Corporation */ #include <stdio.h> #include <getopt.h> #include <rte_common.h> #include <rte_eal....

weixin_30598225的博客 399

4 屏 + 8 摄像头一开,谁在悄悄拖慢你的座舱域控?

如果你觉得座舱卡顿:❌ 别第一反应怪 SoC❌ 别盲目堆算力。

weixin_43199439的博客 148

【AUTOSAR-DCM】-3.1-将CDD导入CFG并查看$22服务配置变化(UDS诊断DID带一个Data)

案例背景:(共8页精讲) 在《【UDS诊断描述文件CDD】-3.2-编辑CDD给$22服务创建一个带一个Data的DID(dataIdentifier)数据标识符》中,适应使用CANdela Studio在CDD中创建一个带一个Data的DID(dataIdentifier)数据标识符,见图0-1。现在我们将该CDD文件导入到CFG(DaVinci Configurator),看看配置会发生哪些变化。 图0-1 目录 1 将诊断描述文件CDD导入CFG(DaVinci Configurator.

「汽车电子助手」的博客 1630

限速之令牌桶理解

背景 在高并发的场景下,我们的优化和保护系统的方式通常有:多级缓存、资源隔离、熔断降级、限流等等。 定义 匀速的产生令牌,往桶里面丢; 每次请求来,看是否有多余的令牌。如果有,获取令牌执行正常业务;如没有,丢包限速。 适用场景 原理 ...

legend050709的专栏 1万+

RFC 字符码转换深度解析:Unicode、非 Unicode 与 MDMP 系统的协奏

老版本 MDMP 系统不上传自定义映射时,Unicode 端会落回“预配置列表”。列表里可见西欧 1100、日文 8000、中文 8400 等经典编号。若需强制覆写映射,可在 SM59 ➡Unicode页签启用,或直接勾选作为兜底。字符编码问题常“潜伏”多年,一旦旧系统升级或新增语种便集中爆发。掌握 RFC code page 转换机理、灵活运用 SM59 选项、在早期对 LANG 字段和字段长度进行治理,是根治乱码与 short dump 的关键。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 222

DPDK- flow Metering

DPDK- flow Metering flow Metering 是 DPDK 19.11 及后续版本添加的新特性. 主要针对 Mellanox ConnectX-5/ConnectX-6/ConnectX-6Dx 系列网卡硬件Metering特性. 其支持的限速算法是 rfc2697 单色双桶 限速机制, 支持对 ingress 流量 metering . 环境准备 DPDK 19.11 OFED 4.7-3 ConnectX-5 启用 DevX: mlxconfig -d d8:00.0 set

奋斗中拥有 1837

Orin+ GMSL (Ser 9295+Des 9296)流程分析(1)

orin gmsl

乐于分享 2651

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Redis:从应用到底层,一文帮你搞定(1)

Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据,过期策略用于处理过期的缓存数据。7、Redis 集群高可用单机问题有机器故障、容量瓶颈、QPS瓶颈。在实际应用中,Redis的多机部署时候会涉及到redis主从复制Sentinel哨兵模式。| 模式 | 优点 | 缺点 || 单机版 | 架构简单,部署方便 | 机器故障、容量瓶颈、QPS瓶颈 || 主从复制 | 高可靠性,读写分离 | 故障恢复复杂,主库的写跟存受单机限制 |

2301_82242844的博客 415

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

五、程序员指南:数据平面开发套件

程序员指南:数据平面开发套件 21-25章

Phoenix_zxk的博客 905

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

DPDK QOS2 -- DPDK的QOS框架

VPP HQOS处理报文整体框架如下图所示: 上图的QOS就是DPDK实现的HQOS,它的层次如下,官网摘录: The scheduling hierarchy As shown below. The first level of the hierarchy is the Ethernet TX port 1/10/40 GbE, with subsequent hierarchy lev...

~~ LINUX ~~ 1959

DPDK概述

DPDK是一种用户空间数据平面开发工具包,它的主要目标是为开发人员提供一个。DPDK开发者能够用C语言、汇编与新型Intel架构的linux内核进行交互,使得数据平面应用程序在高度优化的环境中运行。随着芯片技术与高速网络接口技术的一日千里式发展,报文吞吐需要处 理10Gbps 端口处理能力,世面上大量的 25G、 40G 甚至100G 高速端口已经出现,主流处理器的主频仍停留在 3GHz 左右。IO 超越 CPU 的运行速率,是横在行业面前的技术挑战。

尘世中迷途小码农的专栏 1326

网卡多队列

https://tonydeng.github.io/sdn-handbook/dpdk/queue.html 网卡多队列,顾名思义,也就是传统网卡的DMA队列有多个,网卡有基于多个DMA队列的分配机制。多队列网卡已经是当前高速率网卡的主流。 RPS 图片来源RPS/RFS Linux内核中,RPS(Receive Packet Steering)在接收端提供了这...

weixin_30649859的博客 1026
上一篇: linux内核分析与应用 -- 内存管理(上)
下一篇: linux 内核与分析 -- 内存管理(下)
废言Pro
博客等级 码龄16年 1092粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值