首页 » SEO优化 » phpinfosecdll技巧_机能自动化测试LoadRunner压力测试实际项目案列分析

phpinfosecdll技巧_机能自动化测试LoadRunner压力测试实际项目案列分析

访客 2024-12-13 0

扫一扫用手机浏览

文章目录 [+]

弱小与健壮

主题词:Loadrunner 工具 压力测试

phpinfosecdll技巧_机能自动化测试LoadRunner压力测试实际项目案列分析

LoadRunner压力测试实例

phpinfosecdll技巧_机能自动化测试LoadRunner压力测试实际项目案列分析
(图片来自网络侵删)

择要:本文通过实例讲解先容了LoadRunner 工具的利用,介于公司的实际情形,文中紧张是对工具的基本利用做了详细描述,高等利用方面除性能计数器与参数设置外其它均未涉及,待往后补充。
目的是使公司职员根据该手册便可以独立利用Loadrunner进行压力测试

1 LoadRunner 概要先容

LoadRunner 是一种预测系统行为和性能的工业标准级负载测试工具。
通过以仿照上

千万用户履行并发负载及实时性能监测的办法来确认和查找问题,LoadRunner 能够对全体

企业架构进行测试。
通过利用LoadRunner , 企业能最大限度地缩短测试韶光, 优化性能和加速运用系统的发布周期。
目前企业的网络运用环境都必须支持大量用户,网络体系架构中含各种运用环境且由不同供应商供应软件和硬件产品。
难以预知的用户负载和愈来愈繁芜的运用环境使公司时时担心会发生用户相应速度过慢, 系统崩溃等问题。
这些都不可避免地导致公司收益的丢失。
Mercury Interactive 的 LoadRunner 能让企业保护自己的收入来源, 无需购置额外硬件而最大限度地利用现有的IT 资源, 并确保终端用户在运用系统的各个环节中对其测试运用的质量, 可靠性和可扩展性都有良好的评价。
LoadRunner 是一种适用于各种体系架构的自动负载测试工具, 它能预测系统行为并优化系统性能。
LoadRunner 的测试工具是全体企业的系统, 它通过仿照实际用户的操作行为和实施实时性能监测, 来帮助您更快的查找和创造问题。
此外,LoadRunner 能支持广范的协议和技能, 为您的分外环境供应分外的办理方案。

1.1 基本步骤

利用LoadRunner 完成测试一样平常分为四个步骤:

1)Vvitrual User Generator 创建脚本

创建脚本,选择协议

录制脚本

编辑脚本

检讨修正脚本是否有误

2)中心掌握器(Controller)来调度虚拟用户

创建Scenario,选择脚本

设置机器虚拟用户数

设置Schedule

如果仿照多机测试,设置Ip Spoofer

3)运行脚本

 剖析scenario

4)剖析测试结果

2 安装LoadRunner 中文版

LoadRunner 分为Windows 版本和Unix 版本。
如果我们的所有测试环境基于Windows

平台, 那么我们只要安装Windows 版本即可。
本章讲解的安装过程便是LoadRunner7.8中文的Windows 版本的安装。

2.1 系统哀求

目前部门的测试机和事情机器足可以知足LoadRunner7.8 的最低哀求。
不过要比较好

的运行LoadRunner, 内存最好在512M 以上, 安装LoadRunner 的磁盘空间至少剩余500M。
操作系统最好为Windows 2000。

2.2 安装过程

LoadRunner7.8中文版安装基本分两个步骤:首先安装LoadRunner7.8英文原版,然后安装中文措辞插件包

LoadRunner7.8英文原版存放位置:\10.138.149.139 test toolsLR7.8nt.rar将压缩文件拷贝解压到本机的安装,过程比较大略要开始安装LoadRunner,以Administrator 的身份上岸Windows2000 后,运行LoadRunner 安装目录下Setup.exe 即可进入安装程序。

1. 在“Registration Information” 界面中, 输入序列号( 不用改动, 便是n 个8)

2. 在安装类型界面中, 选择一种安装类型

下面大略的对这三种安装类型进行先容

●Standalone Installation 将要安装LoadRunner 在一台打算机上

●Network Installation 把LoadRunner 安装在一个网络驱动器上, 这样任何能连接到这个

网络驱动器的打算机都可以利用LoadRunner 的部分或者全部组件。

●Network Installation and shortcuts 和Network Installation 类似,不同的只是这种类型将把

自己的打算机配置成Workstation 来运行LoadRunner。
如果选择了第二项, 我们还须要

进行2.3 的安装来配置Workstation.。
考虑到我们是自己学习研究学习, 选择第一种安装方法。

3. 在安装办法界面中, 须要选择一种安装办法。
建议选择“ 自定义安装”, 这样所有的组件都会一次安装。

下面大略的对各个安装办法进行先容

●Typical Installation 安装比较通用的组件, 包括Controller、Vuser、在线帮助和脚

该选项适宜于掌握Vusers 的机器。

●Load Generator 只安装运行Vusers 产生负载的组件。
该选项适宜于只产生负载,

而不掌握Vusers 的机器。

●MI Listener 安装MI Listener 组件, 用来透过防火墙来运行Vusers 并且监视性能。

●Custom Installation 自定义安装, 我们将利用该选项, 安装全部的组件。

4. 在“License Information” 中输入License Key 后,Next, 连续

100个用户(无韶光限定):AEAMAUIK-YAFEKEKJJKEEA-BCJGI

10000个用户(有韶光限定):AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB

5. 如果是网络安装,最好把网络驱动器映射本钱机的一个盘符, 安装LoadRunner 的各级目录不要包含中笔墨符。

6. Next 后进入拷贝文件的界面

7. 拷贝文件完成后, 进入“User Login Settings” 界面。

●Allow virtual users to run on this machine without user login 须要不才面输入域、用

户名和密码, 这样运行Load Generator 的机器会自动上岸到网络,

●Manual log in to the Load Generator machine 运行Vusers 时, 自动上岸到网络,

无需上岸用户名和密码, 这样Vusers 就会不用任何干预自动的启动运行。
推举

选择该项。
这里选择第一项和第二项都可以。

8. 重新启动, 安装完成

LoadRunner7.8英文原版存放位置:\10.138.149.139est tools LoadRunner7.8中文版.rar

将压缩文件拷贝解压到本机的安装.。
过程比较大略要开始安装以Administrator 的身份上岸Windows2000 后,(把稳要退出已经运行的英文原版)运行安装目录下Setup.exe 即可进入安装程序,安装过程中统统人机互换窗口多选择默认“下一步”即可

把稳:解压文件存放的文件夹不可起中文名字,安装目录最好利用默认,如果变动则安装目录不要利用中文名!

3.项目背景先容

3.1 背景概述

“LMS网校考试平台”是一个范例的三层B/S架构的MIS系统(客户端/运用做事器/数据库管),中间层是业务逻辑层,运用做事器处理所有的业务逻辑,但运用做事器本身不供应负载均衡的能力,而是利用开拓工具供应的ORB(工具要求代理)软件担保多个运用做事器间的负载均衡。
本次测试的目的是:进行运用做事器的压力测试,找出运用做事器能够支持的最大客户端数。
方法是:按照正常业务压力估算值的1~10倍进行测试,稽核运用做事器的运行情形。

3.2压力测试用例

场景描述一:

1. 用户登录的lmm模块,统共上岸24个用户,所有用户都同时并发操作。

2. 用户点击“登记的教程”

3. 用户点击“启动”,进行课程学习,进入DS模块

4. 在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

5. 点击“返回LMS”按钮,返回到lmm模块,点击“退出”按钮,退出系统

场景描述二:

1. 用户上岸lmm模块,统共登录48个用户,每1秒登录1个用户

2. 用户点击“已登记教程”

3. 用户点击“启动”,进行课程学习,进入DS模块

4. 在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习;

5. 点击“返回LMS”按钮,返回到lmm模块,点击“退出”按钮,退出系统

场景描述三:

1. 用户登录的lmm模块,统共上岸48个用户,所有用户都同时并发操作。

2. 用户点击“登记的教程”

3. 用户点击“启动”,进行课程学习,进入DS模块

4. 在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

5. 点击“返回LMS”按钮,返回到lmm模块

点击“退出”按钮,退出系统

场景描述四:

1. 用户登录的lmm模块,统共上岸48个用户,每秒同时登录10个用户。

2. 用户点击“登记的教程”

3. 用户点击“启动”,进行课程学习,进入DS模块

4. 在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

5. 点击“返回LMS”按钮,返回到lmm模块,点击“退出”按钮,退出系统

场景描述五:

1. 用户登录的lmm模块,统共上岸100个用户,所有用户同时并发操作。

2. 用户点击“登记的教程”

3. 用户点击“启动”,进行课程学习,进入DS模块

4. 在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

5. 点击“返回LMS”按钮,返回到lmm模块

场景描述六:

1. 用户登录的lmm模块,统共上岸200个用户,所有用户同时并发操作

2. 用户点击“登记的教程”

3. 用户点击“启动”,进行课程学习,进入DS模块

4. 在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

5. 点击“返回LMS”按钮,返回到lmm模块,点击“退出”按钮,退出系统

场景描述七:

1. 户登录的lmm模块,统共上岸24个用户。
所有用户都同时并发操作

2. 所有用户都同时并发操作,户点击“登记的教程”中“test”课件

利用自发测试工具,目的测试24个用户同时打开课件时做事器性能

场景描述八:

1. 登录的lmm模块,统共上岸60个用户。
所有用户都同时并发操作

2. 有用户都同时并发操作,户点击“登记的教程”中“test”课件

利用自发测试工具,目的测试60个用户同时打开课件时做事器性能

4.利用LoadRunner进行负载/压力测试

4.1录制基本的用户脚本

创建用户脚本须要用到VuGen。
提示: 运行VuGen 最好在1024768 的分辨率下, 否则有些工具栏会看不到。

启动Visual User Generator 后, 通过菜单新建一个用户脚本, 选择系统通讯的协议。

这里我们须要测试的是Web 运用,同时考虑到后台SQL数据库以是我们须要选择Web(HTTP/HTML)协议+SQL SERVER协议,确定后, 进入主窗体。
通过菜单来启动录制脚本的命令。

●在URL 中添入要测试的Web 站点地址..。

●测试http://lms.ah.sp.com.cn/lms-lmm/loginForm.do选择要把录制的脚本放到哪一个部分, 默认情形下是“Action”。

这里大略解释一下:VuGen 中的脚本分为三部分:vuser_init、vuser_end 和Action。

中vuser_init 和vuser_end 都只能存在一个, 不能再分割, 而Action 还可以分成无数多个部分( 通过点击New 按钮, 新建ActionXXX)。
在录制须要上岸的系统时, 我们把上岸部分放到vuser_init 中, 把上岸后的操作部分放到Action 中, 把注销关闭上岸部分放到vuser_end 中。
( 如果须要在上岸操作设凑集点, 那么上岸操作也要放到Action 中, 由于vuser_init 中不能添加凑集点) 在其他情形下, 我们只要把操作部分放到Action 中即可。
把稳: 在重复实行测试脚本时,vuser_init 和vuser_end 中的内容只会实行一次, 重复实行的只是Action 中的部分。

●点“ 选项 ”按钮, 进入录制的设置窗体, 这里一样平常情形下不须要改动。

●然后点“OK” 后,VuGen 开始录制脚本。
在录制过程中, 不要利用浏览器的“ 退却撤退” 功能,LoadRunner 支持不太好!
录制过程中, 在屏幕上会有一个工具条涌现。
录制的过程和WinRunner 有些类似, 不再多先容。
录制完成后, 按下“ 结束录制” 按钮,VuGen 自动天生用户脚本, 退出录制过程。

4.2 完善测试脚本

当录制完一个基本的用户脚本后, 在正式利用前我们还须要完善测试脚本, 增强脚本的

灵巧性。
一样平常情形下, 我们通过以下几种方法来完善测试脚本。
插入事务、插入结合点、插入表明、参数化输入。
这里只举例先容参数化如何设置,其它只作大略先容。

4.2.1 插入事务

事务(Transaction): 为了衡量做事器的性能, 我们须要定义事务。
比如: 我们在脚本

中有一个数据查询操作, 为了衡量做事器实行查询操作的性能, 我们把这个操作定义为一个事务, 这样在运行测试脚本时,LoadRunner 运行到该事务的开始点时,LoadRunner 就会开始计时, 直到运行到该事务的结束点, 计时结束。
这个事务的运行韶光在结果中会有反响。

插入事务操作可以在录制过程中进行, 也可以在录制结束后进行。
LoadRunner 运行在

脚本中插入不限数量的事务。

详细的操作方法如下: 在须要定义事务的操作前面, 通过菜单或者工具栏插入。
输入该事务的名称。
把稳: 事务的名称最好要故意义, 能够清楚的解释该事务完成的动作。
插入事务的开始点后, 下面须要在须要定义事务的操作后面插入事务的“ 结束点”。
同样可以通过菜单或者工具栏插入。
默认情形下, 事务的名称列出最近的一个事务名称。
一样平常情形下, 事务名称不用修正。
事务的状态默认情形下是LR_AUTO。
一样平常情形下, 我们也不须要修正, 除非在手工编写代码时, 有可能须要手动设置事务的状态。

4.2.2 插入凑集点

插入凑集点是为了衡量在加重负载的情形下做事器的性能情形。
在测试操持中, 可能会

哀求系统能够承受1000 人同时提交数据,在LoadRunner 中可以通过在提交数据操作前面加入凑集点, 这样当虚拟用户运行到提交数据的凑集点时,LoadRunner 就会检讨同时有多少用户运行到凑集点,如果不到1000 人,LoadRunner 就会命令已经到凑集点的用户在此等待, 当在凑集点等待的用户达到1000 人时,LoadRunner 命令1000 人同时去提交数据, 从而达到测试操持中的需求。

把稳: 凑集点常常和事务结合起来利用。
凑集点只能插入到Action 部分,vuser_init 和vuser_end 中不能插入凑集点。
详细的操作方法如下: 在须要插入凑集点的前面, 通过菜单或者工具栏操作输入该凑集点的名称。
把稳: 凑集点的名称最好要故意义, 能够清楚的解释该凑集点完

成的动作。

4.2.3 插入注释

注释的浸染就不多说了, 不过插入注释最好是在录制过程中。
详细的操作方法如下: 在须要插入注释的前面, 通过菜单或者工具栏操作

4.2.4 参数化输入

如果用户在录制脚本过程中, 填写提交了一些数据, 比如要增加数据库记录。
这些操作

都被记录到了脚本中。
当多个虚拟用户运行脚本时, 都会提交相同的记录, 这样不符合实际的运行情形, 而且有可能引起冲突。
为了更加真实的仿照实际环境, 须要各种各样的输入。
参数化输入是一种不错的方法。

用参数表示用户的脚本有两个优点:

① 可以使脚本的长度变短。

② 可以利用不同的数值来测试你的脚本。
例如, 如果你企图搜索不同名称的图书, 你

仅仅须要写提交函数一次。
在回放的过程中, 你可以利用不同的参数值, 而不但搜索一

个特定名称的值。

参数化包含以下两项任务:

① 在脚本中用参数取代常量值。

② 设置参数的属性以及数据源。

参数化仅可以用于一个函数中的参量。
你不能用参数表示非函数参数的字符串。

其余, 不是所有的函数都可以参数化的。

参数化输入的讲解, 我们采取一个例子的办法来进行。

在本例中我们参数化用户的上岸名:

先看如下脚本,通过脚本录制找到用户上岸部分,如图

框选住上岸名,点鼠标右键,弹出对话框,选择“更换为新参数”弹出对话框

参数名随意取,建议取普通易懂的名字,下面我们重点先容一下参数的类型。

●DateTime: 很大略, 在须要输入日期/韶光的地方, 可以用DateTime 类型来替代。

其属性设置也很大略, 选择一种格式即可。
当然也可以定制格式。

.●Group Name:暂时不知道何处能用到,但设置比较大略。
在实际运行中,LoadRunner

利用该虚拟用户所在的Vuser Group 来代替。
但是在VuGen 中运行时,Group Name

将会是None

.●Load Generator Name: 在实际运行中,LoadRunner 利用该虚拟用户所在Load Generator 的机器名来代替。

.●Iteration Number: 在实际运行中,LoadRunner 利用该测试脚本当前循环的次数来

代替。

.●Random Number: 随机数。
很大略。
在属性设置中可以设置产生随机数的范围

.●Unique Number:唯一的数。
在属性设置中可以设置第一个数以及递增的数的大小。

把稳: 利用该参数类型必须把稳可以接管的最大数。
例如: 某个文本框能接管的

最大数为99。
当利用该参数类型时, 设置第一个数为1, 递增的数为1, 但100 个

虚拟用户同时运行时,第100 个虚拟用户输入的将是100,这样脚本运行将会出错。

把稳: 这里说的递增意思是各个用户取第一个值的递增数, 每个用户相邻的两次循

环之间的差值为1。
举例解释: 如果起始数为1, 递增为5, 那么第一个用户第一

次循环取值1, 第二次循环取值2; 第二个用户第一次循环取值为6, 第二次为7;

依次类推。

●Vuser ID: 设置比较大略。
在实际运行中,LoadRunner 利用该虚拟用户的ID 来代

替,该ID 是由Controller 来掌握的。
但是在VuGen 中运行时,Vuser ID 将会是–1。

File: 须要在属性设置中编辑文件,添加内容,也可以从现成的数据库中取数据( 下

面我们将会先容)

●User Defined Function: 从用户开拓的dll 文件提取数据。
就目前我认为, 这种办法

没有必要。
VuGen 支持C 措辞的语法,在VuGen 中重新编写类似的函数该当不难。

上面的例子中, 我们取随机数即可。
点“Properties… ..” 按钮, 进行属性设置窗口

添入随机数的取值范围为(1-50), 选择一种数据格式。
在“属性” 中有以下几

个选项:

◆Each Occurrence:在运行时, 每碰着一次该参数, 便会取一个新的值

◆Each iteration:运行时, 在每一次循环中都取相同的值

◆Once:运行时, 在每次循环中, 该参数只取一次值

这里我们用的是随机数, 选择Each Occurrence 非常得当。

下面我们再先容用数据库中的用户名来参数化上岸用户名。

框选住上岸名,点鼠标右键,弹出对话框,选择“更换为新参数”弹出对话框,此时参数名输入:name,参数类型选择File,如图

点“属性”按钮, 涌现以下窗口

把稳: 参数的文件名不要利用con.dat、pm.dat 或者lpt.dat 等系统装置名下面我们将会连接数据库, 从数据表中选择用户名。
点“数据引导” 按钮,显示如图

利用第2 项, 选择“利用手动指定SQL语句”点下一步,涌现如图窗口

添入连接字符串, 点“创建” 按钮,选择事先配置好的ODBC连接。
在SQL语句里输入select查询语句,涌现如图窗口

提醒: 在参数数据显示区, 最多只能看到100 行, 如果数据超过100 行, 只能点“编辑” 按钮, 进入记事本看。

“选择下一行 ” 有以下几种选择:

●Sequential: 按照顺序一行行的读取。
每一个虚拟用户都会按照相同的顺序读取

●Random: 在每次循环里随机的读取一个, 但是在循环中一贯保持不变

●Unique : 唯一的数。
把稳: 利用该类型必须把稳数据表有足够多的数。
比如Controller 中设定20 个虚拟用户进行5 次循环, 那么编号为1 的虚拟用户取前5 个数, 编号为2 的虚拟用户取6-10 的数, 依次类推, 这样数据表中至少要有100 个数据, 否则Controller 运行过程中会返回一个缺点。

“按编号”指选择列表中的那一列数据,从左到右分别是1、2、3依次

常日用在有关联性的数据上面。
我们这里取值Sequential 即可。
完成设置关闭即可

4.3 单机运行测试脚本

经由以上的各个步骤后, 脚本就可以运行了。
运行脚本可以通过菜单或者工具栏来操作。

实行“ 运行” 命令后,VuGen 先编译脚本, 检讨是否有语法等缺点。
如果有缺点,VuGen

将会提示缺点。
双击缺点提示,VuGen 能够定位到涌现缺点的那一行。
为了验证脚本的正

确性, 我们还可以调试脚本, 比如在脚本中加断点等, 操作和在VC 中完备一样, 相信大家谁都不会感到陌生。
如果编译通过, 就会开始运行。
然后会涌现运行结果。

5履行测试

5.1 选择脚本,创建虚拟用户

启用“controller”弹出如图窗口

选择刚才录制并保存好的脚本,添加到方案中,点“确定”涌现如图

根据须要修正虚拟用户数量,这里我们取“100”根据实现场景设计,取不同数字

点“编辑操持”细化方案,操持名里选择操持种类:加压,缓慢加压、默认操持或新建立操持。

默认操持:同时加载所有vuser,直到完成

加压:每15秒启动2个vuser 持续韶光5分种

缓慢加压::每2分种启动2个vuser 持续韶光10分种

这里我们选择“加压” 涌现如图

点“加压”标签设置加压方法,点“持续韶光”标签选择完成韶光,点“加压”标签选择退出方法,点“方案开始韶光”可以定义韶光后自动到点实行,并在一个限定的韶光范围内结束,所有设置完毕后,点“ok”返回上一级窗口,点“开始方案”启动运行,涌现如图窗口

5.2 添加windows资源监视窗口

loadruner默认性能监视窗口四个,分别是“运行vuser“、”事务相应韶光“、

“每秒点击次数”末了一个可以根据用户自己选择现实什么窗口。
打开可用图中目录树,

选择系统资源,找到windows资源双击,则windows资源监视窗口便自动更换原窗口如上图。
当然loadrunner也可以同时显示1-16个窗口,方法是点右键,在弹出菜单中选择“查看图”选择显示的图数,也可以自定义数字。

5.3 添加windows性能计数器

鼠标选择windows资源监视窗口,点击右键弹出菜单中选择“ADD Measurements..”弹出如图窗口

点“添加”把监视的做事器ip地址输入,点确定,如图

如果可以正常联机到做事器,则在资源度量中会显示全部计数器,此时如果点“确定”则系统默认全部选中,在监视窗口中会显示所有性能曲线,无法单独过滤显示某条曲线,如果选中某个计数器后点“添加”则弹出该项眼前的其它性能指标,选择须要的计数器后点“添加”如图

此时要把稳,你上岸客户端(也便是你装有loadrunner机器)的用户该当是管理员身份,同时还要担保该用户在被监视的做事器上也是管理员身份。
这样选择虽然监视窗口中仍会显示所有性能曲线,但是可以通过鼠标右键弹出菜单,选中你指定的某条曲线单独显示。
方法是双击监视窗口放大显示,然后右键选择“仅显示指定图”监视窗口还可以相互叠加等操作,功能强大,通过右键菜单选择可以进行繁芜显示操作。
常用的还有web程序做事器图、数据库做事器资源图等,添加方法雷同。
计数器有那些,有什么含义,空想值是多少,可以拜会第六章节。

5.4 实行脚本

此时设置完毕后,那就大略了,点击“开始方案”把稳不雅观察吧。

5.4.1 剖析结果

脚本实行完毕后,loadrunner会自动剖析结果,天生剖析结果图或表,方法是点导航栏“结果”选现,在弹出窗口中选择“剖析结果”

6 剖析以及监视场景

在运行过程中, 可以监视各个做事器的运行情形(DataBase Server、Web Server 等)。

监视场景通过添加性能计数器来实现。
这一章非常的主要, 确定系统瓶颈全靠它了。

下面重点讲讲须要添加那些计数器, 以及那些计数器代表什么意思。
由于Win2000 Professional、Server 以及Advanced Server 供应的计数器不完备相同, 这里我们谈论将以Server 为基准。
监视场景须要在Run 视图中设置然后, 涌现添加计数器的对话框其他的操作就和掌握面板“ 性能” 中添加性能计数器的操作一样, 这里不再详细解释。
本章紧张解释一下各个别系计数器的含义( 数据库的计数器不做重点, 只是拿SQL Server2000 作为例子进行解释。
由于数据库各个版本之间差异比较大, 请参考您利用的数据库系统的帮助)。

6.1 Memory干系

内存是第一个监视工具, 确定系统瓶颈的第一个步骤便是打消内请安题。
内存短缺的问题可能会引起各种各样的问题。

Object( 工具)

Counters

Description( 描述)

参考值

Memory

Available MBytes

物理内存的可用数( 单位 Mbytes)。
默认情形下IIS5.0 利用50%的可用物理内存, 作为IIS 的文件缓存(file cache)。
IIS 基本占用 2.5 MB,每个附加连接将在此根本上占用 10 KB 旁边

至少要有10% 的物理

Memory

Page/sec

Page Faults/sec

Pages Input/sec

Pages Input/sec

Page Reads/sec

Transition

Faults/sec

物理内存的可用数( 单位 Mbytes)。
默认情形下IIS5.0 利用50%的可用物理内存, 作为IIS 的文件缓存(file cache)。
IIS 基本占用 2.5 MB,每个附加连接将在此根本上占用 10 KB 旁边。
至少要有10% 的物理内存值当处理器向内存指定的位置要求一页( 可能是数据或代码) 涌现缺点时, 这就构成一个Page Fault。
如果该页在内存的其他位置, 该缺点被称为软缺点( 用Transition Fault/sec 数器衡量); 如果该页必须从硬盘上重新读取时, 被称为硬缺点。
许多处理器可以在有大软缺点的情形下连续操作。
但是, 硬缺点可以导致明显的拖延。
Page Faults/sec 是处理器每秒钟处理的缺点页( 包括软缺点和硬缺点)。
Pages Input/sec 是为理解决硬缺点页, 从硬盘上读取的页数, 而Page Reads/sec 是为理解决硬缺点, 从硬盘读取的次数。
如果 Page Reads/Sec 比率持续保持为 5, 表示可能内存不敷。
Pages/sec 是指为解析硬页缺点从磁盘

读取或写入磁盘的页数。

Page/sec 推举00-20( 如果做事器没有足够的内存处理其事情负荷, 此数值将一贯很高。
如果大于80,表示有问题)。
这些计数器的值比较低, 解释Web做事器相应要求比较快, 否则可能是做事器系统内存短缺引起( 也可能是缓存太大, 导致系统内存太少)。
Page Input/sec 的值可以衡量出硬缺点页发生的速率, 常日它的值会于或者即是Page Reads/sec。
Memory Cache Bytes

Memory

Cache Bytes

文件系统缓存(File System Cache)

默默认情形下认情形下为50%的可用物理内存。
如为50%的可IIS5.0 运行内存不足时, 它会自动整理用物理内存缓存。
须要关注该计数器的趋势变革

Internet File Cache Hits %

File Cache Hits %是文件缓存命中全部( 对付一个Information File Cache 缓存需求的比例, 反响了IIS 的文件缓大部分是静Services Flushes 存设置的事情情形。
而File Cache Hits 态网页组成

Global File Cache Hits 是文件缓存命中的详细值,File Cache 的网站)File Flushes 是自做事器启动之后文件缓存Cache Hits% 刷新次数, 如果刷新太慢, 会摧残浪费蹂躏内存; 如果刷新太快, 缓存中的工具会太频繁属于非常好!
的丢弃天生, 起不到缓存的浸染。
通过File Cache Hits 和File Cache Flushes 可以得到一个适当的刷新值( 参考IIS 的设置ObjectTTL 、MemCacheSize 、MaxCacheFileSize)

Memory

PoolPaged BytesPool Nonpaged Bytes

Pool Paged Bytes Pool Nonpaged Bytes 这两个计数器监视做事器上各个进程的分页池字节数和非分页池字节数。

在访问数比较固定的情形下, Pool Nonpaged Bytes 是比较定的, 如果访问数逐步增加, 该值会缓慢的增加

Process

Virtual Bytes

Working Set 计数器

Virtual Bytes( 实Virtual Bytes 数器监视IIS5.0 保留的例inetinfo 、虚地址空间的数量, 实例化为inetinfo dllhost) Working Set( 实例进程(IIS 运行的核心)和Dllhost 进程( 隔离/ 连接池的运用程序必需的)。
inetinfo 、dllhost) Working Set 计数器反响了每个进程使Dllhost#n 进程都用的内存页的数量。
系统的内存页(pool 要添加计数器Page) 只能由操作系统的核心模块直接访问, 用户进程不能访问。
运行IIS5.0 的做事器上, 卖力web 连接的线程以及它须要的一些工具都保存在未分页的池中(nonpaged pool), 比如文件句柄和socket 连接

Process

Private Bytes

指这个处理不能与其他处理共享的、已分配确当前字节数

Memory

Committed

Bytes

是指以字节表示的确认虚拟内存。
(确认内存是指为磁盘分

页文件在磁盘上保留的空间以便在需推举不超过物理内存的75%

要将其写回磁盘时利用)

推举部超过物理内存的75%

内请安题紧张检讨运用程序是否存在内存泄露。
如果发生了内存泄露,ProcessPrivate Bytes 计数器和ProcessWorking Set 计数器的值每每会升高, 同时Available Bytes 的值会降落。
内存泄露该当通过一个永劫光的, 用来研究剖析当所有内存都耗尽时, 运用程序反应情形的测试来考验。

6.2 Processor干系

Object( 工具)

Counters

Description( 描述)

参考值

Sytem

Processor Queue

Length

Processor Queue Length 是指处理列队中的线程数。
纵然在有多个处理器的打算机上处理器韶光也会有一个单列队。
不象磁盘计数器, 这个计数器仅计数就绪的线程, 而不计数运行中的线程。
如果处理器列队中总是有两个以上的线程常日表示处理器堵塞

小于2。
显示在由 Web 做事器所有处理器共享的行列步队中等待实行的线程数。
处理器瓶颈会导致该值持续大于2

Processor

%Processor Time

CPU 利用率。
这是查看处理器饱和状况的最佳计数器。
显示所有 CPU 的线程处理韶光。
如果一个或多个处理器的该数值持续超过 90%,则表示此测试的负

载对付目前的硬件过于沉重。
为多处理器做事器添加该计数器的 0 到 x 个实例

小于75%。
打消内藏身安身分, 如果该计数器的值比较大, 而同时网卡和硬盘的值比较低, 那么可以定CPU 瓶颈

System

Context Switches/sec

Context Switches/sec 指打算机上的所有处理器全都从一个线程转换到另一个线程的综合速率。
当正在运行的线程自动放弃处理器时涌现高下文转换, 由一个有更高优先就绪的线程占先或在用户模式和特权(内核)模式之间转换以利用实行或分系统做事。
它是在打算机上的所有处理器上运行的所有线程的Thread: Context Switches/sec 的总数并且用转换数量衡量。
在系统和线程工具上有高下文转换计数器

如果切换次数到5000CPU个数和10000CPU 个数中, 解释它忙于切换线程而不是

处理ASP 脚本

Processo

%Privileged Time

% Privileged Time 是在特权模式下处理线程实行代码所花韶光的百分比。
当调用 Windows 系统做事时, 此做事常常在特权模式运行, 以便获取对系统专有数据的访问。
在用户模式实行的线程无法访问这些数据。
对系统的调用可以是直接的(explicit)或间接的(implicit), 例如页面缺点或中断。
不像某些早期的操作系统,Windows 除了利用用户和特权模式的传统保护模式之外, 还利用处理边界作为分系统保护。
某些由Windows 为您的运用程序所做的操作除了涌如今处理的特权韶光内, 还可能在其他子系统处理涌现

Time

Switches/sec ( 实例化inetinfo 和dllhost

如果你决定要增加线程字节池的大小,你该当监视这三个计数器( 包括上面的一个)。
增加线数可能会增加高下文切换次数, 这样性能不会上升反而会低落。
如果十个实例的高下文切换值非常高, 就该当减小线程字节池的大小

Processor

Interrupts/sec %DPC Time

Time 这两个计数器能够反响处理器用在处理中断以及推迟处理调用的韶光。
如果处理器利用率超过Interrupts/sec 指处理器每秒钟吸收并维90% 且 硬件中断的均匀值。
正常的线程操作在中断时悬停。
大多数的系统时钟每Interrupt Time 大于隔 10 毫秒中断处理器一次, 形成了间15%, 则处理隔活动的后台

如果处理器利用率超过90%,且Interrupts/sec time大于15%则处理器可能负载过重,并发生中断

Processor Interrupts/sec %DPC Time 这两个计数器能够反响处理器用在处理中断以及推迟处理调用的韶光。
如果处理器利用率超过Interrupts/sec 指处理器每秒钟吸收并维90% 且 硬件中断的均匀值。
正常的线程操作在中断时悬停。
大多数的系统时钟每Interrupt Time 大于隔 10 毫秒中断处理器一次, 形成了间15%, 则处理隔活动的后台。
器可能负荷过重, 并发生中断。
判断运用程序是否存在处理器瓶颈的方法: 如果Processor Queue Length 显示的行列步队长度保持不变(>=2) 个并且处理器的利用率%Processor Time 超过90%, 那么很有可能存在处理器瓶颈。

如果创造Processor Queue Length 显示的行列步队长度超过2, 而处理器的利用率却一贯很

低, 那么或许更该当去办理处理器壅塞问题, 这里处理器一样平常不是瓶颈。
如果系统由于运用程序代码效率低下或者系统构造设计有缺陷而导致大量的高下文切换(Context Switches/sec 显示的高下文切换次数比较大), 那么就会占用大量的系统资源。
如果系统的吞吐量降落并且CPU 的利用率很高,并且此征象发生时切换水平在15000 以上, 那么意味着高下文切换次数过高同时还可以比较Context Switches/sec 和%Privileged Time 来判断高下文切换是否过量。
如果后者的值超过40%, 且高下文切换的速率也很高, 那么该当检讨为什么会产生这样高的高下文切换。

6.3 网络吞吐量以及带宽

Object

Counter

Description

参考值

Network Interface

Bytes Total/se

Bytes Total/sec 为发送和吸收字节的速率, 包括帧字符在内。
判断网络连接速该计数器的值和目前网度是否是瓶颈, 可以用该计数器的值和络的带宽相目前网络的带宽比较

改计数器的值和目前网络带宽相除,结果该当小于50%

Web Servic

Maximum Maximum Connections

Maximum Maximum Connections :“ 最大连接数” Attempts Total Connection Attempts :“ 连接考试测验总数” 是从做事启动时利用 Web 做事考试测验连接的总数。
该计数器运用于全部所列的实例。

6.4 磁盘干系

Object( 工具) Counters( 计数器名称) Description( 描述) 参考值

Object

Counters

Description

参考值

Network

Bytes Total/sec

Bytes Total/sec 为发送和吸收字节的速Interface 率, 包括帧字符在内。
判断网络连接速率是否是瓶颈, 可以用该计数器的值和目前网络的带宽比较

Processo

%Processor Time

% Privileged Time

CPU 利用率该计数器对应于处理器实行Windows. 2000 内核命令( 如处理SQL Server I/O 要求) 所用韶光的百分比。
如果 Physical Disk 计数器的值很高时该计数器的值也一贯很高, 则考虑利用速率更快或效率更高的磁盘子系统。

PhysicalDisk

%Disk Time

% Disk Time 指所选磁盘驱动器忙于为读或写入要求供应做事所用的韶光的百分比。
如果三个计数器都比较大, 那

么硬盘不是瓶颈。
如果只有%Disk Time 比较大, 其余两个都比较适中, 硬盘可能会是瓶颈。
在记录该计数器之前, 请

在 Windows 2000 的命令行窗口中运行 diskperf -yD 。
若数值持续超过 80%, 则可能内存泄露。

PhysicalDisk

AverageDisk

Queue Length

指读取和写入要求(为所选磁盘在实例间隔中列队的)的均匀数。

PhysicalDisk

PhysicalDisk

指在此盘上读取操作的速率

PhysicalDisk

Disk Writes/sec

指在此盘上写入操作的速率

判断磁盘瓶颈的方法是通过以下公式来打算:

每磁盘的I/O 数 = [读次数 + (4 写次数)] / 磁盘个数

如果打算出的每磁盘的I/O 数大于磁盘的处理能力, 那么磁盘存在瓶颈。

6.5 Web运用程序

这里以ASP.NET 开拓的Web 运用程序为例进行解释。

Object

Counters

Description

参考值

ASP.NET Applications

Request/Sec Request Executing

每秒实行的要求数。

如果Request/Sec ApplicationsRequest Executing 当前实行的要求数。
的值比较小, 你

的Web 程序可能

是瓶颈

ASP.NET

ASP.NETRequestWait

Time

Request Executing Time

最近的要求在行列步队中等待的毫秒数。
实行最近的要求所用的毫秒数。
Queued 在空想状况下该当靠近0, Request Queued 期待处理的要求数。
该计数器应保持靠近 0。
超过 IIS 行列步队长度会出如果这两个值太大, 那么须要重现“做事器太忙”缺点

6.6 SQL Server

这里针对SQL Server2000, 而且只是列出比较关键的几个。
更加详细的信息可以参考SQL Server 的联机文档。

Object(

Counters

Description

参考值

Processor

%Processor time

CPU 利用率

SQL Server: Logins/sec

这是每秒登录到 SQL Server 的计数

SQLServer:CacheManage

Cache Hit Ratio

(all instances)

显示在高速缓存中找到数据的命中率。
如果数值持续小于 85%, 则表

示内存有问题。

SQL Server

General Statistics

User Connections

显示当前 SQL 用户数。
与 Active Server Pages:Requests/Sec 计数器

进行比较, 可帮助理解脚本对 SQL Server 的影响程度。
如果差别过大, 则表示测试脚本不能有效地对SQL Server 进行应力测试。

SQLServer:Locks

Lock Waits/sec

显示在当提高程完成之前逼迫其他进程等待的每秒锁定要求的数量。
如果该值始长年夜于 0, 则表示事务有问题。

SQLServer: BuffeManage

Buffer Manager Hit Ratio

计数器值依运用程序而定, 但比率最好为 90% 或更高。
增加内存直到这一数值持续高于 90%, 表示90% 以上的数据要求可以从数据缓冲区中得到所需数据。

SQLServer

SQL Statistics

Batch Requests/sec

每秒收的Transact-SQL 命令批数。
这一统计信息受所有约束( 如I/O、用户数、高速缓存大小、要求I/O、用户数、高速缓存大小、要求的繁芜程度等) 影响。
批要求数值

高意味着吞吐量很好。

SQL Server:

Buffer Manager

Lazy Writes/sec

每秒被缓冲区管理器的惰性写入器写入的缓冲区数。
惰性写入器是一

个别系进程, 其紧张任务是刷新成批的老化的脏缓冲区( 指包含变动

的缓冲区, 这些变动必须写回磁盘, 才能使该缓冲区由其它页重新使

用), 并使之可由用户进程利用。
惰性写入器肃清了为创建可用缓冲区而频繁实行检讨点的须要。

SQL Server:

Buffer Manager

Page Reads/sec

每秒发出的物理数据库页读取数。
这一统计信息显示的是在所有数据

库间的物理页读取总数。
由于物理I/O 的开销大, 可以通过利用更大

的数据高速缓存、智能索引、更高效的查询或者改变数据库设计等方法, 使开销减到最小。

SQL

Server:Databases

Transactions/sec

每秒为数据库启动的事务数

这里针对SQL Server2000, 而且只是列出比较关键的几个。
更加详细的信息可以参考SQL

Server 的联机文档。

6.7 Network Delay

如果要监视的两台打算机在同一个局域网络内, 建议不要利用Network Delay Monitor。

由于在同一局域网内,Network Delay 会非常的小, 网络监视器会有足够的韶光在每秒钟内发送成百上千的要求, 这样会导致源打算机(source machine) 的CPU 和内存超负荷事情。

默认情形下“Enable display of network nodes by DNS names” 选择是没有选中的, 由于

选中它会明显的降落该监视器的速率。

7 剖析实时监视图表

这一章仅仅先容几个最主要的图表。

Q1 事务相应韶光是否在可接管的韶光内? 哪个事务用的韶光最长?

看Transaction Response Time 图, 可以判断每个事务完成用的韶光, 从而可以判断出那个事务用的韶光最长, 那些事务用的韶光超出预定的可接管韶光。

Q2 网络带宽是否足够?

“Throughput”图显示在场景运行期间的每一秒钟, 从Web Server 上接管到的数据量的值。

拿这个值和网络带宽比较, 可以确定目前的网络带宽是否是瓶颈。

如果该图的曲线随着用户数的增加, 没有随着增加, 而是呈比较平的直线, 解释目前的

网络速率不能够知足目前的系统流量。

Q3 硬件和操作系统能否处理高负载?

“Windows Resources” 图实时地显示了Web Server 系统资源的利用情形。
利用该图供应的数据, 可以把瓶颈定位到特定机器的某个部件。

8 常常碰着的问题

8.1 VuGen的问题

在利用VuGen 中常常会碰着的问题。

8.2 Controller的问题

在利用Controller 中常常会碰着的问题。

1. 在添加完Load Generators 机器时, 连接总是失落败; 添加的机器明明已经安装了

loadrunner, 并且网络通讯正常。

办理方法: 在安装loadrunner 的第七步骤, 该当选择第2 项, 如果选择了第一项,

就会有这种问题。
重新安装一下即可。

2. 在VuGen 中运行良好的脚本, 到Controller 中运行却出问题。

这种问题可能会碰着。
为了确定问题出在Controller 中的场景,而不是脚本的问题,

你该当在所有的Load Generators 机器上利用VuGen 运行测试脚本, 确保都能够运

行精确。
由于VuGen 和Controller 运行的机制不一样。
在VuGen 中运行时利用的

是完全的浏览器, 而在Controller 中运行时利用的只是浏览器的基本的部分。

8.3 计数器的问题

在利用性能计数器中常常会碰着的问题。

1. 添加了Windows Resources 计数器后, 却看不到实时的数据。

办理方法: 要得到监视的数据, 必须要在被监视的做事器(Web Server) 上得到管

理员权限。
最大略的方法是在“ 网络邻居”中以administrator 身份上岸Web Server。

当然利用下面的掌握台命令也可以:net use \< 机器名> 然后上岸用户名和密码即

可。
(上岸的用户名必须具有管理员权限)

2. 添加了一些默认的性能计数器后, 涌现了缺点。

办理方法: 可能是一些LoadRunner 默认的计数器在WebServer 上已经不存在的原

因, 尤其是数据库的计数器方面。
大略的办理方法, 便是删除有问题的计数器, 添

加比较靠近的计数器( 可能须要参考Windows 帮助或者数据库的帮助)

9.结果剖析

根据不同的场景设计,配置脚本后进行测试得到如下结果

测试环境

LMM:

CPU:4x2.7G RAM:4G

Websphere 5.0 + IBM Http Server

线程池:100

JDBC连接池:100

会话超时:30分钟

DS:

CPU:4x2.2RAM:4G

Websphere 5.0 + IBM Http Server

线程池:100

JDBC连接池:100

会话超时:30分钟

DB&LDAP:

CPU:2x2.2GRAM:4G

Oralce 8.1.7 + LDAP

测试工具:Load Runner 7.8

用户数据:用户名test1 – test100; 口令与用户名相同。

测试用例1

测试场景描述

用户登录的lmm模块,统共上岸24个用户,所有用户都同时并发操作。

用户点击“登记的教程”

用户点击“启动”,进行课程学习,进入DS模块

在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

点击“返回LMS”按钮,返回到lmm模块

点击“退出”按钮,退出系统

测试结果

LMM与DS模块CPU均匀利用率在10%以下。
LMM做事器CPU利用率峰值为20%,其阶段为LMM处理多个用户同时的登录要求与点击“已登记教程”的学习课程查询。
DS做事器CPU利用率峰值为100%(持续韶光为7秒),其阶段为DS处理多个用户单一登录验证和同时对课程构造树查询。
用户均匀操作相应韶光不超过5秒,所有交易成功。

测试用例2

测试场景描述

用户上岸lmm模块,统共登录48个用户,每1秒登录1个用户

用户点击“已登记教程”

用户点击“启动”,进行课程学习,进入DS模块

在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习;

点击“返回LMS”按钮,返回到lmm模块

点击“退出”按钮,退出系统

测试结果

LMM与DS模块CPU均匀利用率在5%以下。
LMM做事器CPU利用率峰值为10%,其阶段为LMM处理多个用户同时的登录要求与点击“已登记教程”的学习课程查询。
DS做事器CPU利用率峰值为8%,其阶段为DS处理多个用户单一登录验证和同时对课程构造树查询。
用户操作相应韶光不超过3秒,所有交易成功。

测试用例3

测试场景描述

用户登录的lmm模块,统共上岸48个用户,所有用户都同时并发操作。

用户点击“登记的教程”

用户点击“启动”,进行课程学习,进入DS模块

在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

点击“返回LMS”按钮,返回到lmm模块

点击“退出”按钮,退出系统

测试结果

LMM与DS模块CPU均匀利用率在20%以下。
LMM做事器CPU利用率峰值为40%,其阶段为LMM处理多个用户同时的登录要求与点击“已登记教程”的学习课程查询。
DS做事器CPU利用率峰值为100%(持续韶光为10秒),其阶段为DS处理多个用户单一登录验证和同时对课程构造树查询。
用户均匀操作相应韶光不超过10秒,所有交易成功。

测试用例4

测试场景描述

用户登录的lmm模块,统共上岸48个用户,每秒同时登录10个用户。

用户点击“登记的教程”

用户点击“启动”,进行课程学习,进入DS模块

在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

点击“返回LMS”按钮,返回到lmm模块

点击“退出”按钮,退出系统

测试结果

LMM与DS模块CPU均匀利用率在10%以下。
LMM做事器CPU利用率峰值为10%,其阶段为LMM处理多个用户同时的登录要求与点击“已登记教程”的学习课程查询。
DS做事器CPU利用率峰值为100%(持续韶光为2秒),其阶段为DS处理多个用户单一登录验证和同时对课程构造树查询。
用户均匀操作相应韶光不超过5秒,所有交易成功。

测试用例5

测试场景描述

用户登录的lmm模块,统共登录100个用户,每1秒登录一个用户。

用户点击“登记的教程”

用户点击“启动”,进行课程学习,进入DS模块

在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

点击“返回LMS”按钮,返回到lmm模块

点击“退出”按钮,退出系统

测试结果

LMM与DS模块CPU均匀利用率在20%以下。
LMM做事器CPU利用率峰值为10%,其阶段为LMM处理多个用户同时的登录要求与点击“已登记教程”的学习课程查询。
DS做事器CPU利用率峰值为100%(持续韶光为2’20分钟),其阶段为DS处理多个用户单一登录验证和同时对课程构造树查询。
用户最大操作相应韶光30秒,所有交易成功。

测试用例6

测试场景描述

用户登录的lmm模块,统共上岸100个用户,所有用户同时并发操作。

用户点击“登记的教程”

用户点击“启动”,进行课程学习,进入DS模块

在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

点击“返回LMS”按钮,返回到lmm模块

点击“退出”按钮,退出系统

测试结果

LMM与DS模块CPU均匀利用率在20%以下。
LMM做事器CPU利用率峰值为40%,其阶段为LMM处理多个用户同时的登录要求与点击“已登记教程”的学习课程查询。
DS做事器CPU利用率峰值为100%(持续韶光为3分钟),其阶段为DS处理多个用户单一登录验证和同时对课程构造树查询。
用户超时1个。

测试用例7

测试场景描述

用户登录的lmm模块,统共上岸200个用户,所有用户同时并发操作。

用户点击“登记的教程”

用户点击“启动”,进行课程学习,进入DS模块

在DS模块中进行学习,过程包括:首先,点击一次课程构造树;然后,进行课程内容的学习。

点击“返回LMS”按钮,返回到lmm模块

点击“退出”按钮,退出系统

测试结果

LMM CPU均匀利用率在20%以下。
LMM做事器CPU利用率峰值为40%,其阶段为LMM处理多个用户同时的登录要求与点击“已登记教程”的学习课程查询。
DS做事器CPU利用率峰值为100%(持续韶光为5分钟),其阶段为DS处理多个用户单一登录验证和同时对课程构造树查询。
用户超时108个。

10参考文献

LoadRunner中文利用手册(完备版)

LoadRunner 7.8 联机帮助

作者:西边人(软件测试资源站作者)

标签:

相关文章

列举私有属性php技巧_Java进阶_列举 enum

但是一个类究竟创建多少个工具,并且工具代表的值我们是无法限定的以是,如果开拓中须要一组值,须要的数据是明确的,就可以利用列举2 列...

SEO优化 2024-12-15 阅读0 评论0