0%

项目服务器和应用的流量、性能、投资风险与回报等各项运维指标

投资、风险与回报

ROI(Return On Investment):投资回报率,指通过投资而应返回的价值,具有时效性。可以理解为转化率,计算公式:年利润(或年均利润)/ 投资总额 * 100%

GTV(Gross Transaction Volume):交易成交总额,一般中介性质的服务平台用其作为评价指标,比如美团。计算公式:成交总额 + 退货订单总额(一般不会扣除) + 其它一些抵减项(即使用原价)。GTV的含金量比GMV高,但是要注意的是,对于美团这样的平台,GTV并不是其实际收入,因为商品是商家提供的,客户支付给商家而中介赚取的是抽成部分

GMV(Gross Merchandise Volume):商品销售总额(一段时间内),即流水,一般把取消的订单也算进去,所以导致流水是有水分的。一般是电商平台(比如京东商城.,其包括了未支付或取消的订单)用于衡量平台竞争力(市场占有率)的核心指标,计算公式:成交总额 + 取消订单总额 + 拒收订单总额 + 退货订单总额 + 未支付订单总额。GMV相比GTV更具实时性,可用来研究客户的购买意向

ARPU(Average Revenue Per User):每用户平均收益,指一个时期内(通常为月或年),平均每个用户贡献的业务收入。计算公式:总收入 / 总用户数,注意总用户数包括了未付费的用户

ARPPU(Average Revenue Per Paying User):每付费用户平均收益,类似ARPU,但ARPPU只统计时间内的所有付费用户。计算公式:总收入 / 总付费用户

流量指标

PV(Page View):页面访问量,每打开一个页面记录一次

PVPU(Page Views Per User):每个访问者的页面访问量

DV(Site Visit Depth):页面访问深度,访问者在一次完整的站点访问过程中所浏览的页面数,可用于衡量用户粘性

Visits Per Visitor:平均访问次数,一定统计时间内,平均每个用户的访问次数

用户量衡量指标

UV(Unique Visitor):访客数,独立访问者数量

RV(Repeat Visitors):重复访问者数量

NV(New Visitors):新访客数

新访客比例:新房客数与访客数的比,即NV / UV

DAU(Daily Active User):每日活跃用户数量

WAU(Weekly Active Users):每周活跃用户数

MAU(Month Active Users):每月活跃用户数量

IP(Internet Protocol):独立IP数

Session:会话数目

Visits:访问次数,用户在网站上的Session(会话)次数

页面质量衡量指标

跳出率一般用来衡量网站Loading Page(入口页面或者说首页)的内容质量,而退出率则衡量每个页面的内容质量。

跳出率(Bounce Rate)

只仅访问单个页面就离开(一般是入口页面,即首页)的访问量与总访问量的比。可用于衡量访问质量,指导优化站点,跳出率越高说明该页面(一般为首页)对访问者的吸引力低

退出率(Exit Rate)

从某页面离开网站的访问量与访问了该页面的访问量的比

平均访问时长(Average Time on Site)

一定统计时间内,用户在一个页面或整个网站逗留的总时间与访问该页面或整个网站次数的比(即总逗留时间 / 总访问次数)

平均访问页数(Average Number of Pages Visited)

一定统计时间内,访问量与访问次数的比,即PV / Visits

流量转化指标(Conversion Rate)

使用转化率,其计算公式为:转化次数 / 访问次数。

其中转化次数,指的是网站运营者期望用户完成的动作次数,比如说:对于商城,用户执行一次购买行为即是一次转化动作

性能指标

对于单用户无并发的系统,使用响应时间(RT)来作为度量系统的性能指标,是合理且准确的。

对于多用户并发系统通常使用吞吐量(Throughput)来作为系统性能指标。

需要注意的是RT或Throughput的高低,并不能直接反映出软件系统的性能高低,需要根据实际情景以及用户的接受程度来进行评估,比如说对于游戏、交易系统等,它们对于用户体验的响应速度要求并不一样。

并发数指标

OU(Online Users):在线用户数

CU(Concurrent Users):并发用户数,系统在能正常运作范围之内,可同时承载的用户总量,在一些性能测试工具中,一般称为虚拟用户数(Virtual User,VUser)。可以把并发用户数理解为,并发请求量,即同时可并发执行的请求数目

VUser(Virtual User):虚拟用户数,性能测试工具模拟的并发用户数,一般情况下,大型系统(业务量大、机器多)做压力测试,10000~50000个用户并发,中小型系统做压力测试,5000个用户并发比较常见

SBC(Simultaneous Browser Connections):并发连接数,即每秒的TCP连接数

响应时间(RT,Response Time)

RT还有另一个叫法,TTLB(Time To Last Byte,最后一个字节的时间),它们含义相同,都是指从发起一个请求开始,到客户端接收到的最后一个字节所花费的时间,即系统对一次请求作出响应的时间,其大小可直接反映出系统的速度,另外在分析时一般采用平均响应时间。 如果以客户端 + 服务器 + 数据库服务器架构来看,响应时间可以分解为以下几部分:

网络传输时间:N1 + N2 + N3 + N4(各分量分别为客户端->服务器、服务器->数据库服务器、数据库服务器->服务器、服务器->客户端)

应用处理时间:A1 + A2 + A3(各分量分别为服务器在执行数据库查询前的处理时间、数据库服务器处理时间、服务器在执行完数据库查询之后的处理)

参考标准(来自:阿里云 - 测试指标):

不同行业不同业务可接受的响应时间是不同的,一般情况,对于在线实时交易:

  • 互联网企业:500毫秒以下,例如淘宝业务10毫秒左右。
  • 金融企业:1秒以下为佳,部分复杂业务3秒以下。
  • 保险企业:3秒以下为佳。
  • 制造业:5秒以下为佳。

对于批量交易:

  • 时间窗口:即整个压测过程的时间,不同数据量则时间不一样,例如双11和99大促,数据量级不一样则时间窗口不同。大数据量的情况下,2小时内可完成压测。

吞吐量(Throughput)

吞吐量(Throughput)为单位时间内成功传输数据的总量,一般使用以下几种指标(可适用于不同的分析情景)

参考标准(来自:阿里云 - 测试指标):

无论TPS、QPS、HPS,此指标是衡量系统处理能力非常重要的指标,越大越好,根据经验,一般情况下:

  • 金融行业:1000 TPS~50000 TPS,不包括互联网化的活动。
  • 保险行业:100 TPS~100000 TPS,不包括互联网化的活动。
  • 制造行业:10 TPS~5000 TPS。
  • 互联网电子商务:10000 TPS~1000000 TPS。
  • 互联网中型网站:1000 TPS~50000 TPS。
  • 互联网小型网站:500 TPS~10000 TPS。

QPS/RPS(次/秒)

QPS(Queries Per Second):每秒查询次数(fetches/sec)

RPS(Requests Per Second):每秒请求次数(requests/sec)

QPS和RPS是同等含义的,即服务器每秒执行客户端请求成功的次数

QPS从数据库的概念中来,即每秒执行查询的条数(不包括插入、更新和删除操作),被引入了压力测试指标中来

TPS(笔/秒)

TPS(Transactions Per Second):每秒事务数,即服务器每秒处理的事务数(事务以笔为单位)。客户端在执行一个事务的时候,可能需要向服务器发起多起请求,即一个事务的起点到结束,是从事务的第一个请求发起到最后一个请求响应成功为止。

HPS(次/秒)

HPS(Hits Per Second):每秒点击次数,即通过用户点击发起的请求次数。

TPS、QPS与HPS的关系

TPS统计的是事务次数、QPS统计的是请求次数、HPS统计的是点击次数,一个事务可能会有多个请求,所以QPS比TPS粒度更小。如果某些业务有且仅有一个请求,那么这时候TPS = QPS = HPS。

一般情况下用TPS来衡量整个业务流程,用QPS来衡量接口查询次数,用HPS来表示对服务器单击请求。

评估方式

QPS粒度更细,下面主要以QPS为例

1. 使用VU与RT进行换算

参考(来自:阿里云 - 测试指标):

  • 简单例子:在术语中解释了TPS是每秒事务数,但是事务是要靠虚拟用户做出来的,假如1个虚拟用户在1秒内完成1笔事务,那么TPS明显就是1;如果某笔业务响应时间是1 ms,那么1个用户在1s内能完成1000笔事务,TPS就是1000了;如果某笔业务响应时间是1s,那么1个用户在1s内只能完成1笔事务,要想达到1000 TPS,至少需要1000个用户;因此可以说1个用户可以产生1000 TPS,1000个用户也可以产生1000 TPS,无非是看响应时间快慢。

  • 复杂公式: 试想一下复杂场景,多个脚本,每个脚本里面定义了多个事务(例如一个脚本里面有100个请求,我们把这100个连续请求叫做Action,只有第10个请求,第20个请求分别定义了事务10和事务20)具体公式如下。

    符号代表意义:

    • Vui表示的是第i个脚本使用的并发用户数。
    • Rtj表示的是第i个脚本第j个事务花费的时间,此时间会影响整个Action时间。
    • Rti表示的是第i个脚本一次完成所有操作的时间,即Action时间。
    • n表示的是第n个脚本。
    • m表示的是每个脚本中m个事务。
    • 那么第j个事务的TPS = Vui/Rti。

2. 使用日PV量根据二八原则进行换算

利用二八原则既是认为每天80%的流量集中在每天20%的时间(峰值时间)中

根据QPS估算需要多少台机器

系统吞吐量

一般使用一段时间范围的总吞吐量,例如:系统每日吞吐量=TPS * 24 * 3600,这里的TPS一般选其峰值

参考(来自:阿里云 - 并发用户、RPS、TPS的解读):

针对服务器端的性能,以TPS为主来衡量系统的性能,并发用户数为辅来衡量系统的性能,如果必须要用并发用户数来衡量的话,需要一个前提,那就是交易在多长时间内完成,因为在系统负载不高的情况下,将思考时间(思考时间的值等于交易响应时间)加到串联链路中,并发用户数基本可以增加一倍,因此用并发用户数来衡量系统的性能没太大的意义。同样的,如果系统间的吞吐能力差别很大,那么同样的并发下TPS差距也会很大。

成功失败指数

SR(Success Rate):成功率

FR(Failure Rate):失败率

Successful Rounds:成功的请求

Failed Rounds:失败的请求

Successful Hits:成功的点击次数

Failed Hits:失败的点击次数

Successful Hits Per Second:每秒成功的点击次数

Failed Hits Per Second:每秒失败的点击次数

Attempted Connections:尝试链接数

资源指标

CPU

CPU基础参数

在Linux中,CPU的参数记录在/proc/cpuinfo中,可以通过lscpu命令来查看

确定方法补充描述
物理CPU个数physical id条目的行数包括下面几个参数都是从/proc/cpuinfo中提取
每个物理CPU的核心(core)数目每个CPU的cpu cores字段
逻辑CPUprocessors如果物理CPU支持超线程技术,那么该CPU的逻辑CPU数目是核心数目乘以超线程数(一般是两倍)
BogoMIPSMIPS即Millions of Instructions per Second(百万条指令每秒),Linux在启动的时候会calibrate_delay函数来粗略评估CPU性能,其记录的就是处理器在给定时间内忙循环执行的次数记录在/proc/cpuinfo中,可以通过lscpu查看

CPU Cache

这里以lscpu的输出命名

描述
L1d cache一级数据缓存
L2i cache一级指令缓存
L2 cache二级缓存
L3 cache三级缓存

系统负载(System Load)

系统负载(System Load)也就是CPU Load(CPU负载),其用来度量服务器工作量大小,即CPU的可执行任务队列(active_tasks)长度,越长说明负载越高,表明正在运行以及待运行的任务(可执行态,R、TASK_RUNNING)越多。

CPU负载的最大值是CPU的核心数目,是一个浮点数。

举个例子,如果服务器使用单核CPU,CPU负载为1的话即表示满负载,即100%,而如果使用8核CPU,CPU Load为8才是满负载。

平均系统负载(Load Average)

在Linux中,一般采用平均系统负载(Load Average)来进行度量,即系统在一段时间内的平均负载,并且参与统计的不仅是可执行态进程(R、TASK_RUNNING)还包括了不可中断睡眠态进程(D、TASK_UNINTERRUPTIBLE),其计算公式如下: 对于处于不可中断睡眠态(D、TASK_UNINTERRUPTIBLE)的进程,其一般都I/O密集型程序在进行I/O等待(比如:外存、网络或其它设备的I/O等待),也就是说在Linux中,平均系统负载(Load Average)体现的是系统整体的负载,不仅仅是CPU的负载,除此之外,还包括了外存、网络以及其它设备的负载。

在Linux中,Load Average会记录在/proc/loadavg中,也可以通过top、toptop、vmstat、uptime、w等命令来查看

Linux会维护三个时间段内的Load Average,并记录到/proc/loadavg中,即一分钟内、五分钟内和十五分钟内的平均系统负载(Load Average),一般分别表示为load1load5load15.

平均系统负载(Load Average)分析方式

首先看load15,如果load15不高,说明系统没有长期处于高负载状态,否则继续观察load5和load1,来看系统负载是否有下降的趋势。

load1load5load15系统负载状态判断
繁忙空闲空闲短期内繁忙,中、长期空闲,可能是一个“抖动”或者是“拥塞前兆”
繁忙繁忙空闲短期内繁忙,中期紧张,可能是“拥塞的开始”
繁忙繁忙繁忙短、中、长期都繁忙,系统“正在拥塞”
空闲繁忙繁忙拥塞正在好转

CPU Util(CPU Utilization Rate、CPU使用率)

可以使用vmstat等工具来查看CPU的时间片状况:

状态CPU时间片描述
BusySystem Time
(系统内核态运行时间)
System Time
(sys)
内核态运行时间百分比
SoftIRQ Time
(si)
软中断时间百分比
HardIRQ Time
(hi)
硬中断时间百分比
User Time
(用户态运行时间)
User Time
(us)
用户态未改变过优先级的进程占用CPU百分比
Nice Time
(ni)
用户态改变过优先级的进程占用CPU百分比
Steal Time
(被抢占时间)
Steal Time
(st)
虚拟化时,虚拟机进程在物理CPU上等待其CPU时间的时间百分比(可以理解未被其它虚拟机抢占的时间百分比)
FreeIdle Time
(空闲时间)
Waiting Time
(wa)
等待I/O时间百分比
Idel Time
(id)
空闲时间百分比

部分系统在内核态与CPU相关的指标:

描述
Interrupts(in)每秒发生中断的次数(包括时钟中断)
Context Switches(cs)每秒上下文切换的次数
Processes on Run Queue(r)运行队列进程数(TASK_RUNNING)
total总进程数
running正在运行中的进程数
sleeping处于等待状态的进程数
stopped被停止的进程数
zombie僵尸进程数目

CPU使用率为User Time与System Time占比之和,公式如下:

进程CPU资源相关

下面主要使用top命令的字段来命名

描述
pr进程优先级
ninice级
s进程的状态
TIME+该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值
%cpuCPU使用率
%usr进程在用户态运行占用CPU的百分比
%system进程在内核态运行占用CPU的百分比
%guestPercentage of CPU spent by the task in virtual machine (running a virtual processor)
Threads线程数,记录在/proc//status的Threads字段,也可以通过查看/proc//task内的数目来判断

内存与虚拟内存

用户进程的内存页分为file-backed pages(与文件对应的内存页)与anonymous pages(匿名页)。

下面指标大部分主要以/proc/meminfo内的字段来命名:

系统内存指标

描述
MemTotal总内存大小
MemUsed已使用内存大小
MemFree剩余内存大小
MemAvailable预估可分配内存大小,除去维持系统运行所必须的内存大小外,包含MemFree以及可回收的部分内存(Buffers与Cached)大小
Shmem(Shared)共享内存大小,Linux的共享内存是通过tmpfs实现的
Buffers(Write-Buffer)缓冲区内存大小,对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据,可以理解为Buffers主要用于写操作
Cached(Read-Cache)缓存区内存大小,磁盘读取文件的页缓存,用于缓存从磁盘读取的数据,可以理解为Cached主要用于读操作
Dirty脏(文件)页大小,这些页被回收前,需要先写回磁盘(先转为Writeback)
Writeback正在执行回写操作的页大小
Mlocked被mlock系统调用进行锁定了的内存大小,该类型内存不能进行pageout / swapout,会被移到LRU的Unevictable list上
AnonPages未映射页的内存大小,即anonymous pages(匿名页、未映射页)
Mapped用户进程file-backed pages总大小,这些缓存页与进程关联,比如共享库、可执行程序文件,mmap文件等
SwapCached内存与交换区设备(Swap)的中间层,即内存与Swap互相交换都会经过SwapCached
SlabSlab内存分配机制,分配的内存大小
SReclaimableSlab中可回收的部分内存大小
SUnreclaimSlab中不可回收的部分内存大小

以下部分与LRU相关:

描述
Active最近被访问过的内存页大小,Active(anon)+ Active(file)
Inactive最近未被访问过的内存页大小,Inactive(anon)+ Inactive(file)
Active(anon)最近被访问过的匿名内存页(anonymous pages)大小
Inactive(anon)最近未被访问过的匿名内存页(anonymous pages)大小
Active(file)最近被访问过的未映射内存页(file-backed pages)大小
Inactive(file)最近未被访问过的未映射内存页(file-backed pages)大小
Unevictable在LRU list上不能进行pageout / swapout的内存页大小

进程内存指标

物理内存
/
虚拟内存
描述
虚拟内存
(VSS,Virtual Set Size)、VSZ、VIRT
虚拟内存进程向系统申请的所有虚拟内存,包括未实际分配的物理内存也包含了被换出的内存等。在现实中基本不会用它来衡量进程真实(物理)内存的使用量。VSS = RSS + 未分配或被换出的物理内存
常驻内存
(RSS,Resident Set Size)、RES
物理内存进程目前实际使用的物理内存大小,由于其包含了共享库的内存大小,而共享库基本对多个进程是共享同一份的,所以其描述进程物理内存占用量是不准确的,通常会同于实际的内存使用量。RSS = USS + 共享库内存大小
比例集内存
(PSS,Proportional Set Size)
物理内存按比例分配共享内存后的物理内存,它与RSS的区别是对于共享库占用内存的计算方法,如果有N个进程共用同一个共享库,那么每个进程对于该共享库使用的内存大小,会根据该共享库的内存大小按比例进行分配。比如说:一个库大小是40MB,有4个进程在使用,那么每个进程分配到的大小是10MB,当其中一个进程被销毁后,其占用的那部分比例会重新分配给剩余的进程,进程的PSS可以通过cat /proc/<pid>/smaps来查看。PSS = USS + 按比例分配的共享库内存大小
独占内存
(USS,Unique Set Size)
物理内存进程实际独占占用的物理内存大小,并不包含进程使用的共享库占用的内存大小。当分析内存泄漏时,可用USS来观察
共享内存
(SHR,Shared Memory)
共享内存与其它进程共享的内存大小
交换内存
(Swap)
交换内存被换出到交换区的内存大小
CODE代码段大小
DATA数据段大小
主缺页异常
(nMaj, Major Page Faults)
主缺页异常数目,该类型缺页需要磁盘I/O介入(比如Swap内存)
次缺页异常
(nMin,Minor Page Faults)
次缺页异常数目,该类型缺页可直接从物理内存中分配

/proc//status中记录的部分内存信息:

描述
VmPeak记录VmSize的峰值
VmSize进程当前虚拟空间大小
VmLck被mlock系统调用锁定不能进行pageout / swapout的内存大小
VmPin固定内存大小,既不能被移除也不能被移动
VmHWM峰值驻留内存大小
VmRSS常驻内存大小
VmData进程数据段大小
VmStk进程用户态栈大小
VmExe进程代码段大小
VmLib映射的共享库的大小
VmPTE进程PTE(页面表)的大小
VmPMD进程二级页表大小
VmSwap交换空间大小
RssAnonRSS中未映射页的内存大小
RssFileRSS中映射页的内存大小
RssShmemRSS中共享内存大小

交换内存(Swap)与页面交换(Paging)

描述
SwapTotal交换区空间总大小
SwapFree交换区空间剩余大小
Swap In(换入),si(vmstat)Amount of memory swapped in from disk,每秒从Swap读取到内存的数据大小
Swap Out(换出),so(vmstat)Amount of memory swapped to disk,每秒从内存写入Swap的数据大小

外存

IOPS(Input/Ouput Operations Per Second):可作为无磁盘故障时磁盘吞吐量(Disk Throughput)

Random Read IOPS:随机读IOPS

Random Write IOPS:随机写IOPS

Sequential Read IOPS:顺序读IOPS

Sequential Write IOPS:顺序写IOPS

以下是iostat的一些实时指标:

iostat列单位描述
tps每秒I/O请求数
Blk_read/s每秒读取的block数
Blk_wrtn/s每秒写入的block数
r/srio/s每秒完成的读I/O设备次数
w/swio/s每秒完成的写I/O设备次数
rkB/s每秒读K字节数
wkB/s每秒写K字节数
avgrq-sz扇区平均每次设备I/O操作的数据大小
avgqu-sz平均I/O队列长度,如果其比较大说明有大量I/O请求在等待
r_await每个读操作平均所需时间(包括了在kernel队列中的等待时间)
w_await每个写操作平均所需时间(包括了在kernel队列中的等待时间)
awaitms平均每次设备I/O操作的等待时间
svctmms平均每次设备I/O操作的服务时间
%util(设备使用率)每秒有多少百分比时间用于该设备的I/O操作,即被I/O操作消耗的CPU百分比(Percentage of CPU time during which I/O requests were issued to the device)

如果%util接近100%,说明I/O已经接近满负载,可能存在性能瓶颈;

如果svctm接近await,说明I/O几乎没有等待时间;

如果await远大于svctm,说明I/O队列太长,I/O响应慢,有必要进行优化;

如果avgqu-sz比较大,说明有大量I/O请求在等待;

网络吞吐量(Network Throughput)

BPS(Bytes Per Second)

即服务器在无网络故障的情况下,单位时间内通过网络的数据量,单位一般使用byte/sec。在考虑服务器选取的带宽时,可以通过日均PV以及页面平均大小来计算出平均带宽需求,并根据平均带宽推测峰值带宽需求,在给服务器选取带宽时选择峰值带宽

bPS(bits Per Second)

每秒比特位,其等同于BPS,不过单位不一样,BPS以字节为单位,bPS以位(bit)为单位

PPS(Packets Per Second)

每秒数据包传输量

TPS(Transactions Per Second)

每秒事务数量

数据库

以下来自:阿里云 - 测试指标

一级指标二级指标单位解释
SQL耗时微秒执行SQL耗时
吞吐量QPS每秒查询次数
TPS每秒事务次数
命中率(Buffer Cache Hit)Key Buffer命中率百分之索引缓冲区命中率
InnoDB Buffer命中率百分之InnoDB缓冲区命中率
Query Cache命中率百分之查询缓存命中率
Table Cache命中率百分之表缓存命中率
Thread Cache命中率百分之线程缓存命中率
锁(Deadlock)等待次数锁等待次数
等待时间微秒锁等待时间

Linux相关运维命令

如果在安装时不确定命令属于哪个包可以用以下方法来定位:

1
2
3
4
5
# 对于yum
yum provides <命令 or 文件路径>

# 对于apt
apt-file search <命令 or 文件路径>

系统资源监控

描述使用例子
pidstat可查看各进程的CPU使用情况,也可以针对某个指定的进程进行跟踪
vmstat
mpstat从/proc/stat中提取信息。与vmstat的区别是,vmstat显示的是所有逻辑CPU的一个总体统计,而mpstat可现实每个逻辑CPU各自的情况
iostatI/O与CPU信息统计
sar辅助分析系统性能,包括CPU、运行队列、I/O设备、交换区、网络等性能数据
uptime快速查看系统的负载情况
free内存使用情况
smem
top
atop
ps
pstree进程树
procinfo

trace相关

描述使用例子
perf
strace

I/O相关

描述使用例子
lsof查看文件占用情况
iostat
stat查看文件状态
dstat
df
du
fdisk
mount

缓存相关

描述使用例子
cachestat
cachetop
slabtop

内存相关

描述使用例子
pmap内存布局分析
valgraind
memleak

网络资源监控

描述使用例子
iptraf监控网络吞吐量iptraf -d eth0
ifstat
ip
ifconfig
sar
netstat
tcpdump
iperf3
ethtool
nmcli

设备相关

描述使用例子
lspci查看PCI设备信息
lscpu查看CPU信息
ethtool
nmcli
dmidecode

账户相关

描述使用例子
w
who

日志相关

描述使用例子
dmesg查看系统日志
tail、awk、sed、head、more、watch等文本处理工具

性能与测试相关

描述使用例子
abapache bench 压力测试
stress模拟系统负载高的情况
watch
请我喝瓶肥仔快乐水?

欢迎关注我的其它发布渠道