用心做人,用心做事!

发布新日志

  • 什么是 性能测试

    2008-12-15 10:49:47

      性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。

      一、概述

      性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和瓶颈的预测。

      ·应用在客户端性能的测试

      应用在客户端性能测试的目的是考察客户端应用的性能,测试的入口是客户端。它主要包括并发性能测试、疲劳强度测试、大数据量测试和速度测试等,其中并发性能测试是重点。

      并发性能测试是重点

      并发性能测试的过程是一个负载测试和压力测试的过程,即逐渐增加负载,直到系统的瓶颈或者不能接收的性能点,通过综合分析交易执行指标和资源监控指标来确定系统并发性能的过程。负载测试(Load Testing)是确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统组成部分的相应输出项,例如通过量、响应时间、CPU负载、内存使用等来决定系统的性能。负载测试是一个分析软件应用程序和支撑架构、模拟真实环境的使用,从而来确定能够接收的性能过程。压力测试(Stress Testing)是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。

      并发性能测试的目的主要体现在三个方面:以真实的业务为依据,选择有代表性的、关键的业务操作设计测试案例,以评价系统的当前性能;当扩展应用程序的功能或者新的应用程序将要被部署时,负载测试会帮助确定系统是否还能够处理期望的用户负载,以预测系统的未来性能;通过模拟成百上千个用户,重复执行和运行测试,可以确认性能瓶颈并优化和调整应用,目的在于寻找到瓶颈问题。

      当一家企业自己组织力量或委托软件公司代为开发一套应用系统的时候,尤其是以后在生产环境中实际使用起来,用户往往会产生疑问,这套系统能不能承受大量的并发用户同时访问? 这类问题最常见于采用联机事务处理(OLTP)方式数据库应用、Web浏览和视频点播等系统。这种问题的解决要借助于科学的软件测试手段和先进的测试工具。

      举例说明:电信计费软件

      众所周知,每月20日左右是市话交费的高峰期,全市几千个收费网点同时启动。收费过程一般分为两步,首先要根据用户提出的电话号码来查询出其当月产生费用,然后收取现金并将此用户修改为已交费状态。一个用户看起来简单的两个步骤,但当成百上千的终端,同时执行这样的操作时,情况就大不一样了,如此众多的交易同时发生,对应用程序本身、操作系统、中心数据库服务器、中间件服务器、网络设备的承受力都是一个严峻的考验。决策者不可能在发生问题后才考虑系统的承受力, 预见软件的并发承受力, 这是在软件测试阶段就应该解决的问题。

      目前,大多数公司企业需要支持成百上千名用户,各类应用环境以及由不同供应商提供的元件组装起来的复杂产品,难以预知的用户负载和愈来愈复杂的应用程序,使公司担忧会发生投放性能差、用户遭受反应慢、系统失灵等问题。其结果就是导致公司收益的损失。

      如何模拟实际情况呢? 找若干台电脑和同样数目的操作人员在同一时刻进行操作,然后拿秒表记录下反应时间? 这样的手工作坊式的测试方法不切实际,且无法捕捉程序内部变化情况,这样就需要压力测试工具的辅助。

      测试的基本策略是自动负载测试,通过在一台或几台PC机上模拟成百或上千的虚拟用户同时执行业务的情景,对应用程序进行测试,同时记录下每一事务处理的时间、中间件服务器峰值数据、数据库状态等。通过可重复的、真实的测试能够彻底地度量应用的可扩展性和性能,确定问题所在以及优化系统性能。预先知道了系统的承受力,就为最终用户规划整个运行环境的配置提供了有力的依据。

      并发性能测试前的准备工作

      测试环境:配置测试环境是测试实施的一个重要阶段,测试环境的适合与否会严重影响测试结果的真实性和正确性。测试环境包括硬件环境和软件环境,硬件环境指测试必需的服务器、客户端、网络连接设备以及打印机/扫描仪等辅助硬件设备所构成的环境;软件环境指被测软件运行时的操作系统、数据库及其他应用软件构成的环境。

      一个充分准备好的测试环境有三个优点:一个稳定、可重复的测试环境,能够保证测试结果的正确;保证达到测试执行的技术需求;保证得到正确的、可重复的以及易理解的测试结果。

      测试工具:并发性能测试是在客户端执行的黑盒测试,一般不采用手工方式,而是利用工具采用自动化方式进行。目前,成熟的并发性能测试工具有很多,选择的依据主要是测试需求和性能价格比。著名的并发性能测试工具有QALoad、LoadRunner、Benchmark Factory和Webstress等。这些测试工具都是自动化负载测试工具,通过可重复的、真实的测试,能够彻底地度量应用的可扩展性和性能,可以在整个开发生命周期、跨越多种平台、自动执行测试任务,可以模拟成百上千的用户并发执行关键业务而完成对应用程序的测试。

      测试数据:在初始的测试环境中需要输入一些适当的测试数据,目的是识别数据状态并且验证用于测试的测试案例,在正式的测试开始以前对测试案例进行调试,将正式测试开始时的错误降到最低。在测试进行到关键过程环节时,非常有必要进行数据状态的备份。制造初始数据意味着将合适的数据存储下来,需要的时候恢复它,初始数据提供了一个基线用来评估测试执行的结果。

      在测试正式执行时,还需要准备业务测试数据,比如测试并发查询业务,那么要求对应的数据库和表中有相当的数据量以及数据的种类应能覆盖全部业务。

      模拟真实环境测试,有些软件,特别是面向大众的商品化软件,在测试时常常需要考察在真实环境中的表现。如测试杀毒软件的扫描速度时,硬盘上布置的不同类型文件的比例要尽量接近真实环境,这样测试出来的数据才有实际意义。

      并发性能测试的种类与指标

      并发性能测试的种类取决于并发性能测试工具监控的对象,以QALoad自动化负载测试工具为例。软件针对各种测试目标提供了DB2、DCOM、ODBC、ORACLE、NETLoad、Corba、QARun、SAP、SQLServer、Sybase、Telnet、TUXEDO、UNIFACE、WinSock、WWW、Java scrīpt等不同的监控对象,支持Windows和UNIX测试环境。

      最关键的仍然是测试过程中对监控对象的灵活应用,例如目前三层结构的运行模式广泛使用,对中间件的并发性能测试作为问题被提到议事日程上来,许多系统都采用了国产中间件,选择Java scrīpt监控对象,手工编写脚本,可以达到测试目的。

      采用自动化负载测试工具执行的并发性能测试,基本遵循的测试过程有:测试需求与测试内容,测试案例制定,测试环境准备,测试脚本录制、编写与调试,脚本分配、回放配置与加载策略,测试执行跟踪,结果分析与定位问题所在,测试报告与测试评估。

      并发性能测试监控的对象不同,测试的主要指标也不相同,主要的测试指标包括交易处理性能指标和 UNIX资源监控。其中,交易处理性能指标包括交易结果、每分钟交易数、交易响应时间(Min:最小服务器响应时间;Mean:平均服务器响应时间;Max:最大服务器响应时间;StdDev:事务处理服务器响应的偏差,值越大,偏差越大;Median:中值响应时间;90%:90%事务处理的服务器响应时间)、虚拟并发用户数。

      应用实例:“新华社多媒体数据库 V1.0”性能测试

      中国软件评测中心(CSTC)根据新华社技术局提出的《多媒体数据库(一期)性能测试需求》和GB/T 17544《软件包质量要求和测试》的国家标准,使用工业标准级负载测试工具对新华社使用的“新华社多媒体数据库 V1.0”进行了性能测试。

      性能测试的目的是模拟多用户并发访问新华社多媒体数据库,执行关键检索业务,分析系统性能。

      性能测试的重点是针对系统并发压力负载较大的主要检索业务,进行并发测试和疲劳测试,系统采用B/S运行模式。并发测试设计了特定时间段内分别在中文库、英文库、图片库中进行单检索词、多检索词以及变检索式、混合检索业务等并发测试案例。疲劳测试案例为在中文库中并发用户数200,进行测试周期约8小时的单检索词检索。在进行并发和疲劳测试的同时,监测的测试指标包括交易处理性能以及 UNIX(Linux)、Oracle、Apache资源等。

      测试结论:在新华社机房测试环境和内网测试环境中,100M带宽情况下,针对规定的各并发测试案例,系统能够承受并发用户数为200的负载压力,最大交易数/分钟达到78.73,运行基本稳定,但随着负载压力增大,系统性能有所衰减。

      系统能够承受200并发用户数持续周期约8小时的疲劳压力,基本能够稳定运行。

      通过对系统UNIX(Linux)、Oracle和Apache资源的监控,系统资源能够满足上述并发和疲劳性能需求,且系统硬件资源尚有较大利用余地。

      当并发用户数超过200时,监控到HTTP 500、connect和超时错误,且Web服务器报内存溢出错误,系统应进一步提高性能,以支持更大并发用户数。

      建议进一步优化软件系统,充分利用硬件资源,缩短交易响应时间。

      疲劳强度与大数据量测试

      疲劳测试是采用系统稳定运行情况下能够支持的最大并发用户数,持续执行一段时间业务,通过综合分析交易执行指标和资源监控指标来确定系统处理最大工作量强度性能的过程。

      疲劳强度测试可以采用工具自动化的方式进行测试,也可以手工编写程序测试,其中后者占的比例较大。

      一般情况下以服务器能够正常稳定响应请求的最大并发用户数进行一定时间的疲劳测试,获取交易执行指标数据和系统资源监控数据。如出现错误导致测试不能成功执行,则及时调整测试指标,例如降低用户数、缩短测试周期等。还有一种情况的疲劳测试是对当前系统性能的评估,用系统正常业务情况下并发用户数为基础,进行一定时间的疲劳测试。

      大数据量测试可以分为两种类型:针对某些系统存储、传输、统计、查询等业务进行大数据量的独立数据量测试;与压力性能测试、负载性能测试、疲劳性能测试相结合的综合数据量测试方案。大数据量测试的关键是测试数据的准备,可以依靠工具准备测试数据。

      速度测试目前主要是针对关键有速度要求的业务进行手工测速度,可以在多次测试的基础上求平均值,可以和工具测得的响应时间等指标做对比分析。

      ·应用在网络上性能的测试

      应用在网络上性能的测试重点是利用成熟先进的自动化技术进行网络应用性能监控、网络应用性能分析和网络预测。

      网络应用性能分析

      网络应用性能分析的目的是准确展示网络带宽、延迟、负载和TCP端口的变化是如何影响用户的响应时间的。利用网络应用性能分析工具,例如Application Expert,能够发现应用的瓶颈,我们可知应用在网络上运行时在每个阶段发生的应用行为,在应用线程级分析应用的问题。可以解决多种问题:客户端是否对数据库服务器运行了不必要的请求?当服务器从客户端接受了一个查询,应用服务器是否花费了不可接受的时间联系数据库服务器?在投产前预测应用的响应时间;利用Application Expert调整应用在广域网上的性能;Application Expert能够让你快速、容易地仿真应用性能,根据最终用户在不同网络配置环境下的响应时间,用户可以根据自己的条件决定应用投产的网络环境。

      网络应用性能监控

      在系统试运行之后,需要及时准确地了解网络上正在发生什么事情;什么应用在运行,如何运行;多少 PC正在访问LAN或WAN;哪些应用程序导致系统瓶颈或资源竞争,这时网络应用性能监控以及网络资源管理对系统的正常稳定运行是非常关键的。利用网络应用性能监控工具,可以达到事半功倍的效果,在这方面我们可以提供的工具是Network Vantage。通俗地讲,它主要用来分析关键应用程序的性能,定位问题的根源是在客户端、服务器、应用程序还是网络。在大多数情况下用户较关心的问题还有哪些应用程序占用大量带宽,哪些用户产生了最大的网络流量,这个工具同样能满足要求。

      网络预测

      考虑到系统未来发展的扩展性,预测网络流量的变化、网络结构的变化对用户系统的影响非常重要。根据规划数据进行预测并及时提供网络性能预测数据。我们利用网络预测分析容量规划工具PREDICTOR可以作到:设置服务水平、完成日网络容量规划、离线测试网络、网络失效和容量极限分析、完成日常故障诊断、预测网络设备迁移和网络设备升级对整个网络的影响。

      从网络管理软件获取网络拓扑结构、从现有的流量监控软件获取流量信息(若没有这类软件可人工生成流量数据),这样可以得到现有网络的基本结构。在基本结构的基础上,可根据网络结构的变化、网络流量的变化生成报告和图表,说明这些变化是如何影响网络性能的。 PREDICTOR提供如下信息:根据预测的结果帮助用户及时升级网络,避免因关键设备超过利用阀值导致系统性能下降;哪个网络设备需要升级,这样可减少网络延迟、避免网络瓶颈;根据预测的结果避免不必要的网络升级。

      ·应用在服务器上性能的测试

      对于应用在服务器上性能的测试,可以采用工具监控,也可以使用系统本身的监控命令,例如Tuxedo中可以使用Top命令监控资源使用情况。实施测试的目的是实现服务器设备、服务器操作系统、数据库系统、应用在服务器上性能的全面监控,测试原理如下图。

      UNIX资源监控指标和描述

      监控指标 描述

      平均负载 系统正常状态下,最后60秒同步进程的平均个数

      冲突率 在以太网上监测到的每秒冲突数

      进程/线程交换率 进程和线程之间每秒交换次数

      CPU利用率 CPU占用率(%)

      磁盘交换率 磁盘交换速率

      接收包错误率 接收以太网数据包时每秒错误数

      包输入率 每秒输入的以太网数据包数目

      中断速率 CPU每秒处理的中断数

      输出包错误率 发送以太网数据包时每秒错误数

      包输入率 每秒输出的以太网数据包数目

      读入内存页速率 物理内存中每秒读入内存页的数目

      写出内存页速率 每秒从物理内存中写到页文件中的内存页数

      目或者从物理内存中删掉的内存页数目

      内存页交换速率 每秒写入内存页和从物理内存中读出页的个数

      进程入交换率 交换区输入的进程数目

      进程出交换率 交换区输出的进程数目

      系统CPU利用率 系统的CPU占用率(%)

      用户CPU利用率 用户模式下的CPU占用率(%)

      磁盘阻塞 磁盘每秒阻塞的字节数

      二、为什么进行性能测试?

      目的是验证软件系统是否能够达到用户提出的性能指标,同时发现软件系统中存在的性能瓶颈,优化软件,最后起到优化系统的目的。

      包括以下几个方面

      1.评估系统的能力,测试中得到的负荷和响应时间数据可以被用于验证所计划的模型的能力,并帮助作出决策。

      2.识别体系中的弱点:受控的负荷可以被增加到一个极端的水平,并突破它,从而修复体系的瓶颈或薄弱的地方。

      3.系统调优:重复运行测试,验证调整系统的活动得到了预期的结果,从而改进性能。

      检测软件中的问题:长时间的测试执行可导致程序发生由于内存泄露引起的失败,揭示程序中的隐含的问题或冲突。

      4.验证稳定性(resilience)可靠性(reliability):在一个生产负荷下执行测试一定的时间是评估系统稳定性和可靠性是否满足要求的唯一方法。

      性能测试类型包括负载测试,强度测试,容量测试等

      负载测试:负载测试是一种性能测试指数据在超负荷环境中运行,程序是否能够承担。

      强度测试: 强度测试是一种性能测试,他在系统资源特别低的情况下软件系统运行情况。

      容量测试:确定系统可处理同时在线的最大用户数

      观察指标:

      性能测试主要是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。

      在实际中作中我们经常会对两种类型软件进行测试:bs和cs,这两方面的性能指标一般需要哪些内容呢?

      Bs结构程序一般会关注的通用指标如下(简):

      Web服务器指标指标:

      * Avg Rps: 平均每秒钟响应次数=总请求时间 / 秒数;

      * Avg time to last byte per terstion (mstes):平均每秒业务角本的迭代次数 ,有人会把这两者混淆;

      * Successful Rounds:成功的请求;

      * Failed Rounds :失败的请求;

      * Successful Hits :成功的点击次数;

      * Failed Hits :失败的点击次数;

      * Hits Per Second :每秒点击次数;

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

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

      * Attempted Connections :尝试链接数;

      CS结构程序,由于一般软件后台通常为数据库,所以我们更注重数据库的测试指标:

      * User 0 Connections :用户连接数,也就是数据库的连接数量;

      * Number of deadlocks:数据库死锁;

      * Butter Cache hit :数据库Cache的命中情况

      当然,在实际中我们还会察看多用户测试情况下的内存,CPU,系统资源调用情况。这些指标其实是引申出来性能测试中的一种:竞争测试。什么是竞争测试,软件竞争使用各种资源(数据纪录,内存等),看他与其他相关系统对资源的争夺能力。

      我们知道软件架构在实际测试中制约着测试策略和工具的选择。如何选择性能测试策略是我们在实际工作中需要了解的。一般软件可以按照系统架构分成几种类型:

      c/s

      client/Server 客户端/服务器架构

      基于客户端/服务器的三层架构

      基于客户端/服务器的分布式架构

      b/s

      基于浏览器/Web服务器的三层架构

      基于中间件应用服务器的三层架构l

      基于Web服务器和中间件的多层架构l

      三、性能测试的步骤

      在每种不同的系统架构的实施中,开发人员可能选择不同的实现方式,造成实际情况纷繁复杂。我们不可能对每种技术都详细解说,这里只是介绍一种方法提供给你如何选择测试策略,从而帮助分析软件不同部分的性能指标,进而分析出整体架构的性能指标和性能瓶颈。

      由于工程和项目的不同,所选用的度量,评估方法也有不同之处。不过仍然有一些通用的步骤帮助我们完成一个性能测试项目。步骤如下

      1.  制定目标和分析系统

      2.  选择测试度量的方法

      3.  学习的相关技术和工具

      4.  制定评估标准

      5.  设计测试用例

      6.  运行测试用例

      7.  分析测试结果

      ·制定目标和分析系统

      每一个性能测试计划中第一步都会制定目标和分析系统构成。只有明确目标和了解系统构成才会澄清测试范围,知道在测试中要掌握什么样的技术。

      目标:

      1.  确定客户需求和期望

      2.  实际业务需求

      3.  系统需求

      系统组成

      系统组成这里包含几方面含义:系统类别,系统构成,系统功能等。了解这些内容的本质其实是帮助我们明确测试的范围,选者适当的测试方法来进行测试。

      系统类别:分清系统类别是我们掌握什么样的技术的前提,掌握相应技术做性能测试才可能成功。例如:系统类别是bs结构,需要掌握 http协议,java,html等技术 。或者是cs结构,可能要了解操作系统,winsock,com等。所以甄别系统类别对于我们来说很重要。

      系统构成:硬件设置,操作系统设置是性能测试的制约条件,一般性能测试都是利用测试工具模仿大量的实际用户操作,系统在超负荷情形下运作。不同的系统构成性能测试就会得到不同的结果。

      系统功能:系统功能指系统提供的不同子系统,办公管理系统中的公文子系统,会议子系统等,系统工能是性能测试中要模拟的环节,了解这些是必要的。

      ·选择测试度量的方法

      经过第一步,将会对系统有清醒的认识。接下来我们将把精力放在软件度量上,收集系统相关的数据。

      度量的相关方面:

      * 制定规范

      * 制定相关流程, 角色,职责

      * 制定改进策略

      * 制定结果对比标准

      ·学习的相关技术和工具

      性能测试是通过工具,模拟大量用户操作,对系统增加负载。所以需要掌握一定的工具知识才能进行性能测试。大家都知道性能测试工具一般通过 winsock,http等协议纪录用户操作。而协议选择是基于软件的系统架构实现(web一般选择http协议,cs选择winsock协议),不同的性能测试工具,脚本语言也不同,比如rational robot中vu脚本用类c语言实现。

      开展性能测试需要对各种性能测试工具进行评估,因为每一种性能测试工具都有自身的特点,只有经过工具评估,才能选择符合现有软件架构的性能测试工具。确定测试工具后,需要组织测试人员进行工具的学习,培训相关技术。

      ·制定评估标准

      任何测试的目的都是确保软件符合预先规定的目标和要求。性能测试也不例外。所以必须制定一套标准。

      通常性能测试有四种模型技术可用于评估:

      *线性投射:用大量的过去的,扩展的或者将来可能发生的数据组成散布图,利用这个图表不断和系统的当前状况对比。

      *分析模型:用排队论公式和算法预测响应时间,利用描述工作量的数据和系统本质关联起来

      *模仿:模仿实际用户的使用方法测试你的系统

      *基准:定义测试和你最初的测试作为标准,利用它和所有后来进行的测试结果进行对比

      ·设计测试用例

      设计测试用例是在了解软件业务流程的基础上。设计测试用例的原则是受最小的影响提供最多的测试信息,设计测试用例的目标是一次尽可能的包含多个测试要素。这些测试用例必须是测试工具可以实现的,不同的测试场景将测试不同的功能。因为性能测试不同于平时的测试用例,尽可能把性能测试用例设计的复杂,才有可能发现软件的性能瓶颈。

      ·运行测试用例

      通过性能测试工具运行测试用例。同一环境下作的性能测试得到的测试结果是不准确的,所以在运行这些测试用例的时候,需要用不同的测试环境,不同的机器配置上运行。

      ·分析测试结果

      运行测试用例后,收集相关信息,进行数据统计分析,找到性能瓶颈。通过排除误差和其他因素,让测试结果体现接近真实情况。不同的体系结构分析测试结果的方法也不同,bs结构我们会分析网络带宽,流量对用户操作响应的影响,而cs结构我们可能更关心会系统整体配置对用户操作的影响。

      四、性能测试方法

      对于企业应用程序,有许多进行性能测试的方法,其中一些方法实行起来要比其他方法困难。所要进行的性能测试的类型取决于想要达到的结果。例如,对于可再现性,基准测试是最好的方法。而要从当前用户负载的角度测试系统的上限,则应该使用容量规划测试。本文将介绍几种设置和运行性能测试的方法,并讨论这些方法的区别。

      如果不进行合理的规划,对J2EE应用程序进行性能测试将会是一项令人望而生畏且有些混乱的任务。因为对于任何的软件开发流程,都必须收集需求、理解业务需要,并在进行实际测试之前设计出正式的进度表。性能测试的需求由业务需要驱动,并由一组用例阐明。这些用例可以基于历史数据(例如,服务器一周的负载模式)或预测的近似值。弄清楚需要测试的内容之后,就需要知道如何进行测试了。

      在开发阶段前期,应该使用基准测试来确定应用程序中是否出现性能倒退。基准测试可以在一个相对短的时间内收集可重复的结果。进行基准测试的最好方法是,每次测试改变一个且只改变一个参数。例如,如果想知道增加JVM内存是否会影响应用程序的性能,就逐次递增JVM内存(例如,从1024 MB增至1224 MB,然后是1524 MB,最后是2024 MB),在每个阶段收集结果和环境数据,记录信息,然后转到下一阶段。这样在分析测试结果时就有迹可循。下一小节我将介绍什么是基准测试,以及运行基准测试的最佳参数。

      开发阶段后期,在应用程序中的bug已经被解决,应用程序达到一种稳定状态之后,可以运行更为复杂的测试,确定系统在不同的负载模式下的表现。这些测试被称为容量规划测试、渗入测试(soak test)、峰谷测试(peak-rest test),它们旨在通过测试应用程序的可靠性、健壮性和可伸缩性来测试接近于现实世界的场景。对于下面的描述应该从抽象的意义上理解,因为每个应用程序的使用模式都是不同的。例如,容量规划测试通常都使用较缓慢的ramp-up(下文有定义),但是如果应用程序在一天之中的某个时段中有快速突发的流量,那么自然应该修改测试以反映这种情况。但是,要记住,因为更改了测试参数(比如ramp-up周期或用户的考虑时间(think-time)),测试的结果肯定也会改变。一个不错的方法是,运行一系列的基准测试,确立一个已知的可控环境,然后再对变化进行比较。

      基准测试

      基准测试的关键是要获得一致的、可再现的结果。可再现的结果有两个好处:减少重新运行测试的次数;对测试的产品和产生的数字更为确信。使用的性能测试工具可能会对测试结果产生很大影响。假定测试的两个指标是服务器的响应时间和吞吐量,它们会受到服务器上的负载的影响。服务器上的负载受两个因素影响:同时与服务器通信的连接(或虚拟用户)的数目,以及每个虚拟用户请求之间的考虑时间的长短。很明显,与服务器通信的用户越多,负载就越大。同样,请求之间的考虑时间越短,负载也越大。这两个因素的不同组合会产生不同的服务器负载等级。记住,随着服务器上负载的增加,吞吐量会不断攀升,直到到达一个点。

      图1.随着负载的增加,系统吞吐量的曲线(单位:页面/秒)

      注意,吞吐量以稳定的速度增长,然后在某一个点上稳定下来。

      在某一点上,执行队列开始增长,因为服务器上所有的线程都已投入使用,传入的请求不再被立即处理,而是放入队列中,当线程空闲时再处理。

      图2. 随着负载的增加,系统执行队列长度的曲线

      注意,最初的一段时间,执行队列的长度为零,然后就开始以稳定的速度增长。这是因为系统中的负载在稳定增长,虽然最初系统有足够的空闲线程去处理增加的负载,最终它还是不能承受,而必须将其排入队列。

      当系统达到饱和点,服务器吞吐量保持稳定后,就达到了给定条件下的系统上限。但是,随着服务器负载的继续增长,系统的响应时间也随之延长,虽然吞吐量保持稳定。

      图3. 随着负载的增加,系统中两个事务的响应时间曲线

      注意,在执行队列(图2)开始增长的同时,响应时间也开始以递增的速度增长。这是因为请求不能被及时处理。

      为了获得真正可再现的结果,应该将系统置于相同的高负载下。为此,与服务器通信的虚拟用户应该将请求之间的考虑时间设为零。这样服务器会立即超载,并开始构建执行队列。如果请求(虚拟用户)数保持一致,基准测试的结果应该会非常精确,完全可以再现。

      您可能要问的一个问题是:“如何度量结果?”对于一次给定的测试,应该取响应时间和吞吐量的平均值。精确地获得这些值的唯一方法是一次加载所有的用户,然后在预定的时间段内持续运行。这称为“flat”测试。

      图4. flat测试的情况(所有的用户都是同时加载的)

      与此相对应的是“ramp-up”测试。

      图5. ramp-up测试的情况(在测试期间,用户以稳定速度(每秒x个)增加)

      ramp-up测试中的用户是交错上升的(每几秒增加一些新用户)。ramp-up测试不能产生精确和可重现的平均值,这是因为由于用户的增加是每次一部分,系统的负载在不断地变化。因此,flat运行是获得基准测试数据的理想模式。

      这不是在贬低ramp-up测试的价值。实际上,ramp-up测试对找出以后要运行的flat测试的范围非常有用。ramp-up测试的优点是,可以看出随着系统负载的改变,测量值是如何改变的。然后可以据此选择以后要运行的flat测试的范围。

      Flat测试的问题是系统会遇到“波动”效果。

      图6. 一次flat测试中所测得的系统吞吐量的曲线(单位:页面/秒)

      注意波动的出现,吞吐量不再是平滑的。

      这在系统的各个方面都有所体现,包括CPU的使用量。

      图7. 一次flat测试中所测得的系统CPU使用量随时间变化的曲线

      注意,每隔一段时间就会出现一个波形。CPU使用量不再是平滑的,而是有了像吞吐量图那样的尖峰。

      此外,执行队列也承受着不稳定的负载,因此可以看到,随着系统负载的增加和减少,执行队列也在增长和缩减。

      图8. 一次flat测试中所测得的系统执行队列的曲线

      注意,每隔一段时间就会出现一个波形。执行队列曲线与上面的CPU使用量图非常相似。

      最后,系统中事务的响应时间也遵循着这个波动模式。

      图9. 一次flat测试中所测得的系统事务的响应时间

      注意,每隔一段时间就会出现一个波形。事务的响应时间也与上面的图类似,只不过其效果随着时间的推移逐渐减弱。

      当测试中所有的用户都同时执行几乎相同的操作时,就会发生这种现象。这将会产生非常不可靠和不精确的结果,所以必须采取一些措施防止这种情况的出现。有两种方法可以从这种类型的结果中获得精确的测量值。如果测试可以运行相当长的时间(有时是几个小时,取决于用户的操作持续的时间),最后由于随机事件的本性使然,服务器的吞吐量会被“拉平”。或者,可以只选取波形中两个平息点之间的测量值。该方法的缺点是可以捕获数据的时间非常短。

      性能规划测试

      对于性能规划类型的测试来说,其目标是找出,在特定的环境下,给定应用程序的性能可以达到何种程度。此时可重现性就不如在基准测试中那么重要了,因为测试中通常都会有随机因子。引入随机因子的目的是为了尽量模拟具有真实用户负载的现实世界应用程序。通常,具体的目标是找出系统在特定的服务器响应时间下支持的当前用户的最大数。例如,您可能想知道:如果要以5秒或更少的响应时间支持8,000个当前用户,需要多少个服务器?要回答这个问题,需要知道系统的更多信息。

      要确定系统的容量,需要考虑几个因素。通常,服务器的用户总数非常大(以十万计),但是实际上,这个数字并不能说明什么。真正需要知道的是,这些用户中有多少是并发与服务器通信的。其次要知道的是,每个用户的“考虑时间”即请求间时间是多少。这非常重要,因为考虑时间越短,系统所能支持的并发用户越少。例如,如果用户的考虑时间是1秒,那么系统可能只能支持数百个这样的并发用户。但是,如果用户的考虑时间是30秒,那么系统则可能支持数万个这样的并发用户(假定硬件和应用程序都是相同的)。在现实世界中,通常难以确定用户的确切考虑时间。还要注意,在现实世界中,用户不会精确地按照间隔时间发出请求。

      于是就引入了随机性。如果知道普通用户的考虑时间是5秒,误差为20%,那么在设计负载测试时,就要确保请求间的时间为5×(1 +/- 20%)秒。此外,可以利用“调步”的理念向负载场景中引入更多的随机性。它是这样的:在一个虚拟用户完成一整套的请求后,该用户暂停一个设定的时间段,或者一个小的随机时间段(例如,2×(1 +/- 25%)秒),然后再继续执行下一套请求。将这两种随机化方法运用到测试中,可以提供更接近于现实世界的场景。

      现在该进行实际的容量规划测试了。接下来的问题是:如何加载用户以模拟负载状态?最好的方法是模拟高峰时间用户与服务器通信的状况。这种用户负载状态是在一段时间内逐步达到的吗?如果是,应该使用ramp-up类型的测试,每隔几秒增加x个用户。或者,所有用户是在一个非常短的时间内同时与系统通信?如果是这样,就应该使用flat类型的测试,将所有的用户同时加载到服务器。两种不同类型的测试会产生没有可比性的不同测试。例如,如果进行ramp-up类型的测试,系统可以以4秒或更短的响应时间支持5,000个用户。而执行flat测试,您会发现,对于5,000个用户,系统的平均响应时间要大于4秒。这是由于ramp-up测试固有的不准确性使其不能显示系统可以支持的并发用户的精确数字。以门户应用程序为例,随着门户规模的扩大和集群规模的扩大,这种不确定性就会随之显现。

      这不是说不应该使用ramp-up测试。对于系统负载在一段比较长的时间内缓慢增加的情况,ramp-up测试效果还是不错的。这是因为系统能够随着时间不断调整。如果使用快速ramp-up测试,系统就会滞后,从而报告一个较相同用户负载的flat测试低的响应时间。那么,什么是确定容量的最好方法?结合两种负载类型的优点,并运行一系列的测试,就会产生最好的结果。例如,首先使用 ramp-up测试确定系统可以支持的用户范围。确定了范围之后,以该范围内不同的并发用户负载进行一系列的flat测试,更精确地确定系统的容量。

      渗入测试

      渗入测试是一种比较简单的性能测试。渗入测试所需时间较长,它使用固定数目的并发用户测试系统的总体健壮性。这些测试将会通过内存泄漏、增加的垃圾收集(GC)或系统的其他问题,显示因长时间运行而出现的任何性能降低。测试运行的时间越久,您对系统就越了解。运行两次测试是一个好主意——一次使用较低的用户负载(要在系统容量之下,以便不会出现执行队列),一次使用较高的负载(以便出现积极的执行队列)。

      测试应该运行几天的时间,以便真正了解应用程序的长期健康状况。要确保测试的应用程序尽可能接近现实世界的情况,用户场景也要逼真(虚拟用户通过应用程序导航的方式要与现实世界一致),从而测试应用程序的全部特性。确保运行了所有必需的监控工具,以便精确地监测并跟踪问题。

      峰谷测试

      峰谷测试兼有容量规划ramp-up类型测试和渗入测试的特征。其目标是确定从高负载(例如系统高峰时间的负载)恢复、转为几乎空闲、然后再攀升到高负载、再降低的能力。

      实现这种测试的最好方法就是,进行一系列的快速ramp-up测试,继之以一段时间的平稳状态(取决于业务需求),然后急剧降低负载,此时可以令系统平息一下,然后再进行快速的ramp-up;反复重复这个过程。这样可以确定以下事项:第二次高峰是否重现第一次的峰值?其后的每次高峰是等于还是大于第一次的峰值?在测试过程中,系统是否显示了内存或GC性能降低的有关迹象?测试运行(不停地重复“峰值 /空闲”周期)的时间越长,您对系统的长期健康状况就越了解。

      结束语

      本文介绍了进行性能测试的几种方法。取决于业务需求、开发周期和应用程序的生命周期,对于特定的企业,某些测试会比其他的更适合。但是,对于任何情况,在决定进行某一种测试前,都应该问自己一些基本问题。这些问题的答案将会决定哪种测试方法是最好的。

      这些问题包括:

      结果的可重复性需要有多高?

      测试需要运行和重新运行几次?

      您处于开放周期的哪个阶段?

      您的业务需求是什么?

      您的用户需求是什么?

      您希望生产中的系统在维护停机时间中可以持续多久?

      在一个正常的业务日,预期的用户负载是多少?

      将这些问题的答案与上述性能测试类型相对照,应该就可以制定出测试应用程序的总体性能的完美计划。

      参考资料

      WebLogic Server Performance and Tuning——WebLogic Server产品文档

      WebLogic Server performance tools and information——WebLogic Server产品文档

      The Grinder: Load Testing for Everyone(dev2dev,2002年11月),作者Philip Aston

      Performance Tuning Guide——WebLogic Portal产品文档

      dev2dev WebLogic Server Product Center

      原文出处

      http://dev2dev.bea.com/pub/a/2005/09/performance_testing.html


  • 关于Debug和Release的区别之讨论

    2008-11-28 16:07:14

    关于Debug和Release的区别之讨论本文主要包含如下内容:

    1. Debug 和 Release 编译方式的本质区别
    2. 哪些情况下 Release 版会出错
    2. 怎样“调试” Release 版的程序


    一、Debug 和 Release 编译方式的本质区别
    Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程
    序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度
    上都是最优的,以便用户很好地使用。
    Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项
    (当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Rele
    ase 版错误,在此不讨论)
    Debug 版本:
    /MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)
    /Od 关闭优化开关
    /D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对
    assert函数)
    /ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过
    程中如果修改了源代码不需重新编译
    /GZ 可以帮助捕获内存错误
    /Gm 打开最小化重链接开关,减少链接时间

    Release 版本:
    /MD /ML 或 /MT 使用发布版本的运行时刻函数库
    /O1 或 /O2 优化开关,使程序最小或最快
    /D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)
    /GF 合并重复的字符串,并将字符串常量放到只读内存,防止
    被修改
    实际上,Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译
    器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调
    试版本或是带跟踪语句的发布版本。

    二、哪些情况下 Release 版会出错

    有了上面的介绍,我们再来逐个对照这些选项看看 Release 版错误是怎样产生的

    1. Runtime Library:

    2. 优化:这类错误主要有以下几种:

    (1) 帧指针(Frame Pointer)省略(简称 FPO ):在函数调用过程中,所有调用信息
    (返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返
    回值、调用方式),就会产生错误————但 Debug 方式下,栈的访问通过 EBP 寄存器
    保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能
    正常执行;Release 方式下,优化会省略 EBP 栈基址指针,这样通过一个全局指针访问栈
    就会造成返回地址错误是程序崩溃。C++ 的强类型特性能检查出大多数这样的错误,但如
    果用了强制类型转换,就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关
    掉帧指针省略,以确定是否此类错误。
    (2) volatile 型变量:volatile 告诉编译器该变量可能被程序之外的未知方式修改
    (如系统、其他进程和线程)。

    (3) 变量优化:优化程序会根据变量的使用情况优化变量。例如,函数中有一个未被
    使用的变量,在 Debug 版中它有可能掩盖一个数组越界,而在 Release 版中,这个变量
    很可能被优化调,此时数组越界会破坏栈中有用的数据。当然,实际的情况会比这复杂得
    多。与此有关的错误有:

    3. _DEBUG 与 NDEBUG :当定义了 _DEBUG 时,assert() 函数会被编译,而 NDEBUG 时不
    被编译。除此之外,VC++中还有一系列断言宏。这包括:

    ANSI C 断言 void assert(int expression );
    C Runtime Lib 断言 _ASSERT( booleanExpression );
    _ASSERTE( booleanExpression );
    MFC 断言 ASSERT( booleanExpression );
    VERIFY( booleanExpression );
    ASSERT_VALID( pObject );
    ASSERT_KINDOF( classname, pobject );
    ATL 断言 ATLASSERT( booleanExpression );
    此外,TRACE() 宏的编译也受 _DEBUG 控制。

    4. /GZ 选项:这个选项会做以下这些事

    (1) 初始化内存和变量。
    (2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原
    形不匹配)
    (3) 函数返回前检查栈指针,确认未被修改.

    三、怎样“调试” Release 版的程序

    1. 前面已经提过,Debug 和 Release 只是一组编译选项的差别,实际上并没有什么
    定义能区分二者。我们可以修改 Release 版的编译选项来缩小错误范围。如上所述,可以
    把 Release 的选项逐个改为与之相对的 Debug 选项,如 /MD 改为 /MDd、/O1 改为 /Od
    ,或运行时间优化改为程序大小优化。注意,一次只改一个选项,看改哪个选项时错误消
    失,再对应该选项相关的错误,针对性地查找。这些选项在 Project\Settings... 中都可
    以直接通过列表选取,通常不要手动修改。由于以上的分析已相当全面,这个方法是最有
    效的。
    2.你也可以像 Debug 一样调试你的 Release 版,只要加入调试符号。在 Project/S
    ettings... 中,选中 Settings for "Win32 Release",选中 C/C++ 标签,Category 选
    General,Debug Info 选 Program Database。再在 Link 标签 Project options 最后
    加上 "/OPT:REF" (引号不要输)。

  • expr命令用法-实例讲解

    2008-11-26 09:06:30

    expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
    –格式为:
    expr Expression(命令读入Expression 参数,计算它的值,然后将结果写入到标准输出)
    –参数应用规则:
    用空格隔开每个项;
    用 \ (反斜杠) 放在 shell 特定的字符前面;
    对包含空格和其他特殊字符的字符串要用引号括起来

    –expr用法实例讲解:
    (1)、计算字串长度
     > expr length “this is a test”
     14
    (2)、抓取字串
     > expr substr “this is a test” 3 5
     is is
    (3)、抓取第一个字符数字串出现的位置
     > expr index “sarasara”  a
     2
    (4)、字串真实重现
     > expr quote sara
     sara
    (5)、整数运算
     > expr 14 % 9
     5
     > expr 10 + 10
     20
     > expr 1000 + 900
     1900
     > expr 30 / 3 / 2
     5
     > expr 30 \* 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
     90
     > expr 30 * 3
     expr: Syntax error
    (6)、增量计数
    说明:expr在循环中用于增量计算。先将变量初始化为0,然后循环值加1,反引号的用法为命令替代。
    > LOOP=0
    > LOOP=`expr $LOOP + 1`
    (7)、数值测试
    说明:用expr测试一个数。如果试图计算非整数,则会返回错误。
    > rr=3.4
    > expr $rr + 1
    expr: non-numeric argument
    > rr=5
    > expr $rr + 1
    6
    (8)、模式匹配
    说明:expr也有模式匹配功能。可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次。
    > VALUE=account.doc
    > expr $VALUE : ‘.*’
    8
    在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名。
    $expr $VALUE : ‘\(.*\).doc’
    accounts

  • VB提示:文件未找到:'c:\windows\sytem32\ieframe.dll\1'的解决方法

    2008-11-17 23:56:19

    VB提示:文件未找到:'c:\windows\sytem32\ieframe.dll\1'的解决方法


    这个是由于ie7.0的bug引起的。

    把以下内容做成一个注册表文件fixieframe.reg,导入注册表即可:

    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}]
    [HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1]
    @="Microsoft Internet Controls"
    [HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1\0]
    [HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1\0\win32]
    @="C:\\WINDOWS\\system32\\ieframe.dll"

  • SQL Server 安装:以前的某个程序安装已在安装计算机上创建挂起的文件操作

    2008-11-17 00:24:54

    今天帮朋友的机器安装SQL Server 2000时遇到错误提示:“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”,这种情况过去也遇到过,但是重起机器之后一般都能正常安装。但是今天重起之后问题依然,该机器上以前没安装过SQL Server,于是就开始删除机器上的临时文件,用工具清理注册表,再次安装仍然提示上面的信息。最后在网上搜了一下问题解决了。

    解决方法:

    打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目,并删除它。这样就可以清除安装暂挂项目。

  • 系统启动时至少有一个服务或驱动程序产生错误 解决方法

    2008-11-17 00:06:00

    server2003/xp/2000 每次弹出服务控制管理器“系统启动时至少有一个服务或驱动程序产生错误”解决方法。把以下注册表用记事本编辑,保存为**.reg ,直接点击导入即可。
    Windows Registry Editor Version 5.00
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows]
    "NoPopUpsOnBoot"=dword:00000001
    如果导入失败,请进程手动操作。找到[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows]
    右键新建dword值,命名为NoPopUpsOnBoot,设其值为“1”
    OK,

  • linux下解压zip文件

    2008-11-05 17:36:18

    linux自带的unzip命令可以解压windows下的zip格式的压缩文件。

    unzip命令

      语法:unzip [选项] 压缩文件名.zip

      各选项的含义分别为:

      -x 文件列表 解压缩文件,但不包括指定的file文件。

      -v 查看压缩文件目录,但不解压。

      -t 测试文件有无损坏,但不解压。

      -d 目录 把压缩文件解到指定目录下。

      -z 只显示压缩文件的注解。

      -n 不覆盖已经存在的文件。

      -o 覆盖已存在的文件且不要求用户确认。

      -j 不重建文档的目录结构,把所有文件解压到同一目录下。

      例1:将压缩文件text.zip在当前目录下解压缩。

      $ unzip text.zip

      例2:将压缩文件text.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令不覆盖原先的文件。

      $ unzip -n text.zip -d /tmp

      例3:查看压缩文件目录,但不解压。

      $ unzip -v text.zip

      zgrep命令

      这个命令的功能是在压缩文件中寻找匹配的正则表达式,用法和grep命令一样,只不过操作的对象是压缩文件。如果用户想看看在某个压缩文件中有没有某一句话,便可用zgrep命令。

     

    小技巧:当我们在windows下用ssh往linux中传送的文件较多时,可以先用winrar将其压缩成zip格式,然后再在linux中用unzip命令解压。

  • Win32 Application和Win32 Console Application区别

    2008-10-17 14:20:11

    Win32 Application和Win32 Console Application
    都是工作在32位Windows环境的程序。

    其中Win32 Application
    就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,比如圆形的、不规则形状的……
    它们都是所谓的GUI(Graphics User Interface图形用户接口),我们可以通过鼠标点击来完成控制。

    而 Win32 Console Application(win32控制台应用程序)
    往往是像MS-DOS窗口(XP中叫命令提示符)的样子出现,我们得用键盘输入各种命令来使用它;
    或者叫CUI(Character User Interface字符用户接口)。

    win32应用程序。这个指一般最常见的win32应用程序
    win32控制台应用程序。一般指类似DOS环境出现的命令行样式,现在叫命令提示符。可以键盘来运行一些常见指令。

  • 在VC6.0用file->open后,出现“MSDEV.EXE-应用程序错误 遇到问题需要关闭。

    2008-10-17 14:11:36

    最近用VC6.0时,用file->open后,出现“Microsoft (R) Developer Studio 遇到问题需要关闭。我们对此引起的不便表示抱歉”
    另外,在用VC编译程序时,经常是点击了编译按钮或者链接按钮以后就没反应了,必须在任务管理器里把VC关掉重开,但是我现在的VC不管怎么弄,只能编译,一点链接就没反应了,郁闷!有知道的吗?谢谢了
    最佳答案

    VC的编译有时会出点问题,打上sp6补丁就好多了。我打了sp6补丁,编译基本没再出过问题。
    中文版VC6.0 sp6补丁下载地址:
    http://download.microsoft.com/download/e/c/9/ec94a5d4-d0cf-4484-8b7a-21802f497309/Vs6sp6.exe
    英文版VC6.0 sp6补丁下载地址:
    http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=a8494edb-2e89-4676-a16a-5c5477cb9713&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f1%2f9%2ff%2f19fe4660-5792-4683-99e0-8d48c22eed74%2fVs6sp6.exe

    装完visual studio 6.0后发现vc6.0中“打开”功能不能用,点击“打开”之后会出现错误,MSDEV.EXE-应用程序错误 “0x73d311c7”指令引用的“0x00000004”内存,该内存不能为“read”。 我在网上看到有的网友也出现过类似问题,说是跟office2007冲突了。我就把office2007卸载了,发现问题果然消除了。把office2007装上又出问题。
    网友说把vc6.0sp6的补丁包装上就可以了,我是装了,但还是不行。

    打开补丁后选择VC6.0的安装目录就可以了,安装好后在安装目录里有个好像是news的文本,你查看它的属性看修改时间就知道是否装好了

    如果程序编译没有错误,但运行时候出现“......遇到问题需要关闭。我们对此引起的不便表示抱歉”我觉得很大的一部分原因都是因为你的程序的问题,而且大部分都是内存使用错误,注意你的指针和数组的使用,看有没有使用越界或其他的错误!

  • 教你打开多个飞信窗口

    2008-10-08 11:35:33

    默认安装飞信的只能在电脑上打开一个窗口,曾经有很多用户询问移动官方,都被告知不能实现。但其实是支持的,现在我们可以通过小修改在电脑上打开多个窗口:


    1、打开飞信的安装目录,找到Client.config文件,一般在C:/Program Files/China Mobile/Fetion/Client.config

    2、用记事本打开,内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <ImpsConfiguration>
      <AppSettings>
        <add key="BuildDate" value="2008-5-27 12:43:17" />
        <add key="LinkType" value="DotNetVM" />
        <add key="Version" value="3.3.0599" />
      </AppSettings>
    </ImpsConfiguration>

    3、在三个<add key=*****>后面增加一行:

        <add key="SingleInstance" value="false"/>

    4、也就是这样:

    <?xml version="1.0" encoding="utf-8"?>
    <ImpsConfiguration>
      <AppSettings>
        <add key="BuildDate" value="2008-5-27 12:43:17" />
        <add key="LinkType" value="DotNetVM" />
        <add key="Version" value="3.3.0599" />
        <add key="SingleInstance" value="false"/>
      </AppSettings>
    </ImpsConfiguration>

    保存!可以在电脑上开N个飞信窗口了。

  • 电脑文件名变蓝色的原因

    2008-09-07 23:56:30

    原因:被NTFS压缩或加密过的文件名就会变成蓝色,如果是使用EFS加密了就是绿色的。 

    实现:文件→属性→启用文件压缩; 
       控制面板→文件夹选项→查看→“用彩色显示加密或者压缩的NTFS文件”。 

    恢复:控制面板→文件夹选项→查看→“用彩色显示加密或者压缩的NTFS文件”前面的勾去
          掉→确定。 

        我的电脑→右击压缩过的分区→在“常规”选项卡下取消“压缩驱动器以节约磁盘空间”前的小勾。如果不是整个磁盘都压缩而是单个文件压缩的话,可以在该压缩文件上右击→属性→常规→高级,取消“压缩文件以节省磁盘空间”前的小勾即可。 

    PS:压缩过的NTFS磁盘分区在读取的时候速度会变慢,因为在读取时需要解压。一般情况下不建议压缩!

312/2<12
Open Toolbar