Vdbench工具文件系统测试记录

Vdbench工具测试记录

文件系统通用参数说明

HD

  • Host Definition的简称,即主机定义。只有在多台主机联机测试的场合,或者需要对单台主机重新设置JVM数目的时候才有设置的必要。
hd=default	
#表明该行中后续设置的所有参数都会作为后续所有hd的默认参数。
hd=host_label	
#确定主机标签,主要用于交叉引用和报告输出中
system=IP/hostname	
#联机测试时,表明系统IP地址或者网络名称。system=129.22.240.188表明IP为129.22.240.188的主;system=sysa表明网络名称为sysa的主机,还可以使用system=localhost来表示当前主机。
vdbench=PATH	
#确定远程主机上vdbench的安装目录
shell=rsh|ssh|vdbench	
#联机测试时,windows使用vdbench自带远程

FSD

  • Filesystem Storage Definition的简称,即文件系统存储定义。这类参数是必须设置的,主要包含文件系统的挂载目录,目录结构,文件个数,文件大小等等。
fsd=name	#用来唯一标识一个文件系统存储定义,以便被fwd调用。
fsd=default	#表明该行中后续设置的所有参数都会作为后续所有fsd的默认参数。
anchor=/dir/	#表明在哪个路径下创建新的目录结构并进行测试。
shared=yes/no	#Vdbench不允许不同的slave之间共享同一个目录结构下的所有文件,因为这样会带来很大的开销,但是允许它们共享一个目录结构。假如设置了shared=yes,那么不同的slave可以平分一个目录下的所有文件来进行访问,相当于每个slave有各自等分的访问区域。
width=nn	#确定需要创建的目录结构的宽度。
depth=nn	#确定需要创建的目录结构的深度。
files=nn	#最底层的单个目录中创建多少个文件。
sizes=(nn,nn,……)	#可以确定单个文件的大小,也可以确定多个文件的大小。当描述多个文件的大小时,采用了结对描述的方式。一个对中的第一个参数表示文件的大小,一个对中的第二个参数表示该大小的文件在所有文件中所占的比重。比如:sizes=(4k,25,8k,20,16k,55)就表示所有文件中25%的文件大小为4k,20%的文件大小为8k,55%的文件大小为16k。如果设置为sizes=(nnn,0),Vdbench将创建平均大小为nnn字节的文件,其规则如下:nnn>10m,实际创建的文件大小是1m的倍数;nnn>1m,实际创建的文件大小是100k的倍数;nnn>100k,实际创建的文件大小是10k的倍数;nnn<100k,实际创建的文件大小是1k的倍数。
openflags=(flag,..)	"仅在Solaris下适用,可以传递标识给文件系统的open请求。目前支持的标识有:O_DSYNC,O_RSYNC,O_SYNC。
total_size=nnn	#创建新文件时,如果占用的空间达到了该参数的设定值,就要及时停止文件创建。
"workingsetsize=nn
(wss=nn)"	一般来说,depth,width,files和sizes等参数共同决定了文件系统的文件个数和大小。total_size会用来确定实际使用的文件系统空间,而workingsetsize参数可以设置这些文件中会用于实际测试的工作文件子集的大小。举个例子,如果总文件占用了200g的空间,文件系统缓存的大小是32g,那么设置workingsetsize=32g就会保证在测试的热身阶段之后,工作子集中的文件都驻留在文件系统缓存中。
count=(nn,mm)	#可以快速产生一系列顺序的fsd,比如:fsd=fsd,anchor=/dir,count=(1,5)表示fsd1-fsd5,分别对应/dir1-/dir5
shared= 可选值为yes或no,默认值为no,一般只有在多主机联机测试时指定 vdbench不允许不同的slave之间共享同一个目录结构下的所有文件,因为这样会带来很大的开销,但是它们允许共享同一个目录结构。加入设置了shared=yes,那么不同的slave可以平分一个目录下所有的文件来进行访问,相当于每个slave有各自等分的访问区域,因此不能测试多个客户的对同一个文件的读写 --当多主机联机测试时,写入的根目录anchor为同一个路径时,需要指定参数值为yes

FWD

  • Filesystem Workload Definition的简称,即文件系统工作负载定义。这类参数是必须设置的,主要是描述需要对哪些fsd执行哪种文件访问方式和哪种I/O负载类型的下发
fwd=name	
#用来唯一标识一个文件系统工作负载定义,以便被rd调用
fwd=default	
#表明该行中后续设置的所有参数都会作为后续所有fwd的默认参数。测试文件系统生成文件时默认配置 threads=8,xfersize=128k
fwd=format	
#按照指定的参数生成文件,需要在该参数后面指定threads和xfersize参数
fsd=(xx,…)	
#该参数确定该文件系统工作负载定义会作用于哪些文件系统存储定义,比如fsd=(fsd1,fsd2)
fileio=random/sequential	
#确定每个文件中I/O操作的类型,顺序或者是随机。一个随机的LBA地址会在传输的数据块大小的边界上产生。fileio=random表示随机I/O,fileI/O=sequential表示顺序I/O,fileio=(seq,delete)表示写前先删除文件。
rdpct=nn	
#设置混合读写时读I/O的比例,只用于随机读写时。Fileio为顺序时,两个参数互斥
fileselect=random/sequential	
#确定选择目录和文件的方式是顺序的还是随机的。
xfersizes=nn	
#确定I/O读写操作传输的数据块大小。可以确定一种大小,也可以确定多种大小。当描述多种数据块大小时,采用了结对描述的方式。一个对中的第一个参数表示数据块的大小,一个对中的第二个参数表示该大小的数据块在所有I/O中所占的比重。比如:xfersizes=(8k,50,16k,30,2k,20)就表示所有文件中50%的I/O的块大小为8k,30%的I/O的块大小为16k,20%的I/O的块大小为2k。
operation=xxxx	
#确定一种文件系统的操作,包括:mkdir,rmdir,create,delete,open,close,read,write,getattr和setattr。如果想要设定多种操作方式,则需在rd中设置operations参数。
threads=nn	
#确定有多少并行的线程来执行该工作负载,每个线程只处理一个文件,而不能多个线程同时处理一个文件。但是就算是不同的线程处理不同的文件,还是会遇到很多尴尬的场景,比如:在父目录和当前目录不存在的时候需要在当前目录下创建文件;读写一个还不存在的文件;读一个空文件;删除一个正在被读写的文件;当这些情况发生的时候Vdbench会自动分析和处理。比如想要写一个还不存在的文件,Vdbench会检查在本次运行中是否有新的文件会被创建,如果有,当前线程会睡眠200ms,让下一个操作继续。如果没有文件创建请求在排队的话就直接终止本次运行。在运行结束后,各种与该问题相关的统计数据都在logfile.html中报告出来。为了防止死锁,如果有10000个连续的线程睡眠而该期间没有一个操作被成功处理,Vdbench会自动终止。一般情况下,最好让线程数超过需要处理的文件的总数。
skew=nn	
#确定分配给该工作负载的I/O占所有I/O总数的比例。
stopafter=nn% 和 stopafter=nn 
#该参数可以设置对每个文件读多少数据写多少数据。可以设置stopafter=nn来表示对一个文件进行nn个I/O操作后停止对该文件的访问,可以设置stopafter=nn%来表示对一个文件进行文件大小的nn%操作后停止对该文件的访问。对于随机I/O,默认情况下,Vdbench会在100个I/O操作之后或者整个文件被访问完之后关闭该文件,然后访问其它文件。对于顺序I/O,Vdbench默认会访问完整个文件,设置该参数后会根据需要停止对该文件的访问,但是下次访问该文件时会从上次的结束点开始,对于写来说,就相当于是Append操作。

RD

  • Run Definition的简称,即运行定义。这类参数是必须设置的,主要是描述需要执行哪些fwd,需要产生多少操作数等等
fwd=(xx,yy,..)	
#确定本次运行中,哪些文件系统工作负载定义会被执行。可以执行单个工作负载,如fwd=fwd1;也可以执行多个工作负载,比如fwd=(fwd1,fwd2,fwd3),或者fwd=(fwd1-fwd3),或者fwd=fwd*
fwdrate=nn	
#表示每秒钟的操作数
fwdrate=100
#表示运行每秒100操作数的工作负载
fwdrate=(100,200,…)
#表示运行每秒100操作数的负载,再运行每秒200操作数的负载,依次下去
fwdrate=(100-1000,100)
#表示运行每秒从100到1000的操作数负载,增量为100
fwdrate=curve
#表示运行每秒操作数为梯度形态的工作负载
fwdrate=max
#表示运行每秒最大操作数的工作负载,不对操作数进行限制"
format=xxxx	
#该参数将确定是否需要在本次运行之前对目录和文件进行预处理。format=no表示不需要对目录和文件进行任何改变,前提是文件结构与fsd中的需求一致;format=yes表示会删除当前文件结构并且按当前fsd的要求生成新的文件结构;format=restart表示只创建那些不够的文件以及扩展那些文件大小不足的文件;format=only,与yes类似,但Vdbench不会执行当前rd;format=dir,与yes类似,但Vdbench只创建目录;format=clean,表示删除当前文件结构但不会执行当前rd
operations=xx	
#确定一个或多个文件系统操作,该参数会覆盖文件系统工作负载定义中的operation参数。举个例子,如果fsd中没有定义好文件结构,那么想要进行读文件测试的话,就需要设置operations=(mkdir,create,write,read),因为首先需要创建目录结构,再创建文件,再写文件,最后才能读文件。
foroperations=xx	
#该参数覆盖所有与operation有关的参数,允许以各种方式自动执行文件系统的各种操作。
foroperations=(read,write,delete,rmdir)
#执行一次运行,首先是读取所有文件,再写所有文件,再删除所有文件,最后删除所有目录。"
fordepth=xx	"该参数覆盖所有与depth有关的参数,允许以各种方式自动遍历文件系统的各种目录深度fordepth=5表示只运行depth=5的情况;fordepth=(5-10,1)表示执行一次运行,目录深度从5遍历到10,增量为1;forwidth=xx	该参数覆盖所有与width有关的参数,允许以各种方式自动遍历文件系统的各种目录宽度;forwidth=5表示只运行depth=5的情况;forwidth=(5-10,1)表示执行一次运行,目录宽度从5遍历到10,增量为1";
forfiles=xx	"该参数覆盖所有与files有关的参数,允许以各种方式自动遍历文件系统的各种文件数目forfiles=5表示只运行files=5的情况;forfiles=(5-10,1)表示执行一次运行,文件数目从5遍历到10,增量为1";
forsizes=xx	"该参数覆盖所有与sizes有关的参数,允许以各种方式自动遍历文件系统的各种大小的文件;forsizes=5k表示只运行sizes=5的情况;forsizes=(5k-10k,1k)表示执行一次运行,文件大小从5KB遍历到10KB,增量为1KB";
fortotal=xx	"该参数覆盖所有与files有关的参数,允许创建文件来填充总的文件空间。fortotal=(10g,20g)表示执行一次运行,首先文件空间为10g,然后文件空间为20g,确保总的文件空间是一个递增的过程。"
forwss=xx	"该参数覆盖所有与wss有关的参数,允许以各种方式自动遍历文件系统的各种大小的文件工作子集;forwss=16g表示只运行wss=16g的情况
forsizes=(16g,32g)表示执行一次wss=16g的运行,再执行一次wss=32g的运行。
maxdata= 读写数据大小,通常情况下,当运行elapsed时间后测试结束;当同时指定elapsed和maxdata参数值时,以最快运行完的参数为准(即maxdata测试时间小于elapsed时,程序写完elapsed数据量后结束) --当参数值为100以下时,表示读写数据量为总存储定义大小的倍数(如maxdata=2,2个存储定义(每个存储定义数据量为100G),则实际读写数据大小为400G) --当参数值为100以上时,表示数据量为实际读写数据量(可以使用单位M、G、T等)

单机测试-文件系统

范例脚本

#4KB场景100%写
fsd=fsd1,anchor=/testdir_1,depth=3,width=8,files=1000,size=4K,openflags=o_direct
fwd=fwd1,fsd=fsd*,operation=write,xfersize=4K,fileio=random,fileselect=random,threads=32
rd=rd1,fwd=fwd1,fwdrate=max,format=yes,elapsed=600,interval=1
#4KB场景100%读
fsd=fsd1,anchor=/testdir_1,depth=3,width=8,files=1000,size=4K,openflags=o_direct
fwd=fwd1,fsd=fsd*,operation=read,xfersize=4K,fileio=random,fileselect=random,threads=32
rd=rd1,fwd=fwd1,fwdrate=max,format=no,elapsed=600,interval=1
#4KB场景70%读30%写
fsd=fsd1,anchor=/testdir_1,depth=3,width=8,files=1000,size=4K,openflags=o_direct
fwd=fwd1,fsd=fsd*,rdpct=70,xfersize=4K,fileio=random,fileselect=random,threads=32
rd=rd1,fwd=fwd1,fwdrate=max,format=restart,elapsed=600,interval=1

测试注意点

1.在负载参数文件中,必须要按照FSD->FWD->RD的顺序进行参数设置经常使用到的参数;
2.测试时需注意预埋文件即先执行写脚本format=yes,读脚本使用format=restart或者no,避免无意义的时间消耗;
3.批量执行fsd时可以使用fsd*或(fdsXX-fsdXX)的方式;
4.openfilags=o_direct可以绕过文件缓存,测试出的性能更加贴近真实读写;
5.在执行sh vdbench -f xxx.sh -jn时,jn参数是对文件校验,会有read值和open值;
6.在执行vdbench时最终输出的summary文件会被上次的数据覆盖,最好是添加-o参数指定存放位置;
7.如果有多个场景测试且目录容量足够的情况下,请先执行预埋脚本,先预埋所有场景数据在将后续写相关脚本的format改为restart,读相关脚本format改为no;这样可以提升测试效率

联机测试-文件系统

ssh互信说明与手动执行

#互信注意点
1.只需要将主控端的公钥发送至从端即可
2.从端需全部挂载对应的目录
3.放置vdbench的目录路径需一致
#手动互信方式
ssh-keygen -f /root/.ssh/id_rsa -t rsa -P ''
ssh-copy-id -i /root/.ssh/id_rsa.pub <host1_name>
ssh-copy-id -i /root/.ssh/id_rsa.pub <host2_name>
ssh互信脚本脚本
#!/bin/bash
#较多node场景使用;注意:依赖sshpass包
PASS="redhat"
#设置网段最后的地址
END="160"
NET_name="eth0"
IP="$(ip a s "$NET_name" | awk -F'[ /]+' 'NR==3{print $3}')"
Segment=${IP%.*}.

#环境清理
rm -rf /root/.ssh/id_rsa
#生成可连通的主机列表
[ -e /root/SCANIP.log ] && echo "" > /root/SCANIP.log || touch /root/SCANIP.log
for((i=140;i<="$END";i++));do
ping -c1 -w1 "$Segment""$i" &>/dev/null && echo  "$Segment""$i" >/root/SCANIP.log &
done
#删除空行
sed -Ei "/^$/d" /root/SCANIP.log
#生成ssh_key的rsa文件
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
#拷贝公钥
while read -a line ;do
        sshpass -p "$PASS" ssh-copy-id -i  root@"$line"
        done</root/SCANIP.log

#!/bin/bash
#较少node场景下使用,注意:依赖sshpass包
PASS="Huawei12#$"
IP_list=(
10.0.0.150
10.0.0.152
)
#环境清理
rm -rf /root/.ssh/id_rsa
#生成ssh_key的rsa文件
ssh-keygen -f /root/.ssh/id_rsa -t rsa -P ''
#拷贝公钥
for i in "${IP_list[@]}";do
sshpass -p "$PASS" ssh-copy-id -i root@"$i"
done
范例脚本
#联机测试16K场景100%写
hd=default,vdbench=/root/vdbench,user=root,shell=ssh
hd=hd1,system=XX
hd=hd2,system=XX
fsd=fsd1,anchor=/testdir_1,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fsd=fsd2,anchor=/testdir_2,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fsd=fsd3,anchor=/testdir_3,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fsd=fsd4,anchor=/testdir_4,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fwd=format,xfersize=16k,threads=64
fwd=fwd1,fsd=fsd*,host=(hd1,hd2),operation=write,xfersize=16k,fileio=random,fileselect=random,threads=64
rd=rd1,fwd=fwd*,fwdrate=max,format=yes,elapsed=300,interval=1
#联机测试16K场景100%读
hd=default,vdbench=/root/vdbench,user=root,shell=ssh
hd=hd1,system=XX
hd=hd2,system=XX
fsd=fsd1,anchor=/testdir_1,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fsd=fsd2,anchor=/testdir_2,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fsd=fsd3,anchor=/testdir_3,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fsd=fsd4,anchor=/testdir_4,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fwd=format,xfersize=16k,threads=64
fwd=fwd1,fsd=fsd*,host=(hd1,hd2),operation=read,xfersize=16k,fileio=random,fileselect=random,threads=64
rd=rd1,fwd=fwd*,fwdrate=max,format=no,elapsed=300,interval=1
#联机测试16K场景70%读30%写
hd=default,vdbench=/root/vdbench,user=root,shell=ssh
hd=hd1,system=XX
hd=hd2,system=XX
fsd=fsd1,anchor=/testdir_1,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fsd=fsd2,anchor=/testdir_2,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fsd=fsd3,anchor=/testdir_3,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fsd=fsd4,anchor=/testdir_4,depth=3,width=8,files=1000,size=16K,openflags=o_direct,shared=yes
fwd=format,xfersize=16k,threads=64
fwd=fwd1,fsd=fsd*,host=(hd1,hd2),rdpct=70,xfersize=16k,fileio=random,fileselect=random,threads=64
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=300,interval=1

测试注意点

1.shared=yes,会增加互信时目录检测次数,但如果设置为NO,vdbench就不会对相同文件进行读写,如果希望更贴近真实读写数据时请设置为YES;
2.host参数不可以类似fsd使用通配符"*|-",只可以使用"(fsd1,fds2)”的方式增加;
3.挂载选项推荐增加 vers=3,wsize=XXX,rsize=XXX 这些参数;
4.启动进程后可以到从端执行ps -ef|grep java查看是否有java-clent进程启动;
5.shared=yes与format=yes不可共存;当shared=yes时,format只可以选择no或restart
6.如果有多个场景测试且目录容量足够的情况下,请先执行预埋脚本,先预埋所有场景数据在将后续写相关脚本的format改为restart,读相关脚本format改为no;这样可以提升测试效率

输出结果

界面参数说明

interval:报告间隔序号
ReqstdOps是指每秒读的次数(一次读的大小是配置文件配置的xfersize=8k)
I/O rate:每秒观察到的平均 I/O 速率
MB sec:传输的数据的平均 MB 数
bytes I/O:平均数据传输大小
read pct:平均读取百分比
resp time:以读/写请求持续时间度量的平均响应时间。所有 vdbench 时间都以毫秒为单位。
resp max:在此间隔中观察到的最大响应时间。最后一行包含最大值总数。
resp stddev:响应时间的标准偏差
cpu% sys+usr:处理器繁忙 = 100(系统 + 用户时间)(Solaris、Windows、Linux)
cpu% sys:处理器利用率:系统时间
open :打开文件数
close :关闭文件数
rmdir:删除文件夹数
create:创建文件数
mkdir:创建文件夹数
delete:删除文件数

日志存放路径

在没有使用`-o`参数时,默认路径为../vdbench/output/summary.html下存放
output下其余文件说明:
(1)errorlog.html——当为测试启用了数据验证(-jn)时,它可包含一些数据块中的错误的相关信息:
无效的密钥读取
无效的 lba 读取(一个扇区的逻辑字节地址)
无效的 SD 或 FSD 名称读取
数据损坏,即使在使用错误的 lba 或密钥时
数据损坏
坏扇区
(2)flatfile.html——包含 vdbench 生成的一种逐列的 ASCII 格式的信息。
(3)histogram.html——一种包含报告柱状图的响应时间、文本格式的文件。
(4)logfile.html——包含 Java 代码写入控制台窗口的每行信息的副本。logfile.html 主要用于调试用途
(5)parmfile.html——显示已包含用于测试的每项内容的最终结果
(6)resourceN-M.html、resourceN.html、resourceN.var_adm_msgs.html
摘要报告、stdout/stderr 报告、主机 N 的摘要报告
最后 “nn” 行文件 /var/adm/messages 和 /var/adm/messages。每个 M 个 JVM/Slave 的目标主机 N 和主机 N 上为 0。
(7)sdN.histogram.html、sdN.html——每个 N 存储定义的柱状图和存储定义 “N” 报告。
(8)swat_mon.txt,swat_mon_total.txt
vdbench 与 Sun StorageTekTM Workload Analysis Tool (Swat) Trace Facility (STF) 相结合,支持重放使用 Swat 创建的一个轨迹的 I/O 工作负载。
Swat 使用 Create Replay File 选项创建和处理的轨迹文件会创建文件 flatfile.bin(flatfile.bin.gz 用于 vdbench403 和更高版本),其中包含 Swat 所识别的每个 I/O 操作的一条记录。
这些文件包含一个格式化的报告,可将该报告导入 Swat Performance Monitor (SPM) 中来创建性能图表。
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 对于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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值