vdbench测试存储性能

vdbench是一个用于测试存储性能的工具,它可以模拟不同类型的负载,并提供详细的性能指标。可用于文件系统及块设备基准性能测试。

参考资料:
vdbench存储性能测试工具

1. 安装部署vdbench

1.1 安装java环境

vdbench依赖java运行环境,使用如下命令安装java:

$ sudo yum install java-1.8.0-openjdk
$ java -version
openjdk version "1.8.0_402"
OpenJDK Runtime Environment (build 1.8.0_402-b06)
OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)

1.2 多客户端联机测试(按需)

三客户端联机测试,client1作为主节点:

将每个节点IP和主机名的映射关系写入到/etc/hosts配置文件内:

# 替换对应ip地址和主机名
echo 'ip1 client1' >> /etc/hosts
echo 'ip2 client2' >> /etc/hosts
echo 'ip2 client3' >> /etc/hosts

配置主节点到从节点免密钥登录。client1生成公钥文件,并拷贝到2个从节点:

ssh-keygen
ssh-copy-id client2
ssh-copy-id client3

1.3 vdbench安装配置

三台客户端分别进行安装操作。

  1. 下载vdbench:

    • 访问vdbench的官方网站,需要注册oracle账号。
    • 选择适用于您操作系统的版本进行下载。
  2. 安装及检查:

    • 将下载的文件解压到您选择的目录中。
# 上传解压安装
$ mkdir vdbench/
$ unzip vdbench50407.zip -d vdbench/

# 检查vdbench环境
$ cd vdbench/
$ ./vdbench -t

# 运行测试模型。-f后接测试参数文件名,-o后接导出测试结果路径。都客户端联机测试仅master运行。
$ ./vdbench -f {filename} -o {exportpath}
  1. 配置环境变量(可选):

如果想要在任何位置运行vdbench,请将vdbench的安装目录添加到您的系统PATH变量中。

1.4 注意事项

  1. 在联机测试时,客户端的系统时间需保持一致,否则会出现时钟同步告警(this can lead to heartbeat issues)
  2. 客户端的防火墙要关闭(或者设置开放程序指定端口5570、5560访问)
  3. 关闭系统日志服务rsyslog,避免运行时出现其他日志文件打印信息
  4. 参数文件添加messagescan=no可以过滤掉多余的系统日志

2. 参数说明及常用配置参数

vdbench所有测试参数都定义到一个参数文件内,在运行时按照顺序被读取执行相应操作,在参数文件定义时需要执行顺序进行定义。

2.1 文件系统

文件系统参数文件定义顺序为:HD、FSD、FWD、RD

2.1.1 HD(Host Define)

HD(Host Define):非必选项,单机运行时不需要配置HD参数,一般只有在多主机联机测试时才需要配置

hd=default,vdbench=/home/test/vdbench,user=test,shell=ssh
hd=hd1,system=node241
hd=hd2,system=node242
hd=hd3,system=node243
  • hd= 标识主机定义的名称,多主机运行时,可以使用hd1、hd2、hd3…区分
  • system= 主机IP地址或主机名
  • vdbench= vdbench执行文件存放路径,当多主机存放路径不同时,可在hd定义时单独指定
  • user= slave和master通信使用用户
  • shell= 可选值为rsh、ssh或vdbench,默认值为rsh,多主机联机测试时,mater和slave主机间通信方式
    • 当参数值为rsh时,需要配置master和slave主机rsh互信,考虑到rsh使用明文传输,安全级别不够,通常情况下不建议使用这种通信方式
    • 当参数值为ssh时,需要配置master和slave主机ssh互信,通常Linux主机联机时使用此通信方式
    • 当参数值为vdbench,需要在所有slave主机运行vdbench rsh启用vdbench本身的rsh守护进程,通常Window主机联机时使用此通信方式
2.1.2 FSD(File System Define)
fsd=default,openflags=directio,depth=2,width=3,files=2,size=128k
fsd=fsd1,anchor=/mnt/client1
fsd=fsd2,anchor=/mnt/client2
fsd=fsd3,anchor=/mnt/client3
  • fsd= 标识文件系统定义的名称,多文件系统时(fsd1、fsd2、fsd3…),可以指定default(将相同的参数作为所有fsd的默认值)
  • openflags= 通过设置为o_direct或directio,以无缓冲缓存的方式进行读写操作
  • anchor= 文件写入目录,linux指定路径为/dir01;windows指定路径为E:\dir01;
  • depth= 创建目录层级数(即目录深度)
  • width= 每层文件夹的子文件夹数
  • files= 测试文件个数(vdbench测试过程中会生成多层级目录结构,实际只有最后一层目录会生成测试文件)
  • size= 每个测试文件大小
  • distribution= 可选值为bottom或all,默认为bottom
    • 当参数值为bottom时,程序只在最后一层目录写入测试文件
    • 当参数值为all时,程序在每一层目录都写入测试文件
  • shared= 可选值为yes或no,默认值为no,一般只有在多主机联机测试时指定
    • vdbench不允许不同的slave之间共享同一个目录结构下的所有文件,因为这样会带来很大的开销,但是它们允许共享同一个目录结构。加入设置了shared=yes,那么不同的slave可以平分一个目录下所有的文件来进行访问,相当于每个slave有各自等分的访问区域,因此不能测试多个客户的对同一个文件的读写
    • 当多主机联机测试时,写入的根目录anchor为同一个路径时,需要指定参数值为yes
hd=default,vdbench=/home/test/vdbench,user=test,shell=ssh
hd=hd1,system=node1
hd=hd2,system=node2
hd=hd3,system=node3
fsd=fsd1,anchor=/client/,depth=2,width=100,files=100,size=4k,shared=yes

计算公式如下
 最后一层生成文件夹个数=width^depth
 测试文件个数=(width^depth)*files

2.1.3 FWD(FileSystem Workload Defile)
fwd=default,operation=read,xfersize=4k,fileio=sequential,fileselect=random,threads=2
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd2,host=hd2
fwd=fwd3,fsd=fsd3,host=hd3
  • fwd= 标识文件系统工作负载定义的名称,多文件系统工作负载定义时,可以使用fwd1、fwd2、fwd3…区分
  • fsd= 标识此工作负载使用文件存储定义的名称
  • host= 标识此工作负载使用主机
  • operation= 可选值为read或write,文件操作方式
  • rdpct= 可选值为0~100,读操作占比百分比,一般混合读写时需要指定,当值为60时,则混合读写比为6:4
  • fileio= 可选值为random或sequential,标识文件 I/O 将执行的方式
  • fileselect= random或sequential,标识选择文件或目录的方式
  • xfersizes= 数据传输(读取和写入操作)处理的数据大小(即单次IO大小)
  • threads= 此工作负载的并发线程数量
2.1.4 RD(Run Define)
rd=rd1,fwd=(fwd1-fwd3),fwdrate=max,format=restart,elapsed=604800,interval=10
  • rd= 标识文件系统运行定义的名称。
  • fwd= 标识文件系统工作负载定义的名称。
  • fwdrate= 每秒执行的文件系统操作数量。设置为max,表示不做任何限制,按照最大强度自适应
  • format= 可选值为no、yes、或restart,标识预处理目录和文件结构的方式
    • no:默认参数值,不执行format预处理操作,如测试目录不存在文件时,vdbench会由于无可用文件读写而异常退出
    • yes:表示删除测试目录已有文件结构,并且重新创建新的文件结构
    • restart:表示只创建未生成的目录或文件,并且增大未达到实际大小的文件
  • elapsed= 默认值为30,测试运行持续时间(单位为秒)
  • interval= 结果输出打印时间间隔(单位为秒)

2.2 块设备

块设备参数文件定义顺序为:HD、SD、WD、RD

2.2.1 HD(Host Define)

非必选项,单机运行时不需要配置HD参数,一般只有在多主机联机测试时才需要配置

hd=default,vdbench=/root/test/vdbench,user=test,shell=ssh
hd=hd1,system=node241
hd=hd2,system=node242
hd=hd3,system=node243
  • hd= 标识主机定义的名称,多主机运行时,可以使用hd1、hd2、hd3…区分
  • system= 主机IP地址或主机名
  • vdbench= vdbench执行文件存放路径,当多主机存放路径不同时,可在hd定义时单独指定
  • user= slave和master通信使用用户
  • shell= 可选值为rsh、ssh或vdbench,默认值为rsh,多主机联机测试时,mater和slave主机间通信方式
    • 当参数值为rsh时,需要配置master和slave主机rsh互信,考虑到rsh使用明文传输,安全级别不够,通常情况下不建议使用这种通信方式
    • 当参数值为ssh时,需要配置master和slave主机ssh互信,通常Linux主机联机时使用此通信方式
    • 当参数值为vdbench,需要在所有slave主机运行vdbench rsh启用vdbench本身的rsh守护进程,通常Window主机联机时使用此通信方式
2.2.2 SD(Storage Define)
sd=sd1,hd=hd1,lun=/dev/vdb,openflags=o_direct,threads=6
sd=sd3,hd=hd2,lun=/dev/vdb,openflags=o_direct,threads=6
sd=sd6,hd=hd3,lun=/dev/vdb,openflags=o_direct,threads=6
  • sd= 标识存储定义的名称
  • hd= 标识主机定义的名称
  • lun= 写入块设备,linux使用sdb盘,则指定路径为/dev/sdb;windows使用G盘,则指定路径为\.\G:;
  • openflags= 通过设置为o_direct或directio,以无缓冲缓存的方式进行读写操作
  • threads= 对SD的最大并发I/O请求数量
2.2.3 WD(Workload Define)
wd=wd1,sd=sd*,seekpct=100,rdpct=100,xfersize=8k,skew=40
wd=wd2,sd=sd*,seekpct=100,rdpct=0,xfersize=8k,skew=10
wd=wd3,sd=sd*,seekpct=100,rdpct=100,xfersize=1024k,skew=40
wd=wd4,sd=sd*,seekpct=100,rdpct=0,xfersize=1024k,skew=10
  • wd= 标识工作负载定义的名称
  • sd= 标识存储定义的名称
  • seekpct= 可选值为0或100(也可使用sequential或random表示),默认值为100,随机寻道的百分比,设置为0时表示顺序,设置为100时表示随机。
  • rdpct= 读取请求占请求总数的百分比,设置为0时表示写,设置为100时表示读
  • xfersize= 要传输的数据大小。默认设置为4k
  • skew= 非必选项,一般在多个工作负载时需要指定,表示该工作负载占总工作量百分比(skew总和为100)
2.2.4 RD(Run Define)
rd=rd1,wd=wd*,iorate=max,maxdata=400GB,warmup=30,elapse=604800,interval=5
  • rd= 标识运行定义的名称
  • wd= 标识工作负载定义的名称
  • iorate= 常用可选值为100、max,此工作负载的固定I/O速率
    • 当参数值为100时,以每秒100个I/Os的速度运行工作负载,当参数值设置为一个低于最大速率的值时,可以达到限制读写速度的效果
    • 当参数值为max时,以最大的I/O速率运行工作负载,一般测试读写最大性能时,该参数值均为max
  • warmup= 预热时间(单位为秒),默认情况下vdbench会将第一个时间间隔输出数据排除在外,程序在预热时间内的测试不纳入最终测试结果中(即预热结束后,才开始正式测试)
    • 当interval为5、elapsed为600时,测试性能为2~elapsed/interval(avg_2-120)时间间隔内的平均性能
    • 当interval为5、warmup为60、elapsed为600时,测试性能为1+(warmup/interval)~(warmup+elapsed)/interval(avg_13-132)时间间隔内的平均性能
  • maxdata= 读写数据大小,通常情况下,当运行elapsed时间后测试结束;当同时指定elapsed和maxdata参数值时,以最快运行完的参数为准(即maxdata测试时间小于elapsed时,程序写完elapsed数据量后结束)
    • 当参数值为100以下时,表示读写数据量为总存储定义大小的倍数(如maxdata=2,2个存储定义(每个存储定义数据量为100G),则实际读写数据大小为400G)
    • 当参数值为100以上时,表示数据量为实际读写数据量(可以使用单位M、G、T等)
  • elapsed= 默认值为30,测试运行持续时间(单位为秒)
  • interval= 报告时间间隔(单位为秒)

2.3 常见测试参数

2.3.1 文件系统4M顺序写

目录深度2、单级目录数100、单个目录文件数100、单文件大小4M、IO块大小1M、顺序写

hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node21
hd=hd2,system=node22
hd=hd3,system=node23
hd=hd4,system=node24
hd=hd5,system=node25
hd=hd6,system=node26
fsd=fsd1,anchor=/client/test01,depth=2,width=100,files=100,size=4M,shared=yes
fwd=format,threads=24,xfersize=1m
fwd=default,xfersize=1m,fileio=sequential,fileselect=sequential,operation=write,threads=24
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd1,host=hd2
fwd=fwd3,fsd=fsd1,host=hd3
fwd=fwd4,fsd=fsd1,host=hd4
fwd=fwd5,fsd=fsd1,host=hd5
fwd=fwd6,fsd=fsd1,host=hd6
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,interval=1
2.3.2 文件系统4M顺序读统

目录深度2、单级目录数100、单个目录文件数100、单文件大小4M、IO块大小1M、顺序读

hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node21
hd=hd2,system=node22
hd=hd3,system=node23
hd=hd4,system=node24
hd=hd5,system=node25
hd=hd6,system=node26
fsd=fsd1,anchor=/client/test02,depth=2,width=100,files=100,size=4M,shared=yes
fwd=format,threads=24,xfersize=1m
fwd=default,xfersize=1m,fileio=sequential,fileselect=sequential,operation=read,threads=24
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd1,host=hd2
fwd=fwd3,fsd=fsd1,host=hd3
fwd=fwd4,fsd=fsd1,host=hd4
fwd=fwd5,fsd=fsd1,host=hd5
fwd=fwd6,fsd=fsd1,host=hd6
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,interval=1

2.3.3 文件系统8M混合读写

目录深度2、单级目录数100、单个目录文件数100、单文件大小8M、IO块大小1M、混合读写(读写比为6:4)

hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=node21
hd=hd2,system=node22
hd=hd3,system=node23
hd=hd4,system=node24
hd=hd5,system=node25
hd=hd6,system=node26
fsd=fsd1,anchor=/client/test03,depth=2,width=100,files=100,size=8M,shared=yes
fwd=format,threads=24,xfersize=1m
fwd=default,xfersize=1m,fileio=random,fileselect=random,rdpct=60,threads=24
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd1,host=hd2
fwd=fwd3,fsd=fsd1,host=hd3
fwd=fwd4,fsd=fsd1,host=hd4
fwd=fwd5,fsd=fsd1,host=hd5
fwd=fwd6,fsd=fsd1,host=hd6
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,interval=1

3.测试执行

3.1 单机运行

单节点针对裸盘测试,1M顺序写,测试时间600s,预热时间60s,报告时间间隔2s

$ cat single-disk.html
sd=sd1,lun=/dev/sdb,openflag=o_direct
wd=wd1,sd=sd1,seekpct=0,rdpct=0,xfersize=1M
rd=rd1,wd=wd1,iorate=max,warmup=60,elapsed=600,interval=2

$ ./vdbench -f single-disk.html

单节点针对文件系统测试,1M顺序写,目录深度为2,每层目录数为3,每个目录文件数为10,每个文件大小为1M,测试时间为600s,报告时间时间2s

$ cat single-fs.html
fsd=fsd1,anchor=/tmp,depth=2,width=3,files=10,size=1M
fwd=fwd1,fsd=fsd1,operation=write,xfersize=1M,fileio=sequential,fileselect=random,threads=2
rd=rd1,fwd=fwd1,fwdrate=max,format=yes,elapsed=600,interval=5

$ ./vdbench -f single-fs.html

3.2 联机运行

已配置多客户端ssh免密通信,master客户端运行测试参数文件即可。

三节点针对裸盘联机测试,1M顺序写,测试数据量为400G,预热时间30s,报告间隔5s:

$ cat Multi-RawDisk
hd=default,vdbench=/root/test/vdbench,user=test,shell=ssh
hd=hd1,system=client1
hd=hd2,system=client2
hd=hd3,system=client3
sd=sd1,hd=hd1,lun=/dev/sdb,openflag=o_direct
sd=sd2,hd=hd2,lun=/dev/sdb,openflag=o_direct
sd=sd3,hd=hd3,lun=/dev/sdb,openflag=o_direct
wd=wd1,sd=sd*,seekpct=0,rdpct=0,xfersize=1M
rd=rd1,wd=wd1,iorate=max,maxdata=100M,elapsed=64800,warmup=30,interval=5

$ ./vdbench -f Multi-RawDisk

4. 结果分析

4.1 输出文件

当vdbench运行完负载测试后,会在安装目录下生成output文件夹,里边包含测试结果文件。

  • summary.html:记录全部数据信息,显示每个报告间隔内总体性能情况及工作负载情况,以及除第一个间隔外的所有间隔的加权平均值
  • totals.html:记录全部数据计算之后的平均值,一般测试结果从该文件取值,除第一个间隔外所有间隔的加权平均值
  • errorlog.html: 当运行测试启用数据校验时,它可能会包含一些错误信息
  • flatfile.html: vdbench 生成的一种逐列的 ASCII 格式的信息,可以使用parseflat参数解析结果
  • histogram.html:一种包含报告柱状图的响应时间、文本格式的文件
  • logfile.html:包含 Java 代码写入控制台窗口的每行信息的副本。logfile.html 主要用于调试用途
  • parmfile.html:包含测试运行配置参数信息

4.2 结果分析

4.2.1 文件系统

totals.html一般包括两个部分,第一部分为文件存储目录结构及数据填充的平均性能值,第二部分为执行测试过程中除第一个时间间隔外所有时间间隔平均性能值,主要看第二部分的内容。

  • Interval:报告间隔序号,测试结果一般为除第一个时间间隔外所有时间间隔加权平均值。如elapsed=600,interval=5,则性能结果为第2个间隔到第120个间隔的平均值(avg_2-120)
  • ReqstdOps:
    • rate:每秒读写I/O个数(读写IOPS),可以通过rd运行定义参数fwdrate控制。当fwdrate为max时,以最大I/O速率运行工作负载当fwdrate为低于最大I/0速率的一个数值时,可以限制读写速度,以固定I/O速率运行工作负载
    • resp:读写请求响应时间(读写时延),单位为ms
  • cpu%: total:总的CPU占有率;sys:系统cpu占有率。
  • read pct:读取请求占总请求数百分比占比,当为0时表示写,当为100时表示读
  • read:rate:每秒读I/O个数(读IOPS);resp:读请求响应时间(读时延),单位为ms。
  • write:rate:每秒读I/O个数(写IOPS);resp:读请求响应时间(写时延),单位为ms。
  • mb/sec: read:每秒读取速度 ; wirte:每秒写入速度 total:每秒读写速度总和。
  • xfersize:每个读写I/O传输数据量(即单个读写I/O大小),单位为字节B。
4.2.2 块设备
  • interval:报告间隔序号,测试结果一般为除第一个时间时间外所有时间间隔加权平均值,如有设置预热时间,则这部分测试数据也需要排除在外,如elapsed=600,warmup=30,interval=5,则性能测试结果为第7个间隔到第126个间隔的平均值(avg_7-126)
  • i/o rate:每秒读写I/O个数(读写IOPS),可以通过rd运行定义参数iorate控制。当iorate为max时,以最大I/O速率运行工作负载;当iorate为低于最大I/0速率的一个数值时,可以限制读写速度,以固定I/O速率运行工作负载
  • MB/sec:每秒读写速度(读写带宽)
  • bytes i/0:每个读写I/O传输数据量(即单个读写I/O大小),单位为字节B,可以通过wd工作负载定义参数xfersize控制
  • read pct:读取请求占请求总数的百分比,可以通过wd工作负载定义参数rdpct控制。当rdpct为0时,表示测试模型为写;当rdpct为100时,表示测试模型为读
  • resp time:请求响应时间(读写时延),单位为毫秒ms
  • read resp:读取请求响应时间,单位为毫秒ms
  • write resp:写入请求响应时间,单位为毫秒ms
  • resp max: 最大请求响应时间,单位为毫秒ms
  • resp stddev: 请求响应时间标准偏差,单位为毫秒ms
  • queue depth: 读写I/0队列深度
  • cpu% sys+u: 内核态空间及用户态空间CPU占用率
  • cpu% sys: 内核态空间CPU占用率

5. 其他

5.1 总结

  1. 线程数(thread)一般设置为客户端CPU线程数总大小 grep ‘processor’ /proc/cpuinfo | sort -u | wc -l
  2. 测试总数据量需要为客户端内存大小两倍
  3. 测试读模型时需要清理客户端缓存信息 sync;echo 3 > /proc/sys/vm/drop

5.2 FAQ

常见问题参考:vdbench存储性能测试工具

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 对于vdbench小文件性能测试,可以使用以下配置进行测试。首先,需要设置文件系统测试的参数,包括文件大小、文件个数、文件深度和操作类型。例如,可以设置文件大小为1G,文件个数为256,文件深度为1,操作类型为随机写。这样可以模拟小文件的写入性能。另外,如果要测试性能,可以将操作类型改为read;如果要测试顺序读写,可以将fileio改为sequential。\[1\] 此外,需要注意的是,在vdbench的50407版本中,当进行文件系统顺序IO混合读写时,不能直接使用参数rdpct来控制读写比例,而是需要使用新的参数skew来控制读写比例。因此,在进行小文件性能测试时,需要根据具体需求设置skew参数来控制读写比例。\[2\] 在进行vdbench小文件性能测试时,还需要注意一些测试注意点。例如,需要了解vdbench工具的通用参数说明,以及单机测试和联机测试的区别。此外,还需要注意ssh互信的设置和执行,以及测试结果的输出和日志的存放路径。\[3\] 综上所述,进行vdbench小文件性能测试时,需要设置文件系统测试的参数,注意使用skew参数来控制读写比例,了解测试注意点,并确保正确设置ssh互信和输出结果的存放路径。 #### 引用[.reference_title] - *1* [vdbench测试文件系统读写性能](https://blog.csdn.net/qq_32639315/article/details/114386195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [[存储-测试工具]vdbench文件系统性能测试顺序IO混合读写配置模板](https://blog.csdn.net/notwoer/article/details/121421985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Vdbench工具文件系统测试记录](https://blog.csdn.net/qq_41960479/article/details/124888566)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lldhsds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值