Linux性能优化——常用命令总结

Linux 性能优化 -- 常用命令总结

【1】uptime

功能,查看机器的启动时间、登录用户、平均负载等情况,通常用于确定操作系统的重启时间;

[root@VM_0_3_centos src]# uptime
13:01:52 up 46 days, 22:03, 4 users, load average: 0.13, 0.08, 0.05
结果分析
    当前时间,13:01:52
    系统已经运行的时间,43 天 22 小时 3 分钟
    前在线用户,4 个用户,是总连接数量,不是不同用户数量 (开一个终端连接就算一个用户)
    系统平均负载,0.13,0.08,0.05,为最近 1 分钟、5 分钟、15 分钟的系统负载情况

系统的平均负载是指在特定的时间间隔内队列中运行的平均进程数;

如果一个进程满足以下条件,就会位于运行队列中

1. 它没有在等待 I/O 操作的结果

2. 它没有主动进入等待状态 (即没有调用’wait'相关的系统 API)

3. 没有被停止

如果每个 CPU 内核的当前活动进程数不大于 3,则系统的性能可以支持

如果每个 CPU 内核的任务数大于 5,那么这台机器的性能有严重问题

如果 linux 主机是 1 个双核 CPU,当 Load Average 为 6 的时候说明机器已经被充分使用了

load 值分析

load < 0.7 时,系统很闲,要考虑多部署一些服务

0.7 < load < 1 时,系统状态不错

load == 1 时,系统马上要处理不多来了,赶紧找一下原因

load > 5 时,系统已经非常繁忙

1) 1 分钟 load > 5,5 分钟 load < 3,15 分钟 load < 1 短期内繁忙,中长期空闲,初步判断是一个抖动或者是拥塞前兆

2) 1 分钟 load > 5,5 分钟 load > 3,15 分钟 load < 1短期内繁忙,中期内紧张,很可能是一个拥塞的开始

3) 1 分钟 load > 5,5 分钟 load > 5,15 分钟 load > 5 短中长期都繁忙,系统正在拥塞

4) 1 分钟 load < 1,5 分钟 Load > 3,15 分钟 load > 5 短期内空闲,中长期繁忙,系统拥塞正在好转

【2】pidstat

功能,用于监控全部或指定的进程占用系统资源的情况,包括 CPU、内存、磁盘 I/O、进程切换、线程数等数据;

-u,表示查看 cpu 相关的性能指标

-w,表示查看上下文切换情况

-t,查看线程相关的信息,默认是进程的;

常与 -w 结合使用 (cpu 的上下文切换包括进程的切换、线程的切换、中断的切换)

-d,表示磁盘 I/O 统计数据

-p,指明进程号

命令格式,pidstat [option] interval [count]
 
# 输出 CPU 的使用信息 -u
03:48:12 PM 	UID 	PID 	%usr 	%system 	%guest 	%CPU 	CPU 	Command
03:48:12 PM   	0 		24615 	0.00 	0.00 		0.00 	0.00 	0 		nginx
 
CPU 信息
• %usr 		#用户层任务正在使用的 CPU 百分比
• %system 	#系统层正在执行的任务的 CPU 使用百分比
• %guest 	#运行虚拟机的 CPU 占用百分比
• %CPU 		#所有的使用的 CPU 的时间百分比
• CPU 		#处理器数量
• Command 	#命令
 
# 输出内存的使用信息 -r
03:48:12 PM 	UID PID 	minflt/s 	majflt/s 	VSZ 	RSS 	%MEM 	Command
03:48:12 PM 	0 	24615 	0.00 		0.00 		58252 	24940 	1.32 	nginx
 
内存信息
• PID 		#进程号
• minflt/s 	#每秒次缺页错误次数(minor page faults)
			#缺页错误次数即虚拟内存地址映射成物理内存地址产生的 page fault 次数
• majflt/s 	#每秒主缺页错误次数(major page faults)
			#当虚拟内存地址映射成物理内存地址时,相应的 page 在 swap 中,
                这样的 page fault 为 major page fault,一般在内存使用紧张时产生
• VSZ 		#该进程使用的虚拟内存(以 kB 为单位)
• RSS 		#该进程使用的物理内存(以 kB 为单位)
• %MEM 		#当前任务使用的有效内存的百分比
• Command 	#任务的命令名
 
# 输出磁盘 I/O 的使用信息 -d
03:48:12 PM 	UID 	PID 	kB_rd/s 	kB_wr/s 	kB_ccwr/s 	Command
03:48:12 PM 	0 		24615 	0.07 		0.00 		0.00 		nginx
 
磁盘 I/O
• PID 		#进程号
• kB_rd/s 	#每秒此进程从磁盘读取的千字节数
• kB_wr/s 	#此进程已经或者将要写入磁盘的每秒千字节数
• kB_ccwr/s #由任务取消的写入磁盘的千字节数
• Command 	#命令的名字
 
# 输出上下文切换的信息 -w
03:20:54 PM 	UID 	PID 	cswch/s 	nvcswch/s 	Command
03:20:54 PM 	0 		24615 	0.03 		0.00 		nginx
 
上下文切换
• PID 		#PID 号
• cswch/s 	#每秒自动上下文切换
• nvcswch/s #每秒非自愿的上下文切换
• Command 	#命令

【3】free

功能,用于显示系统内存的使用情况,包括总体内存、己经使用的内存,系统内核使用的缓冲区,包括缓冲(buffer) 和缓存(cache);

[root@VM_0_3_centos ~]# free
		total 	used 	free 	shared 	buff/cache 	available
Mem: 	1882356 994348 	78308 	548 	809700 		679524
Swap: 	8191996 473600 	7718396
1. Mem 行,内存的使用情况
2. Swap 行,交换空间的使用情况
• total 列显示系统总的可用物理内存和交换空间大小
• used 列显示已经被使用的物理内存和交换空间
• free 列显示还有多少物理内存和交换空间可用使用
• shared 列显示被共享使用的物理内存大小
• buff/cache 列显示被 buffer 和 cache 使用的物理内存大小
• available 列显示还可以被应用程序使用的物理内存大小

free 与 available 的区别

free 是真正尚未被使用的物理内存数量;

available 是从应用程序的角度看到的可用内存数量;

Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,即 buffer 和 cache;对于内核来说,buffer 和 cache 都属于已经被使用的内存;当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求;

从应用程序的角度来说,available = free + buffer + cache;

Buffer 与 Cache

1、Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的;

它的引入是为了减小短期内突发 I/O 的影响,起到流量整形的作用;

比如生产者——消费者问题,由于产生和消耗资源的速度大体接近,加一个 buffer 可以抵消掉资源刚产生/消耗时的突然变化;

2、Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略;

因为 CPU 和 memory 之间的速度差异越来越大,通过充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响;

【4】vmstat

此命令显示关于内核线程、虚拟内存、磁盘 I/O 、陷阱和 CPU 占用率的统计信息;

[root@VM_0_3_centos ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd 	free 	buff 	cache 	si 	so 	bi 	bo 	in 	cs 	us 	sy 	id 	wa 	st
4 0 473600 	77560 	60640 	749436 	0 	0 	51 	56 	2 	8 	2 	2 	92 	4 	0
• buff,I/O 系统存储的磁盘块文件的元数据的统计信息
• cache,操作系统用来缓存磁盘数据的缓冲区
	操作系统会自动一调节这个参数,在内存紧张时操作系统会减少 cache 的占用空间来保证其他进程可用
• cs,线程环境的切换次数,此数据太大时表明线程的同步机制有问题
• si 和 so 较大时,说明系统频繁使用交换区,应该查看操作系统的内存是否够用
• bi 和 bo 代表 I/O 活动,根据其大小可以知道磁盘 I/O 的负载情况

【5】mpstat

功能,用于实时监控系统 CPU 的一些统计信息,这些信息存放在 /proc/stat 文件中,在多核 CPU 系统里,不但能查看所有 CPU 的平均使用信息,还能查看某个特定 CPU 的信息;

命令格式,mpstat [-P {cpu|ALL}] [internal [count]]
当 mpstat 不带参数时,输出为从系统启动以来的平均值
 
[root@VM_0_3_centos ~]# mpstat -P ALL
Linux 3.10.0-957.5.1.el7.x86_64 (VM_0_3_centos) 08/22/2019 _x86_64_ (1CPU) 
05:00:44 PM CPU 	%usr 	%nice 	%sys 	%iowait %irq %soft 	%steal 	%guest 	%gnice 	%idle
05:00:44 PM all 	1.67 	0.00 	1.65 	4.21 	0.00 0.02 	0.00 	0.00 	0.00 	92.45
05:00:44 PM 0 		1.67 	0.00 	1.65 	4.21 	0.00 0.02 	0.00 	0.00 	0.00 	92.45
 
命令参数
	-P {cpu l ALL} 表示监控哪个 CPU,cpu 在 [0, cpu 个数 - 1] 中取值
	internal 相邻的两次采样的间隔时间
	count 采样的次数,count 只能和 internal 一起使用
输出参数
	当没有参数时,mpstat 则显示系统启动以后所有信息的平均值;
	有 interval 时,第一行的信息为自系统启动以来的平均信息;从第二行开始,输出为前一个 interval 时间段的平均信息;
输出各参数含义
参数 	释义 																	从/proc/stat 获得数据
CPU 	处理器 ID
%usr	在 internal 时间段里,用户态的 CPU 时间(%),不包含 nice 值为负进程 	    usr/total*100
%nice 	在 internal 时间段里,nice 值为负进程的 CPU 时间(%) 					    nice/total*100
%sys 	在 internal 时间段里,核心时间(%) 									    system/total*100
%iowait 在 internal 时间段里,硬盘 IO 等待时间(%) 							    iowait/total*100
%irq 	在 internal 时间段里,硬中断时间(%) 									irq/total*100
%soft 	在 internal 时间段里,软中断时间(%) 									softirq/total*100
%steal 	显示虚拟机管理器在服务另一个虚拟处理器时虚拟 CPU 处在非自愿等待下花费时间的百分比 steal/total*100
%guest 	显示运行虚拟处理器时 CPU 花费时间的百分比 								   
 guest/total*100
%gnice 																			  gnice/total*100
%idle 	在 internal 时间段里,CPU 除去等待磁盘 IO 操作外的因为任何原因而空闲的时间闲置时间(%)  idle/total*100

【6】iostat

功能,用于监控 CPU 占用率、平均负载值及 I/O 读写速度等;

[root@VM_0_3_centos ~]# iostat
Linux 3.10.0-957.5.1.el7.x86_64 (VM_0_3_centos) 08/22/2019 _x86_64_ (1CPU)
avg-cpu: 	%user 	%nice 	%system %iowait %steal 	%idle
			1.67 	0.00 	1.68 	4.21 	0.00 	92.45
Device: tps 	kB_read/s 	kB_wrtn/s 	kB_read 	kB_wrtn
vda 	8.81 	50.73 		56.14 		205202201 	227051208
scd0 	0.00 	0.00 		0.00 		314 		0
 
cpu 的统计信息,如果是多 cpu 系统,显示的所有 cpu 的平均统计信息
• %user,用户进程消耗 cpu 的比例
• %nice,用户进程优先级调整消耗的 cpu 比例
• %sys,系统内核消耗的 cpu 比例
• %iowait,等待磁盘 io 所消耗的 cpu 比例
• %idle,闲置 cpu 的比例(不包括等待磁盘 I/O)
 
磁盘的统计信息
• tps,该设备每秒的传输次数,"一次传输"意思是"一次 I/O 请求"
	多个逻辑请求可能会被合并为"一次 I/O 请求","一次传输"请求的大小是未知的
• kB_read/s,每秒从设备读取的数据量;
• kB_wrtn/s,每秒向设备写入的数据量;
• kB_read,读取的总数据量;
• kB_wrtn,写入的总数量数据量;
 
[root@VM_0_3_centos ~]# iostat -x
Linux 3.10.0-957.5.1.el7.x86_64 (VM_0_3_centos) 08/22/2019 _x86_64_ (1CPU)
avg-cpu: 	%user 	%nice 	%system %iowait %steal 	%idle
			1.67 	0.00 	1.68 	4.21 	0.00 	92.45
Device: rrqm/s 	wrqm/s 	r/s 	w/s 	rkB/s wkB/s avgrq-sz 	avgqusz await r_await 	w_await svctm 	%util
vda 	0.07 	6.22 	2.70 	6.11 	50.73 56.14 24.26 		0.18 	23.92 25.03 	23.44 	4.69 	4.13
scd0 	0.00 	0.00 	0.00 	0.00 	0.00  0.00 	7.14 		0.00 	0.86  0.86 		0.00 	0.86 	0.00
 
输出消息
• rrqm/s,每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
• wrqm/s,每秒对该设备的写请求被合并次数
• r/s,每秒完成的读次数
• w/s,每秒完成的写次数
• rkB/s,每秒读数据量(kB 为单位)
• wkB/s,每秒写数据量(kB 为单位)
• avgrq-sz,平均每次 IO 操作的数据量(扇区数为单位)
• avgqu-sz,平均等待处理的 IO 请求队列长度
• await,平均每次 IO 请求等待时间(包括等待时间和处理时间,毫秒为单位)
• svctm,平均每次 IO 请求的处理时间(毫秒为单位)
• %util,采样周期内用于 IO 操作的时间比率,即 IO 队列非空的时间比率

【7】swapon

功能,查看交互分区的使用情况

[root@VM_0_3_centos ~]# swapon -s
Filename 	Type Size 		Used 	Priority
/var/swap 	file 8191996 	473856 	-2

swap 分区,当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间;

【8】ifconfig

功能,用于查看机器挂载的网卡情况

参数
• add<地址> 设置网络设备 IPv6 的 IP 地址
• del<地址> 删除网络设备 IPv6 的 IP 地址
• down 关闭指定的网络设备
• <hw<网络设备类型><硬件地址> 设置网络设备的类型与硬件地址
• io_addr<I/O 地址> 设置网络设备的 I/O 地址
• irq<IRQ 地址> 设置网络设备的 IRQ
• media<网络媒介类型> 设置网络设备的媒介类型
• mem_start<内存地址> 设置网络设备在主内存所占用的起始地址
• metric<数目> 指定在计算数据包的转送次数时,所要加上的数目
• mtu<字节> 设置网络设备的 MTU
• netmask<子网掩码> 设置网络设备的子网掩码
• tunnel<地址> 建立 IPv4 与 IPv6 之间的隧道通信地址
• up 启动指定的网络设备
• -broadcast<地址> 将要送往指定地址的数据包当成广播数据包来处理
• -pointopoint<地址> 与指定地址的网络设备建立直接连线,此模式具有保密功能
• -promisc 关闭或启动指定网络设备的 promiscuous 模式
• [IP 地址] 指定网络设备的 IP 地址
• [网络设备] 指定网络设备的名称

$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
      inet 10.240.0.30 netmask 255.240.0.0 broadcast 10.255.255.255
      inet6 fe80::20d:3aff:fe07:cf2a prefixlen 64 scopeid 0x20<link>
      ether 78:0d:3a:07:cf:3a txqueuelen 1000 (Ethernet)
      RX packets 40809142 bytes 9542369803 (9.5 GB)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 32637401 bytes 4815573306 (4.8 GB)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
 
1. 网络接口的状态标志,ifconfig 输出中的 RUNNING 表示物理网络是连通的,即网卡已经连接到了交换机或者路由器中;
2. MTU 的大小,MTU 默认大小是 1500,根据网络架构的不同,可能需要调大或者调小 MTU 的数值;
3. 网络接口的 IP 地址、子网以及 MAC 地址
4. 网络收发的字节数、包数、错误数以及丢包情况,
    特别是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题
    errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;
    dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包;
    overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理 (队列满) 而导致的丢包;
    carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;
    collisions 表示碰撞数据包数

【9】ping

功能,用于检测网络故障的常用命令,可以用来测试一台主机到另外一台主机的网络是否连通

语法
ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或 IP 地址]
• -d 使用 Socket 的 SO_DEBUG 功能
• -c<完成次数> 设置完成要求回应的次数
• -f 极限检测
• -i<间隔秒数> 指定收发信息的间隔时间
• -I<网络接口> 使用指定的网络接口送出数据包
• -l<前置载入> 设置在送出要求信息之前,先行发出的数据包
• -n 只输出数值
• -p<范本样式> 设置填满数据包的范本样式
• -q 不显示指令执行过程,开头和结尾的相关信息除外
• -r 忽略普通的 Routing Table,直接将数据包送到远端主机上
• -R 记录路由过程
• -s<数据包大小> 设置数据包的大小
• -t<存活数值> 设置存活数值 TTL 的大小
• -v 详细显示指令的执行过程

连通性和延时测试
 
# -c3 表示发送三次ICMP包后停止
$ ping -c3 114.114.114.114
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1 ttl=54 time=244 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=47 time=244 ms
64 bytes from 114.114.114.114: icmp_seq=3 ttl=67 time=244 ms
 
--- 114.114.114.114 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 244.023/244.070/244.105/0.034 ms
 
    ping 目标主机的域名和 IP (ping 会自动将域名转换为 IP)
    不带包头的包大小和带包头的包大小
    icmp_seq,ping 序列,从 1 开始;如果数字不是按顺序递增即意味着产生丢包
    ttl,剩余的 ttl;
    time,响应时间,数值越小,连通速度越快;
    发出去的包数,返回的包数,丢包率,耗费时间;
    最小/最大/平均响应时间和本机硬件耗费时间;
 
TTL,每经过一个‘路由点‘,就把预先设定的这个 TTL 数值减 1,直到最后 TTL=1 时报文就被扔掉,不向下转发; 
ping 显示的 TTL 是指,被 ping 主机那里返回的报文,到达用户端,从预设的 TTL 减小到还剩下多少;

【10】nc

功能,验证服务器端口有没有开发

参数
-l 用于指定 nc 将处于侦听模式;指定该参数,则意味着 nc 被当作 server,侦听并接受连接,而非向其它地址发起连接
-s 指定发送数据的源 IP 地址,适用于多网卡机
-u 指定 nc 使用 UDP 协议,默认为 TCP
-v 输出交互或出错信息
-w 超时秒数,后面跟数字
 
命令示例
nc -l 9999 # 开启一个本地 9999 的 TCP 协议端口,由客户端主动发起连接,一旦连接必须由服务端发起关闭
nc -vw 2 129.204.197.215 11111 # 通过 nc 去访问 129.204.197.215 主机的 11111 端口,确认是否存活;
nc -ul 9999 # 开启一个本地 9999 的 UDP 协议端口,由服务端主动发起关闭
nc 129.204.197.215 9999 < test # 通过 129.204.197.215 的 9999 TCP 端口发送数据文件
nc -l 9999 > zabbix.file # 开启一个本地 9999 的 TCP 端口,用来接收文件内容

【11】nslookup

功能,检测网络中 DNS 服务器能否正确解析域名并且可以输出

【12】mtr

功能,Linux 系统中的网络连通性测试工具,也可以用来检测丢包率

【13】traceroute

功能,提供从用户的主机到互联网另一端的主机的路径,虽然每次数据包由同一出发点到达同一目的地的路径可能会不一样,但通常来说大多数情况下路径是相同的;

【14】sar

功能,输出每秒的网卡存取速度

【15】netstat/ss

功能,用于显示网络连接、端口信息等

# head -n 3 表示只显示前面3行
# -l 表示只显示监听套接字
# -n 表示显示数字地址和端口(而不是名字)
# -p 表示显示进程信息
$ netstat -nlp | head -n 3
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      840/systemd-resolve
 
# -l 表示只显示监听套接字
# -t 表示只显示 TCP 套接字
# -n 表示显示数字地址和端口(而不是名字)
# -p 表示显示进程信息
$ ss -ltnp | head -n 3
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port
LISTEN   0         128           127.0.0.53%lo:53               0.0.0.0:*        users:(("systemd-resolve",pid=840,fd=13))
LISTEN   0         128                 0.0.0.0:22               0.0.0.0:*        users:(("sshd",pid=1459,fd=3))
 
接收队列 (Recv-Q) 和发送队列 (Send-Q)
    通常应该是 0,当它们不是 0 时,说明有网络包的堆积发生
    当套接字处于连接状态 (Established)时,
        Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数 (即接收队列长度)
        Send-Q 表示还没有被远端主机确认的字节数 (即发送队列长度)
    当套接字处于监听状态 (Listening)时,
        Recv-Q 表示全连接队列的长度
        Send-Q 表示全连接队列的最大长度
 
所谓全连接,是指服务器收到了客户端的 ACK,完成了 TCP 三次握手,然后就会把这个连接放到全连接队列中;
    这些全连接中的套接字需要被 accept() 系统调用取走,服务器才可以开始真正处理客户端的请求
所谓半连接是指还没有完成 TCP 三次握手的连接,连接只进行了一半,服务器收到了客户端的 SYN 包后,
    就会把这个连接放到半连接队列中,然后再向客户端发送 SYN + ACK 包

【16】nmap

功能,扫描某一主机打开的端口及端口提供的服务信息,通常用于查看本机有哪些端口对外提供服务,或者服务器有哪些端口对外开放

示例
nmap localhost 						#查看主机当前开放的端口
nmap -p 1024-65535 localhost 		#查看主机端口(1024-65535)中开放的端口
nmap -PS 192.168.56.101 			#探测目标主机开放的端口
nmap -PS22,80,3306 192.168.56.101 	#探测所列出的目标主机端口
nmap -O 192.168.56.101 				#探测目标主机操作系统类型
nmap -A 192.168.56.101 				#探测目标主机操作系统类型

【17】ethtool

功能,用于查看网卡的配置情况

命令使用格式 ethtool [option] interface

使用示例
 
(1)查看网卡的接口信息
ethtool eth1     #查看网络接口 eth1 的信息
(2)关闭网卡 eth1 的自动协商
ethtool -s eth1 autoneg off
(3)修改网卡速率为 100Mb/s
ethtool -s eth4 speed 100
(4)查看网卡驱动信息
ethtool -i eth0
(5)查看网卡的一些工作统计信息
ethtool –S eth0
(6)停止和查看网卡的发送模块 TX 的状态
ethtool -A tx off eth0      #修改 tx 的状态
ethtool -a eth0             #查看 tx 的状态
(7)关闭网卡对收到的数据包的校验功能
ethtool -K rx off eth0      #关闭校验
ethtool –k eth0             #查看校验启动状态
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值