灿烂的阳光,苦涩的生活,认真做,你能行!

发布新日志

  • 软件安全性能测试(转载)

    2013-06-01 20:06:58

    近来,在我负责的公司某软件产品的最后测试工作,常常被问到这样一个问题:在做测试过程中,我们的软件产品在安全性方面考虑了多少?应该如何测评一个软件到底有多安全?
      这个软件因为涉及客户商业上重要的信息资料,因此用户关心的核心问题始终围绕“这个软件安全吗”。一个由于设计导致的安全漏洞和一个由于实现导致的安全漏洞,对用户的最终影响都是巨大的。我的任务就是确保这个软件在安全性方面能满足客户期望。
      一、什么是软件安全性测试
      (1)什么是软件安全
      软件安全属于软件领域里一个重要的子领域。在以前的单机时代,安全问题主要是操作系统容易感染病毒,单机应用程序软件安全问题并不突出。但是自从互联网普及后,软件安全问题愈加显加突显,使得软件安全性测试的重要性上升到一个前所未有的高度。
      软件安全一般分为两个层次,即应用程序级别的安全性和操作系统级别的安全性。应用程序级别的安全性,包括对数据或业务功能的访问,在预期的安全性情况下,操作者只能访问应用程序的特定功能、有限的数据等。操作系统级别的安全性是确保只有具备系统平台访问权限的用户才能访问,包括对系统的登录或远程访问。
      本文所讲的软件安全主要是应用程序层的安全,包括两个层面:①是应用程序本身的安全性。一般来说,应用程序的安全问题主要是由软件漏洞导致的,这些漏洞可以是设计上的缺陷或是编程上的问题,甚至是开发人员预留的后门。②是应用程序的数据安全,包括数据存储安全和数据传输安全两个方面。
      (2)软件安全性测试
      一般来说,对安全性要求不高的软件,其安全性测试可以混在单元测试、集成测试、系统测试里一起做。但对安全性有较高需求的软件,则必须做专门的安全性测试,以便在破坏之前预防并识别软件的安全问题。
      安全性测试(Security Testing)是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程。应用程序级安全测试的主要目的是查找软件自身程序设计中存在的安全隐患,并检查应用程序对非法侵入的防范能力,根据安全指标不同测试策略也不同。注意:安全性测试并不最终证明应用程序是安全的,而是用于验证所设立策略的有效性,这些对策是基于威胁分析阶段所做的假设而选择的。例如,测试应用软件在防止非授权的内部或外部用户的访问或故意破坏等情况时的运作。
      二、软件安全性测试过程
      (1)安全性测试方法
      有许多的测试手段可以进行安全性测试,目前主要安全测试方法有:
      ①静态的代码安全测试:主要通过对源代码进行安全扫描,根据程序中数据流、控制流、语义等信息与其特有软件安全规则库进行匹对,从中找出代码中潜在的安全漏洞。静态的源代码安全测试是非常有用的方法,它可以在编码阶段找出所有可能存在安全风险的代码,这样开发人员可以在早期解决潜在的安全问题。而正因为如此,静态代码测试比较适用于早期的代码开发阶段,而不是测试阶段。
      ②动态的渗透测试:渗透测试也是常用的安全测试方法。是使用自动化工具或者人工的方法模拟黑客的输入,对应用系统进行攻击性测试,从中找出运行时刻所存在的安全漏洞。这种测试的特点就是真实有效,一般找出来的问题都是正确的,也是较为严重的。但渗透测试一个致命的缺点是模拟的测试数据只能到达有限的测试点,覆盖率很低。
      ③程序数据扫描。一个有高安全性需求的软件,在运行过程中数据是不能遭到破坏的,否则就会导致缓冲区溢出类型的攻击。数据扫描的手段通常是进行内存测试,内存测试可以发现许多诸如缓冲区溢出之类的漏洞,而这类漏洞使用除此之外的测试手段都难以发现。例如,对软件运行时的内存信息进行扫描,看是否存在一些导致隐患的信息,当然这需要专门的工具来进行验证,手工做是比较困难的。
      (2)反向安全性测试过程
      大部分软件的安全测试都是依据缺陷空间反向设计原则来进行的,即事先检查哪些地方可能存在安全隐患,然后针对这些可能的隐患进行测试。因此,反向测试过程是从缺陷空间出发,建立缺陷威胁模型,通过威胁模型来寻找入侵点,对入侵点进行已知漏洞的扫描测试。好处是可以对已知的缺陷进行分析,避免软件里存在已知类型的缺陷,但是对未知的攻击手段和方法通常会无能为力。
      ①建立缺陷威胁模型。建立缺陷威胁模型主要是从已知的安全漏洞入手,检查软件中是否存在已知的漏洞。建立威胁模型时,需要先确定软件牵涉到哪些专业领域,再根据各个专业领域所遇到的攻击手段来进行建模。
      ②寻找和扫描入侵点。检查威胁模型里的哪些缺陷可能在本软件中发生,再将可能发生的威胁纳入入侵点矩阵进行管理。如果有成熟的漏洞扫描工具,那么直接使用漏洞扫描工具进行扫描,然后将发现的可疑问题纳入入侵点矩阵进行管理。
      ③入侵矩阵的验证测试。创建好入侵矩阵后,就可以针对入侵矩阵的具体条目设计对应的测试用例,然后进行测试验证。
      (3)正向安全性测试过程
      为了规避反向设计原则所带来的测试不完备性,需要一种正向的测试方法来对软件进行比较完备的测试,使测试过的软件能够预防未知的攻击手段和方法。
      ①先标识测试空间。对测试空间的所有的可变数据进行标识,由于进行安全性测试的代价高昂,其中要重点对外部输入层进行标识。例如,需求分析、概要设计、详细设计、编码这几个阶段都要对测试空间进行标识,并建立测试空间跟踪矩阵。
      ②精确定义设计空间。重点审查需求中对设计空间是否有明确定义,和需求牵涉到的数据是否都标识出了它的合法取值范围。在这个步骤中,最需要注意的是精确二字,要严格按照安全性原则来对设计空间做精确的定义。
      ③标识安全隐患。根据找出的测试空间和设计空间以及它们之间的转换规则,标识出哪些测试空间和哪些转换规则可能存在安全隐患。例如,测试空间愈复杂,即测试空间划分越复杂或可变数据组合关系越多也越不安全。还有转换规则愈复杂,则出问题的可能性也愈大,这些都属于安全隐患。
      ④建立和验证入侵矩阵。安全隐患标识完成后,就可以根据标识出来的安全隐患建立入侵矩阵。列出潜在安全隐患,标识出存在潜在安全隐患的可变数据,和标识出安全隐患的等级。其中对于那些安全隐患等级高的可变数据,必须进行详尽的测试用例设计。
      (4)正向和反向测试的区别
      正向测试过程是以测试空间为依据寻找缺陷和漏洞,反向测试过程则是以已知的缺陷空间为依据去寻找软件中是否会发生同样的缺陷和漏洞,两者各有其优缺点。反向测试过程主要的一个优点是成本较低,只要验证已知的可能发生的缺陷即可,但缺点是测试不完善,无法将测试空间覆盖完整,无法发现未知的攻击手段。正向测试过程的优点是测试比较充分,但工作量相对来说较大。因此,对安全性要求较低的软件,一般按反向测试过程来测试即可,对于安全性要求较高的软件,应以正向测试过程为主,反向测试过程为辅。
      三、常见的软件安全性缺陷和漏洞
      软件的安全有很多方面的内容,主要的安全问题是由软件本身的漏洞造成的,下面介绍常见的软件安全性缺陷和漏洞。
      (1)缓冲区溢出
      缓冲区溢出已成为软件安全的头号公敌,许多实际中的安全问题都与它有关。造成缓冲区溢出问题通常有以下两种原因。①设计空间的转换规则的校验问题。即缺乏对可测数据的校验,导致非法数据没有在外部输入层被检查出来并丢弃。非法数据进入接口层和实现层后,由于它超出了接口层和实现层的对应测试空间或设计空间的范围,从而引起溢出。②局部测试空间和设计空间不足。当合法数据进入后,由于程序实现层内对应的测试空间或设计空间不足,导致程序处理时出现溢出。
      (2)加密弱点
      这几种加密弱点是不安全的:①使用不安全的加密算法。加密算法强度不够,一些加密算法甚至可以用穷举法破解。②加密数据时密码是由伪随机算法产生的,而产生伪随机数的方法存在缺陷,使密码很容易被破解。③身份验证算法存在缺陷。④客户机和服务器时钟未同步,给攻击者足够的时间来破解密码或修改数据。⑤未对加密数据进行签名,导致攻击者可以篡改数据。所以,对于加密进行测试时,必须针对这些可能存在的加密弱点进行测试。
      (3)错误处理
      一般情况下,错误处理都会返回一些信息给用户,返回的出错信息可能会被恶意用户利用来进行攻击,恶意用户能够通过分析返回的错误信息知道下一步要如何做才能使攻击成功。如果错误处理时调用了一些不该有的功能,那么错误处理的过程将被利用。错误处理属于异常空间内的处理问题,异常空间内的处理要尽量简单,使用这条原则来设计可以避免这个问题。但错误处理往往牵涉到易用性方面的问题,如果错误处理的提示信息过于简单,用户可能会一头雾水,不知道下一步该怎么操作。所以,在考虑错误处理的安全性的同时,需要和易用性一起进行权衡。
      (4)权限过大
      如果赋予过大的权限,就可能导致只有普通用户权限的恶意用户利用过大的权限做出危害安全的操作。例如没有对能操作的内容做出限制,就可能导致用户可以访问超出规定范围的其他资源。进行安全性测试时必须测试应用程序是否使用了过大的权限,重点要分析在各种情况下应该有的权限,然后检查实际中是否超出了给定的权限。权限过大问题本质上属于设计空间过大问题,所以在设计时要控制好设计空间,避免设计空间过大造成权限过大的问题。
      四、做好安全性测试的建议
      许多软件安全测试经验告诉我们,做好软件安全性测试的必要条件是:一是充分了解软件安全漏洞,二是评估安全风险,三是拥有高效的软件安全测试技术和工具。
      (1)充分了解软件安全漏洞
      评估一个软件系统的安全程度,需要从设计、实现和部署三个环节同时着手。我们先看一下Common Criteria是如何评估软件系统安全的。首先要确定软件产品对应的Protection Profile(PP)。一个PP定义了一类软件产品的安全特性模板。例如数据库的PP、防火墙的PP等。然后,根据PP再提出具体的安全功能需求,如用户的身份认证实现。最后,确定安全对象以及是如何满足对应的安全功能需求的。因此,一个安全软件的三个环节,哪个出问题都不行。
      (2)安全性测试的评估
      当做完安全性测试后,软件是否能够达到预期的安全程度呢?这是安全性测试人员最关心的问题,因此需要建立对测试后的安全性评估机制。一般从以下两个方面进行评估。①安全性缺陷数据评估。
      如果发现软件的安全性缺陷和漏洞越多,可能遗留的缺陷也越多。进行这类评估时,必须建立基线数据作为参照,否则评估起来没有依据就无法得到正确的结论。 ②采用漏洞植入法来进行评估。漏洞植入法和可靠性测试里的故障插入测试是同一道理,只不过这里是在软件里插入一些有安全隐患的问题。采用漏洞植入法时,先让不参加安全测试的特定人员在软件中预先植入一定数量的漏洞,最后测试完后看有多少植入的漏洞被发现,以此来评估软件的安全性测试做得是否充分。
      (3)采用安全测试技术和工具
      可使用专业的具有特定功能的安全扫描软件来寻找潜在的漏洞,将已经发生的缺陷纳入缺陷库,然后通过自动化测试方法来使用自动化缺陷库进行轰炸测试。例如,使用一些能够模拟各种攻击的软件来进行测试。
      安全测试是用来验证集成在软件内的保护机制是否能够在实际中保护系统免受非法的侵入。一句通俗的话说:软件系统的安全当然必须能够经受住正面的攻击——但是它也必须能够经受住侧面的和背后的攻击

  • WMl(无线标记语言)

    2012-10-29 10:45:49

     WML(Wireless Markup Language - 无线标记语言)。它是一种从 HTML 继承而来的标记语言,但是 WML 基于 XML,因此它较 HTML 更严格。
      WML 被用来创建可显示在 WAP 浏览器中的页面。用WML编写的页面被称为 DECKS。DECKS 是作为一套 CARDS 被构造的。
      这种描述语言同我们常听说的HTML语言同出一家,都属于XML语言这一大家族。WML的语法跟XML一样,WML是XML的子集。
      HTML语言写出的内容,我们可以在我们的PC机上用IE或是Netscape等浏览器进行阅读,而WML语言写出的文件则是专门用来在手机等的一些无线终端显示屏上显示,供人们阅读的,并且同样也可以向使用者提供人机交互界面,接受使用者输入的查询等信息,然后向使用者返回他所想要获得的最终信息。
    编辑本段
    什么是 WMLScript?
      WML 使用 WMLScript. 在客户端运行简单的代码。WMLScript. 是一种轻量级的 JavaScript. 语言。不过,WML 脚本并不嵌在 WML 页面中。WML页面仅仅含有对脚本 URL 的引用。WML 脚本在 WAP 浏览器运行之前,需要先在服务器上被编译为字节编码。
      建立网页制作环境
      WML文件本身就是文本文件,所以编辑不成问题,顺手的编辑器都可以用。
      当然,由于目前的浏览器还都不能显示 WML页面,而我们又不能总在手机上进行测试(速度太慢),所以需要模拟器。现在象NOKIA、ERICSSON、MOTOROLA等手机制造商都生产了相应的产品,你只要下载就行了。当然除了模拟器以外,还需要图形制作转换器(用来制作WAP格式的图形文件)、字符转码器(汉字<=> UNICODE)等等,本站工具及论坛页面均有说明。
      WML文件结构
      WML的页面通常叫做桌面(DECK),由一组互相链接的卡片(CARD)组成。当移动电话访问一个WML页面的时候,页面的所有CARD都会从WAP服务器下载到设备里。CARD之间的切换由电话内置的计算机处理,不需要再到服务器上取信息了。CARD里可以包含文本、标记、链接、输入控制、任务(TASK)、图像等等。CARD之间可以互相链接。
      文档的实体包含在<wml>...</wml>标记中,文档里每个CARD又包含在<card>...</card>标记中,然后实际的文字段落则包含在...
      标记中。
      简单例子:
      <?xml version="1.0"?>
      <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
      "http://www.wapforum.org/DTD/wml_1.1.xml">
      <wml>
      <card id="HELLO" title="HELLO">
      Hello world!
      </card>
      </wml>
      显示结果如下:
      ------ HELLO ------
      Hello World!
      DECK里面各个组成部分的具体解释在本教程的其他部分有说明。
      WML字符集
      WML是XML的子集,继承了XML的字符集设置。WML文档缺省的字符集是UTF-8。
      要显示中文,有两种办法。最简单的办法就是在文档头使用encoding,即把第一行改为:
      <?xml version="1.0" encoding="gb2312"?>
      然而令人丧气的是,这种方法有些手机和模拟器并不支持(将来会的),所以目前第2种方法更普遍:不改变字符集设置,但是在写中文的时候采用UNICODE代表中文字符,如:
      <b>通讯录</b>
      代表:
      通讯录
      WML元素:标记(Tag)和属性
      WML的主要内容是文本,由于标记会降低与手持设备的通讯速度,所以WML标准里仅仅使用了很少一部分。用于表格和图像的的标记几乎都被排除了。
      与XML一样,在WML语言中,所有元素都放在符号"<" 和 ">"中,并且包含一个开始标志、一个结束标志和一个内容标志,或者使用自身结束的控制标记。就象这样:
      <tag>内容</tag> 例如:Hello World!
      或
      <tag/> 例如:
      和 <go href="#done"/>
      WML同样支持在标志中标出属性。属性是标志的附加信息,与元素的内容不一样,它并不在屏幕上显示出来。属性通常在元素的开始标志后指定。如上面最后一个例子。
      由于WML是XML的一种应用,因此所有的WML标记和属性都是大小写敏感的(<wml>跟<WML>完全不同),而且所有的标记都必须正确地结束。WML要求属性的值必须放在双引号或单引号内。单引号可放在属性标志内或双引号内。字符亦可作为属性的值。
      WML注释
      XML支持这样的注释格式:
      <!这句话你在手机上看不到-->
      这些注释在浏览器中并不显示出来。
      WML不支持嵌套元素注释。
      链接(URL)
      WML外部引用方式跟HTML相同
      http://www.itsalon.net/index.wml
      http://www.itsalon.net/index.wml#login
      内部引用,如果next是当前DECK中的一个CARD时,可以用这种方式:
      #next
      提供链接功能的WML元素有2个:<go>(参见任务)和<anchor>(参见事件)。
      CDATA
      XML支持CDATA的概念,以显示不需要解释的文本。下面的例子使用CDATA元素在WML页面中显示WML命令文本。
      <! [CDATA [ <card name="bogus">this is data
      </card> ] ]>
      浏览器窗口将显示如下内容:
      <card name="bogus">this is data
  • Windows下的wap应用,手机模拟测试工具

    2012-10-16 23:43:15

    用了几个wap测试的工具,Opera,M3Gate0.6版,WinWAP for Windows 4.0,UP.Simulator。简单对这几个工具做一下总结:

    Opera的测试的时候select的值总是获取不到,别的没有测试。

    WinWAP有时候地址打不开,不知道什么原因。

    感觉最好的是M3Gate和up,前者操作比较方便,对wml文档语法检查比较严格,适合做文档测试,但是其操作界面与实际的手机操作不大一样。

    UP的语法检查好像没用M3Gate严格,但是操作界面比较像实际的手机。

     

    M3Gate0.6版的下载链接:

    http://www.3671041.com/Soft/UploadSoft/2006down/20060101/WAP%E4%AF%C0%C0%C6%F7M3Gate1.2.rar

    M3Gate1.2版的下载链接:

    http://yndh.driversky.com/down/m3stp12.exe

     

    UP.Simulator的下载链接(或用“UP.SDK WAP模拟器”搜索):

    http://sex.flash920.com/Download.asp?ID=5631&sID=0

  • Android系統的一些特點和主要技術 .

    2012-09-25 21:17:59

    Android系統的一些特點和主要技術
          Android是基於Linux內核的操作系統。android的主要特點有:
          (1)無界限的應用程序;【Android上的应用程序可以通过标准API访问核心移动设备功能。通过互联网,应用程序可以声明它们的功能可以供其他应用程序使用。】
          (2)應用程序可以並行運行;【Android 是一种完整的多任务环境,其中应用程序可以并行运行。在后台运行时,应用程序可以生成通知以引起注意。】
          (3)應用程序可以輕鬆地嵌入網絡;【应用程序可以轻松地嵌入 HTML、Javascript. 和样式表。应用程序可以通过 WebView 显示网络内容。 】
         (4)应用程序是在平等的条件下创建的。【 Android 是一种完整的多任务环境,其中应用程序可以并行运行。在后台运行时,应用程序可以生成通知以引起注意。】


         Android的應用使用Java語言編寫的,當然還有jni的編程方式,會涉及一點C/C++,如果開發人員已經熟練掌握了Java,那Android會是不錯的選擇。因為Android是一個開源的產品,現很多原始設備製造商都選擇了Android,并制定了個性化的系統。在開發過程中,有眾多的樣本應用和開源應用提供下載,並且IDE 使用Eclipse,集成開發環境有豐富的源代碼模型,而且在源碼上處理的比較好,這使得開發應用的難度會降低。


               Android平臺下開發的企業移動應用程序舉例:(1)新網互聯的雨滴客戶端(客戶隨時隨地了解了解到企業最新動態,參與企業互動。同時,還可以實現企業優惠、促銷等活動信息的下行傳遞,通過雨滴客戶端消息功能免費將信息推送給目標手機用戶、實現與目標客戶“一對一”的精准傳播)這個案例主要達到企業的手機市場營銷的目的。
             
    未來發展趨勢----- Android 已迎來總過OEM廠商的擁抱,特別是國內的山寨文化,未來前景將一片光明。


    Android系统架构

    从上图可以看出   android 是由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。第二部分将详细介绍这5个部分。下面自底向上分析各层。

    1、Linux Kernel

      Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。 如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各尽其职,各层提供固定的SAP(Service Access Point),专业点可以说是高内聚、低耦合。 如果你只是做应用开发,就不需要深入了解Linux Kernel层。

      2、Android Runtime

      Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以将 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有时必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。 Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。

      3、Libraries

      Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库: 系统C库--标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备 媒体库--基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、 H.264、 MP3、 AAC、 AMR、JPG、 PNG 界面管理--管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层 LibWebCore--新式的Web浏览器引擎,驱动Android 浏览器和内嵌的web视图 SGL--基本的2D图形引擎 3D库--基于OpenGL ES 1.0 APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅 FreeType --位图和矢量字体渲染 SQLite --所有应用程序都可以使用的强大而轻量级的关系数据库引擎

      4、Application Framework

      通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。 开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。 所有的应用程序其实是一组服务和系统,包括: 视图(View)--丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器 内容提供者(Content Providers)--使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据 资源管理器(Resource Manager)--提供访问非代码资源,如本地化字符串、图形和布局文件 通知管理器(Notification Manager)--使所有的应用程序能够在状态栏显示自定义警告 活动管理器(Activity Manager)--管理应用程序生命周期,提供通用的导航回退功能

      5、Applications

      Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发! 从上面我们知道Android的架构是分层的,非常清晰,分工很明确。Android本身是一套软件堆迭(Software Stack),或称为「软件迭层架构」,迭层主要分成三层:操作系统、中间件、应用程序。从上面我们也看到了开源的力量,一个个熟悉的开源软件在这里贡献了自己的一份力量。

     

    Android Framework框架介绍

    我们在开发应用时都是通过框架来与Android底层进行交互,接触最多的就是应用框架层了。在Android SDK中内置了一些对象,其中最重要的组件要属Activities、Intents、Services以及Content Providers四个组件。
        什么是应用程序框架呢?框架可以说是一个应用程序的核心,框架是所有参与开发的程序员共同使用和遵守的约定,大家在其约定上进行必要的扩展,但程序始终保持主体结构的一致性。其作用是让程序保持清晰、一目了然,在满足不同需求的同时又不互相影响。
    Activities活动
           一个活动就是一个用户界面。一个应用程序可以定义一个或多个活动,每个活动都能够保存和恢复自身的状态。
    Intents意向
          Intent是描述一个特定活动的一种机制,比如“选取照片”、“拨打电话”等这类具体动作。在Android中,所有的东西都是通过Intents完成的,因此开发者有机会替代或重用大量的组件。比如有一个“发送邮件”的intent,当你应用程序需要发送邮件时可以激活这个intent。开发者甚至可以重新编写一个新的邮件应用程序,并注册为活动以处理这个intent代替标准的邮件应用程序。那么其他应用程序就可以使用新编写应用程序来发送邮件了。
    Services服务
           一个服务Service就是运行在后台、没有用户直接交互的任务,与Unix daemon类似。比如要做一个音乐播放器,可能会被另一个活动激活,但音乐是需要作为背景音乐播放,那么这种程序就可以考虑作为一种服务Service。然后别的活动可以来操作这个播放器。Android中内置了很多服务,可以方便的使用API进行访问。
    Content Providers内容提供者
           一个内容提供者content Provider就是由自定义的API封装读写操作的一套数据。Content Provider是不同应用程序之间共享全局数据最好的方式。比如,Google提供了联系人的Content Provider,包括姓名、地址、电话等所有信息在内的联系方式能够被所有应用程序使用。

                                           android应用程序的目录结构

    1、src : 没什么好说的,就是我们的源代码了
    2、gen : 不知道gen是不是generate的缩写,gen目录存放系统自动维护的一些文件,主要是 R.java。R文件由ADT自动维护,主要是为res目录下面的xml,图像,媒体等文件同步生成一个类似字典的东西,系统中对这些资源的引用可以通过R文件来操作。在编译的时候会对R文件进行检查,如果R文件中没有引用的资源不会被编译打包,以节省系统资源,另外,R文件只有一个,我们不需要也不要去改里面的内容。
    3、assets:assets也是一个资源文件夹,assets中的资源可以被打包到程序里面,和Res不同的地方是,ADT会为res下面的文件在R文件中生成一个ID,而不会为assets中的资源生成ID,因此要使用该目录下面的文件,需要通过完整路径的方式进行调用。(该目录下面的文件不会被编译,直接复制到程序安装包中)
    4、res:资源目录(我们不能在Res目录下面建立自定义目录,以及为已有的目录建立子目录)
         drawable:主要存放不同分辨率的图片文件
                 (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA480x854)
               (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
               (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
         layout:存放用于布局的xml文件
         values:用于存放一些常量(不同类型的变量存放在不同的文件中,该目录中xml的文件名 是不能改的)
                   strings.xml 定义字符串和数值
                   arrays.xml 定义数组
                   colors.xml 定义颜色和颜色字串数值
                   dimens.xml 定义尺寸数据
                   styles.xml 定义样式
         anim:存放一些和动画有关的xml文件
         xml:存放一些自定义的xml文件
         raw:该目录下面的文件不会被编译,直接复制到程序安装包中。

                             AndroidManifest.xml 讲解

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    3.       package="com.Funny"  
    4.       android:versionCode="1"  
    5.       android:versionName="1.0">  
    6.     <uses-sdk android:minSdkVersion="8" />  
    7.   
    8.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
    9.         <activity android:name=".HelloAndroidActivity"  
    10.                   android:label="@string/app_name">  
    11.             <intent-filter>  
    12.                 <action android:name="android.intent.action.MAIN" />  
    13.                 <category android:name="android.intent.category.LAUNCHER" />  
    14.             </intent-filter>  
    15.         </activity>  
    16.   
    17.     </application>  
    18. </manifest>  

    xmlns:android:  包含命名空间的声明。xmlns:android="http://schemas.android.com/apk/res/android",使得Android中各种标

                                     准属性能够在文件中使用,提供大部分元素的数据。
    package:           声明应用程序包。
    application:         包含package中application级别组件声明的根节点。此元素耶可包含application的一些全局和默认的属性,

                                     如标签、icon、主题、必要权限等。一个manifest能够包含零个或一个此元素,不能大于一个。
    android:icon:应用程序图标。
    android:lebel:应用程序名字。
    Activity:用户交互工具。
    android:name:应用程序默认启动的Activity。
    intent-filter:声明了指定一组组件支持的Intent值,从而形成IntentFilter。
    action:组件支持的Intent action 。
    category:组件支持的Intent Category。指定应用程序默认启动的Activity。
    uses-sdk: 应用程序所使用的sdk版本。




  • GC工作机制

    2012-09-07 15:11:05

    SUN的jvm内存池被划分为以下几个部分:
    Eden Space (heap)
    内存最初从这个线程池分配给大部分对象。
    Survivor Space (heap)
    用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
    Tenured Generation (heap)
    用于保持已经在survivor space内存池中存在了一段时间的对象。
    Permanent Generation (non-heap)
    保存虚拟机自己的静态(reflective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的。
    Code Cache (non-heap)
    HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)。
    jvm的内存回收过程是这样的:
    对象在Eden Space创建,当Eden Space满了的时候,gc就把所有在Eden Space中的对象扫描一次,把所有有效的对象复制到第一个Survivor Space,同时把无效的对象所占用的空间释放。当Eden Space再次变满了的时候,就启动移动程序把Eden Space中有效的对象复制到第二个Survivor Space,同时,也将第一个Survivor Space中的有效对象复制到第二个Survivor Space。如果填充到第二个Survivor Space中的有效对象被第一个Survivor Space或Eden Space中的对象引用,那么这些对象就是长期存在的,此时这些对象将被复制到Permanent Generation。

    若垃圾收集器依据这种小幅度的调整收集不能腾出足够的空间,就会运行Full GC,此时jvm gc停止所有在堆中运行的线程并执行清除动作

  • ruby+watir环境的配置(windows)

    2012-03-23 16:42:11

    ruby+watir环境的配置(windows),

    步骤:

    1.下载ruby的安装包:http://www.ruby-lang.org/zh_CN/downloads/ 

    下载Windows一步安装版,默认安装(需要安装在系统所在盘,如:C盘) 

    安装成功可以运行命令查看版本:ruby –v

    2. 安装watir

       1、运行命令先更新gemgem update --system

       2、运行命令安装watir   gem install watir

    安装成功后在Ruby192\lib\ruby\gems\1.9.1\gemswatir

    3.更新已安装的gem

      运行命令先更新gemgem update

    4. https://github.com/oneclick/rubyinstaller/wiki/development-kit下载

    下载安装devkit-tdm....exe,双击解压缩

    切换到此目录下执行ruby dk.rb init

    ruby dk.rb review

    ruby dk.rb install

    gem install watir

    5     WatirRecorder++(watir脚本录制工具,可选)

           1、安装.net framework 1.1版本:

                下载地址:http://download.microsoft.com/download/7/b/9/7b90644d-1af0-42b9-b76d-a2770319a568/dotnetfx.exe

           2、安装WatirRecorder++

              下载:http://www.hanselman.com/blog/content/binary/WatirRecorder_Setup_lite.msi

    6安装IE Developer ToolbarIE插件,可选)

         下载地址: http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&displaylang=en

     

     

     

  • Linux iostat监测IO状态

    2011-08-29 11:13:55

    Linux系统出现了性能问题,一般我们可以通过top、iostat、free、vmstat等命令来查看初步定位问题。其中iostat可以给我们提供丰富的IO状态数据。

    1. 基本使用

    $iostat -d -k 1 10

    参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次。

    $iostat -d -k 1 10 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 39.29 21.14 1.44 441339807 29990031 sda1 0.00 0.00 0.00 1623 523 sda2 1.32 1.43 4.54 29834273 94827104 sda3 6.30 0.85 24.95 17816289 520725244 sda5 0.85 0.46 3.40 9543503 70970116 sda6 0.00 0.00 0.00 550 236 sda7 0.00 0.00 0.00 406 0 sda8 0.00 0.00 0.00 406 0 sda9 0.00 0.00 0.00 406 0 sda10 60.68 18.35 71.43 383002263 1490928140 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 327.55 5159.18 102.04 5056 100 sda1 0.00 0.00 0.00 0 0

    tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。

    kB_read/s:每秒从设备(drive expressed)读取的数据量;kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

    上面的例子中,我们可以看到磁盘sda以及它的各个分区的统计数据,当时统计的磁盘总TPS是39.29,下面是各个分区的TPS。(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)

    2. -x 参数

    使用-x参数我们可以获得更多统计信息。

    iostat -d -x -k 1 10 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20

    rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。

    rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;

    await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。

    %util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

    3. -c 参数

    iostat还可以用来获取cpu部分状态值:

    iostat -c 1 10 avg-cpu: %user %nice %sys %iowait %idle 1.98 0.00 0.35 11.45 86.22 avg-cpu: %user %nice %sys %iowait %idle 1.62 0.00 0.25 34.46 63.67

    4. 常见用法

    $iostat -d -k 1 10 #查看TPS和吞吐量信息 iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await) iostat -c 1 10 #查看cpu状态

    5. 实例分析

    $$iostat -d -k 1 |grep sda10 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda10 60.72 18.95 71.53 395637647 1493241908 sda10 299.02 4266.67 129.41 4352 132 sda10 483.84 4589.90 4117.17 4544 4076 sda10 218.00 3360.00 100.00 3360 100 sda10 546.00 8784.00 124.00 8784 124 sda10 827.00 13232.00 136.00 13232 136

    上面看到,磁盘每秒传输次数平均约400;每秒磁盘读取约5MB,写入约1MB。

    iostat -d -x -k 1 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29 sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25 sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24

    可以看到磁盘的平均响应时间<5ms,磁盘使用率>80。磁盘响应正常,但是已经很繁忙了。

  • LoadRunner压力测试结果分析探讨

    2011-07-21 14:27:43

    分析原则:

      1. 具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)

      2. 查找瓶颈时按以下顺序,由易到难。

      服务器硬件瓶颈  网络瓶颈(对局域网,可以不考虑)  服务器操作系统瓶颈(参数配置)  中间件瓶颈(参数配置,数据库web服务器等)  应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)

      分析的信息来源:

      1. 根据场景运行过程中的错误提示信息

      2. 根据测试结果收集到的监控指标数据

      一.错误提示分析

      分析实例:

      1.Error: Failed to connect to server “172.17.7.230″: [10060] Connection

      Error: timed out Error: Server “172.17.7.230″ has shut down the connection prematurely

      分析:

      A、应用服务死掉。

      (小用户时:程序上的问题。程序上处理数据库的问题,实际测试中多半是服务器链接的配置问题)

      B、应用服务没有死

      (应用服务参数设置问题)

      对应的Apache和tomcat的最大链接数需要修改,如果连接时收到connection refused消息,说明应提高相应的服务器最大连接的设置,增加幅度要根据实际情况和服务器硬件的情况来定,建议每次增加25%!

      C、数据库的连接

      (数据库启动的最大连接数(跟硬件的内存有关))

      D、我们的应用程序spring控制的最大链接数太低

      2. Error: Page download timeout (120 seconds) has expired

      分析:

      A、应用服务参数设置太大导致服务器的瓶颈

      B、页面中图片太多

      C、在程序处理表的时候检查字段太大多

      D、实际测试时有些资源需要请求外网,而我们的测试环境是局域网环境

      3. Error “http://172.17.7.230/Home.do....”

      分析:

      A、脚本设计错误,造成页面异常。服务器有响应!

      B、并发数过大,造成服务器响应延迟。

      4. Error page “text=xxxxx”

      分析:

      A、脚本设计问题,例如,前一脚本修改了某些内容,造成后面的脚本访问异常。

      B、不确定因素,有时候回放正常的脚本,一放到场景中就出现这样的错误。只能反复修改脚本!

      二.监控指标数据分析

      1.Vusers数

      Loadrunner 系统设置的虚拟用户数目。Vuser去实际调用事先制作的脚本文件中的应用。

      每个Vuser产生响应的操作,所有的操作对服务器形成并发。

      颜色 比例 度量 图最小值 图平均值 图最大值 图中间值 图SD

      1 Run 0.0 21.25 44 41 21.276

      在实际测试中,Vusers可以根据实际情况的需要,在测试过程中增加或者减少。

      2.最大并发用户数:

      颜色 比例 度量 最小值 平均值 最大值 SD

      100 Apache CPU 使用情况(Apache):172.17.7.210 0.777 0.852 0.93 0.043

      0.01 已发送 KB/秒(Apache):172.17.7.210 6 1430.371 2689.333 327.924

      0.1 点击次数/秒(Apache):172.17.7.210 0.333 114.352 533.667 40.201

      应用系统在当前环境下能承受的最大并发用户数。

      在方案运行中,如果出现了大批用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。

      从上图可以看出:在测试运行到4个小时左右的时候,apache的点击数/秒开始迅速增加!

    转自:http://www.51testing.com/html/12/n-131012.html

  • linux系统中top指令的详细使用方法以及一些符号的含义 (转)

    2011-07-11 16:29:37

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows任务管理器。下面详细介绍它的使用方法。

    top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48
    Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie
    Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
    Mem: 191272k total, 173656k used, 17616k free, 22052k buffers
    Swap: 192772k total, 0k used, 192772k free, 123988k cached

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    1379 root 16 0 7976 2456 1980 S 0.7 1.3 0:11.03 sshd
    14704 root 16 0 2128 980 796 R 0.7 0.5 0:02.72 top
    1 root 16 0 1992 632 544 S 0.0 0.3 0:00.90 init
    2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
    3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0

    统计信息区
    前五行是系统整体的统计信息。第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:

    01:06:48 当前时间
    up 1:22 系统运行时间,格式为时:分
    1 user 当前登录用户数
    load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。
    三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

    第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:

    Tasks: 29 total 进程总数
    1 running 正在运行的进程数
    28 sleeping 睡眠的进程数
    0 stopped 停止的进程数
    0 zombie 僵尸进程数
    Cpu(s): 0.3% us 用户空间占用CPU百分比
    1.0% sy 内核空间占用CPU百分比
    0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
    98.7% id 空闲CPU百分比
    0.0% wa 等待输入输出的CPU时间百分比
    0.0% hi
    0.0% si

    最后两行为内存信息。内容如下:

    Mem: 191272k total 物理内存总量
    173656k used 使用的物理内存总量
    17616k free 空闲内存总量
    22052k buffers 用作内核缓存的内存量
    Swap: 192772k total 交换区总量
    0k used 使用的交换区总量
    192772k free 空闲交换区总量
    123988k cached 缓冲的交换区总量。
    内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
    该数值即为这些内容已存在于内存中的交换区的大小。
    相应的内存再次被换出时可不必再对交换区写入。

    进程信息区
    统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。

    序号 列名 含义
    a PID 进程id
    b PPID 父进程id
    c RUSER Real user name
    d UID 进程所有者的用户id
    e USER 进程所有者的用户名
    f GROUP 进程所有者的组名
    g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
    h PR 优先级
    i NI nice值。负值表示高优先级,正值表示低优先级
    j P 最后使用的CPU,仅在多CPU环境下有意义
    k %CPU 上次更新到现在的CPU时间占用百分比
    l TIME 进程使用的CPU时间总计,单位秒
    m TIME+ 进程使用的CPU时间总计,单位1/100秒
    n %MEM 进程使用的物理内存百分比
    o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
    q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    r CODE 可执行代码占用的物理内存大小,单位kb
    s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    t SHR 共享内存大小,单位kb
    u nFLT 页面错误次数
    v nDRT 最后一次写入到现在,被修改过的页面数。
    w S 进程状态。
    D=不可中断的睡眠状态
    R=运行
    S=睡眠
    T=跟踪/停止
    Z=僵尸进程
    x COMMAND 命令名/命令行
    y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
    z Flags 任务标志,参考 sched.h

    默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

    更改显示内容
    通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。

    按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。

    按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

    命令使用

    1. 工具(命令)名称
    top
    2.工具(命令)作用
    显 示系统当前的进程和其他状况; top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间 对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.
    3.环境设置
    在Linux下使用。
    4.使用方法
    4.1使用格式
    top [-] [d] [p] [q] [c] [C] [S] [s] [n]
    4.2参数说明
    d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
    p 通过指定监控进程ID来仅仅监控某个进程的状态。
    q该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
    S 指定累计模式
    s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
    i 使top不显示任何闲置或者僵死进程。
    c 显示整个命令行而不只是显示命令名
    4.3其他
      下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。
      Ctrl+L 擦除并且重写屏幕。
      h或者? 显示帮助画面,给出一些简短的命令总结说明。
      k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
      i 忽略闲置和僵死进程。这是一个开关式命令。
      q 退出程序。
      r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
      S 切换到累计模式。
      s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
      f或者F 从当前显示中添加或者删除项目。
      o或者O 改变显示项目的顺序。
      l 切换显示平均负载和启动时间信息。
      m 切换显示内存信息。
      t 切换显示进程和CPU状态信息。
      c 切换显示命令名称和完整命令行。
      M 根据驻留内存大小进行排序。
      P 根据CPU使用百分比大小进行排序。
      T 根据时间/累计时间进行排序。
    W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

  • 主机资源监控工具NMON介绍及使用(转)

    2011-07-11 14:54:08

    在性能测试过程中,对主机资源的监控有着重要意义。一方面,在测试过程中可以判断加压是否成功、系统是否能承受当前压力,确保系统安全;另一方面,测试结束后,通过对监控数据的整理,可以为性能分析、发现问题、寻找瓶颈提供数据支持。本文将结合工作中的实际情况,介绍Unix、Linux操作系统中常用的资源监控工具NMON及使用方法。

    一、NMON介绍
         nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具, nmon所记录的信息是比较全面的,它能在系统运行过程中实时地捕捉系统资源的使用情况,并且能输出结果到文件中。nmon工具可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新。并且,nmon运行不会占用过多的系统资源,通常情况下CPU利用率不会超过2%。
         针对不同的操作系统版本,nmon有相应版本的程序,需要注意的是该文件需要执行授权操作方可正常运行。

    二、NMON使用方法
         实际工作中,nmon有三种常用的使用模式,分别是实时监控、后台监控和定期监控模式。下面分别加以介绍。
         1、实时监控:在完成配置后,只需要“#./nmon”命令即可运行程序,通过一些快捷键调取关心的系统资源指标进行显示,如按键“C”可以查看CPU相关信息;按键“D”可以查看磁盘信息;按键“T”可以查看系统的进程信息;“M”对应内存、“N”对应网络等等,完整的快捷键对应内容可以通过帮助(按键“H”)查看,可以显示Linux系统CPU、内存、进程信息,包括了CPU的用户、系统、等待和空闲状态值,可用内存、缓存大小以及进程的CPU消耗等详细指标。该种方式显示信息实时性强,能够及时掌握系统承受压力下的运行情况,每颗CPU利用率是多少、内存使用多少、网络流量多少、磁盘读写……这些数据实时刷新,一目了然。但是如果我们希望将一段时间的资源情况记录下来,以备后续的分析工作,则需要以另一种方式使用nmon。

         2、后台监控:为了配合性能测试,我们往往需要将一个时间段内系统资源消耗情况记录下来,这时可以使用命令:./nmon -f -s 10      -c 360。说明:
         -f :按标准格式输出文件名称:<hostname>_YYYYMMDD_HHMM.nmon
         -s :每隔n秒抽样一次,这里为10秒
         -c :取出多少个抽样数量,这里为360,即监控=10*360/3600=1小时
         该命令启动后,会在nmon所在目录下生成监控文件,并持续写入资源数据,直至360个监控点收集完成——即监控1小时,这些操作均自动完成,无需手工干预,测试人员可以继续完成其他操作。如果想停止该监控,需要通过“#ps –ef|grep nmon”查询进程号,然后杀掉该进程以停止监控。

         3、定期监控:除配合性能测试的短期监控,我们也可以实现对系统的定期监控,作为运营维护阶段的参考。定期监控可通过“#crontab -e”命令实现,在最后一行添加“0 8 * * 1,2,3,4,5 /nmon -f -s 30 -c 1200”,表示:周一到周五,从早上08点开始,监控10个小时(到18:00整为止)。

    三、NMON监控结果分析
         通过后台监控和定期监控,我们可以得到扩展名为nmon的监控文件,这些文件记录着系统资源的数据,需要配合分析工具进行解读。nmon analyser.xls可以将.nmon文件转化为Excel文件,并生成统计图,直观显示系统资源情况。
          在测试过程中,我们往往需要更加详细的信息以分析系统性能情况,如果认为磁盘IO偏高,我们需要进一步获取磁盘的详细信息加以分析,在nmon结果中打开“DISK_SUMM”标签页结合系统实际设置,可以进一步确定造成问题的原因,如系统日志级别过低等等。NMON能够提供CPU、内存、硬盘、网络等各方面的信息,对于我们的分析工作能够提供很好的数据支持。
         另外,我们可以通过一些输出参数的调整以得到偏重不同角度、或不同形式的统计结果,其中比较常用的“Intervals”参数,该参数定义了原始.nmon文件的取值范围,即统计内容取自原始数据的哪部分。因为原始数据是多个采样点的集合,通过设置“Intervals”的开始、结束值。(如开始为1,结束为60,根据前文的设置,可知这是截取了前十分钟的数据进行统计展示)

         总结:本文介绍了适合在Unix、Linux操作系统中使用的主机资源监控工具NMON,并简单说明了其使用方法和常用监控方式。在实际项目中,为了建立完善的监控体系,还可能需要与其他工具、方法配合使用,以达到我们的测试目标。

  • Nmon 工具使用说明

    2011-07-07 14:51:20

    本文来自:http://sunligang-chenghaijie.blogspot.com/2009/01/nmon.html

    Nmon 工具是 IBM 提供的免费的监控 AIX 系统与 Linux 系统资源的工具。该工具可将服务器的系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工具进行数据的统计分析,非常利用 UNIX 或者 Linux 系统的性能数据分析。Nmon 工具使用起来非常简单,下面将分步骤介绍如何使用该工具。

    一、安装 nmon
    首先我们在 IBM 的官方网站上下载 nmon 工具,下载时需注意要下载对应的系统版本。我们这里以 debian31 为例,下载的是 nmon_x86_11f.zip 版本,该版本支持 ubuntu。下载后解压,改名为 nmon 并上传到 Linux 中。在 Linux 的终端中输入 ls 可以看到:
    slg@slg-desktop:~/桌面/GVS项目/nmon$ ls
    nmon_x86_debian31 nmon_x86_knoppix5 nmon_x86_rhel3 nmon_x86_sles10
    nmon_x86_fedora5 nmon_x86_rhel2 nmon_x86_rhel4 nmon_x86_sles9

    为了能够正常的使用 nmon 工具,我们需要修改相关文件的权限。我们这里所使用的 Linux 系统是 ubuntu,所以,我们仅修改”nmon_x86_debian31”文件
    的权限即可。为了方便,直接改为 777,命令如下:chmod 777 nmon_x86_debian31修改完成后,我们就完成了 nmon 工具的安装,接下来介绍一下该工具的使用。

    二、使用 nmon
    nmon 工具使用非常简单。首先我们启动该工具,在 nmon 目录下,输入 ./nmon_x86_debian31 打开界面,根据提示信息即可进行操作,
    ┌nmon─11f─────────────────────Hostname=slg-desktop──Refresh= 2secs ───10:12.08──────────────────────────────────────────────┐
    │ │
    │ ------------------------------ For help type H or ... │
    │ # # # # #### # # nmon -? - hint │
    │ ## # ## ## # # ## # nmon -h - full │
    │ # # # # ## # # # # # # │
    │ # # # # # # # # # # To start the same way every time │
    │ # ## # # # # # ## set the NMON ksh variable │
    │ # # # # #### # # │
    │ ------------------------------ │
    │ │
    │ Use these keys to toggle statistics on/off: │
    │ c = CPU l = CPU Long-term - = Faster screen updates │
    │ m = Memory j = Filesystems + = Slower screen updates │
    │ d = Disks n = Network V = Virtual Memory │
    │ r = Resource N = NFS v = Verbose hints │
    │ k = kernel t = Top-processes . = only busy disks/procs │
    │ h = more options q = Quit │
    │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│

    如输入c显示cpu信息;
    CPU Utilisation ──────────────────────────────────────────────────────────────────────────────────────────────────────────│
    │ +-------------------------------------------------+ │
    │CPU User% Sys% Wait% Idle|0 |25 |50 |75 100| │
    │ | Please wait gathering data │
    │ +-------------------------------------------------+ │
    │──────────────────────────────────────────────────────────────────────────────────────────


    三、输出文件


    上面所讲的只是在服务器监控,我们真正需要的是如何收集这些数据并处理分析它们。nmon 提供了一个 nmon_analyser 的分析工具,可利用 excel 进行统计结果的分析。在测试的时候,我们可使用下列命令进行数据的输出:
    ./ nmon_x86_debian31 –fT –s 5 –c 5
    上面命令的含义是,-f 输出文件,-T 输出最耗资源的进程,-s 收集数据的时间间隔,-c 收集次数。比如,我们测试场景需要执行 20 分钟,那么我们需要每隔 10 秒监控 Linux系统资源就可以写成:
    ./ nmon_x86_debian31 –fT –s 10 –c 120
    120 是次数,也就是 20 分钟/10 秒=120 次。完成后会在当前目录生成一个.nmon 的文
    件。如图:
    slg@slg-desktop:~/桌面/GVS项目/nmon$ ls
    nmon_x86_debian31 nmon_x86_knoppix5 nmon_x86_rhel3 nmon_x86_sles10 slg-desktop_090113_1024.nmon
    nmon_x86_fedora5 nmon_x86_rhel2 nmon_x86_rhel4 nmon_x86_sles9
    nmon 输出文件的命名方式是服务器名_日期时间.nmon,我们在测试结束后,可到相应的目录下提取这些文件。


    四、分析数据

    打开nmon analyser v334
    设置宏的安全级别是低 ,之后点击 Analyser NMON data 按钮 输入文件 保存成excel格式即可。

  • nmon安装与使用说明

    2011-07-07 14:27:14

    1. 上传nmon4aix_11e.tar.gz里的文件到aix服务器上

    把源文件nmon4aix_11e.tar.gz解压到本地D/

    ftp://192.168.1.10


    cd /home

    mkdir nmon

    /*FTP服务器上根目录下建立nmon目录。*/

    Bin

    /*采用二进制传输。如果你要上传下载,这一步很重要,不先执行这个命令,上传下载会很慢。*/

    lcd

    /*定位本地默认文件夹,在前面我事先在D:盘创建的。*/

    !dir

    /*查看本地文件夹中的文件及目录*/

    put nmon

    put nmon_aix51

    put nmon_aix52ml2

    put nmon_aix52ml5

    put nmon_aix53

    /*将当前目录(d:\中的文件上传到FTP服务器默认目录。可以用"mput *.*"将所有文件上传到FTP服务器上。*/

    2.修改文件权限使其可以执行

    chmod 755 nmon

    chmod 755 nmon_aix51

    chmod 755 nmon_aix52ml2

    chmod 755 nmon_aix52ml5

    chmod 755 nmon_aix53

    3.执行nmon

       设置终端类型

    export TERM=vt220

    进入/home/nmon目录

    cd /home/nmon

    运行监控程序

    ./nmon

    按空格

    然后按“c”键

    然后按“m”键


  • 运用Jconsole监控JVM

    2011-07-07 11:15:31

    Jconsole是JDK自带的监控工具。它用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。而且本身占用的服务器内存很小,甚至可以说几乎不消耗,不失为一款好工具。
           Jconsole的使用方法,稍微复杂一些。
           首先,来看看如何使用Jconsole 连接到远程linux服务器。
           1. 在本地安装JDK 6.0版本。
           2. 需要在远程服务器的jboss配置文件中,添加远程服务端口,并启动jboss。如下:
    JAVA_OPTS=”$JAVA_OPTS -Djava.awt.headless=true -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=$HOSTNAME”
           3. 在本地java/bin目录下找到jconsole.exe文件,运行。打开界面后,就可以连接了。

       4. 当Jconsole连接成功后,它从JMX获取信息,我们便可以在里面监控具体的内容。
           接下来,看一下这个工具的总括。
           Jconsole能捕获到以下信息:
           概述  -  JVM概述和一些监控变量的信息
           内存  -  内存的使用信息
           线程   - 线程的使用信息
           类       - 加载java类的信息
           VM    -  JVM摘要
           MBeans  - 所有MBeans的信息

           有了上面的概念之后,性能测试过程中需要关注哪些信息呢?一般主要关注内存栏、线程栏、类栏,概述栏和VM栏次之,MBeans栏在追踪具体问题时用到。下面详细说明一下使用方法。

        1. 内存栏
           内存栏中显示了内存堆栈消耗情况、内存池分区统计情况、垃圾回收情况等内容,并以图表实行显示出来。点击图表下拉框,可以选择具体需要的

    在这里,还可以强制执行GC,另内存回收更加爽歪歪!
             2. 线程栏
            线程栏中显示了当前运行的线程,并以图表实行显示出来。对于启用多线程系统分析,非常有用。例如,它可以协助我们追踪线程状态、线程阻塞、线程等待、线程挂起、线程资源争用问题

     3.类栏
            类栏中显示了当前加载类的信息。并以图表实行显示出来。如果要了解当前载入类的数量、已载入类的总数量、已卸载类的总数量,在这里查看非常有用。
       工具的使用,就介绍到这里。这款工具的好处在于,占用系统资源少,而且结合上期提到的Jstat,可以有效监控到java内存的变动情况,以及引起变动的原因。在项目追踪内存泄露问题时,很实用。
            但是它也有缺点,就是采集的信息比较难分析,不如JProfiler直观,需要有专业基础才能看得懂。

  • Jconsole_一个监控JVM资源的JDK自带小工具

    2011-07-07 11:00:04

    测试中LR总出现27796的错误提示timeout,烦的要死就是不知道问题出在哪儿。。后引进了这个小工具,非常不错,而且不须任何特殊配置即可使用,还是图形化的,很赞~

      被监控的服务器端配置:

      打开服务器的tomcat配置文件catalina.sh(路径为:/usr/local/tomcat6/bin),可直接在文件中找到此配置信息处,进行修改,修改后的信息如下:

    JAVA_OPTS='-Xms1024m -Xmx1024m -XX:PermSize=256m  -XX:MaxPermSize=256m -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=1092

    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.52.230'


      另外说明下,其中“jmxremote.port=1092”是自己配置的未被占用的端口号;“server.hostname=192.168.52.230”中的192.168.52.230为服务器本身的IP。

      如果是windows服务器,需要修改这个文件: catalina.bat:

    set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port="9004"

    -Dcom.sun.management.jmxremote.authenticate="false"

    -Dcom.sun.management.jmxremote.ssl="false"


      监控资源的测试机配置:

      1.安装JDK1.6.0到测试机(winserver2003 EnterpriseEdition)上;

      2.在安装目录(默认:c:\ProgramFiles\Java\jdk1.6.0_16\bin)下,找到“jconsole.exe",双击打开即可显示"java监控和管理控制台"界面;

      3.新建一个连接,在新建连接界面的“远程进程”输入框输入要监控服务器的服务名称,如“service:jmx:rmi:///jndi/rmi://192.168.52.55:1090/jmxrmi” ,点“连接”接口监控到服务器的JVM资源啦!


      下面说下界面中的元素:

      概述 :记录了“堆内存使用情况”、“线程”、“类”、“CPU使用情况”共四个资源的实时情况;

      内存 :可以选择查看“堆内存使用情况”、“非堆内存使用情况”、“内存池"PS Eden Space"”等内存占用的实时情况;界面右下角还有图形化的堆一级、二级、三级缓存(从左到右)占用情况,当然,如果三级缓存被全部占用也就是很可能内 存溢出啦!这时可以去查看服务器的tomcat日志,应该会有“outofmemory"的异常日志信息。界面右上角处还提供了一个“执行GC”的手动垃 圾收集功能,这个也很实用~而且界面下方还有详细的GC信息记录。

      线程 :界面上部显示实时线程数目。下部还能查看到详细的每个进程及相应状态、等待、堆栈追踪等信息;

      :显示“已装入类的数目”、“已卸载类的数目”信息;

      VM摘要 :显示服务器详细资源信息,包括:线程、类、OS、内存等;

      MBean : 可在此页进行参数的配置。

  • Tomcat 的jconsole远程访问,和远程调试 .

    2011-07-07 10:37:49

    在bin目录下的catalina.bat中加入这条,即可通过 jconsole查看tomcat的运行情况

    set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port="9004" -Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote.ssl="false"

     

     

     

    在做远程调试时,在windows系统和非windows系统下的配置,Tomcat中会有所差别,具体如下:

    第一步、配置tomcat
    一、在windows系统中:
    打开%CATALINE_HOME%/bin下的文件catalina.bat,加入下面这行:
    set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787

    其中address=8787是没被使用的端口号。连接方式有两种,为dt_shmem和dt_socket,分别表示本机调试和远程调试。

    二、在非windows系统中:
    还需要把% CATALINE_HOME %/bin/startup.sh中的最后一行exec "$PRGDIR"/"$EXECUTABLE" start "$@" 中的start改成jpda start。由于默认的端口是8000,所以如果8000端口已有他用的话,还需在catalina.sh文件中设置:JPDA_ADDRESS=8787。
    输入命令startup.sh或者catalina.sh jpda start就可启动tomcat。

    第二步、配置eclipse
    在Eclipse中选择RunDebug,在弹出的对话框中右击Remote Java Application新建一个远程调试项,如下如所示:

     

    在“Name”输入框中输入远程调试的名称,在“Project”中选择要调试的项目,在“Host”中输入需要远程调试项目的IP,也就是tomcat所在的IP,在“Port”中输入设置的端口号,比如上面设置的8787,然后钩选“Allow termination of remote VM”,点击“Apply”即可。
    设置完后就可以开始调试了,大概分一下几步:
    1、启动tomcat(远程),如在控制台输出“Listening for transport dt_socket at address: 8787”,即说明在tomcat中设置成功;
    2、在本机设置断点,即在需要监视的代码行前双击就会出现一个小圆点;
    3、进入上图界面,选择要调试的项,点击“Debug”即可进行远程调试;
    4、当运行到设置了断点的代码行处即可看到如下图所示的浅绿条。

     


    当然,为了方便,可以新建一个批处理文件,假如取名为debug.bat,在这个文件中加入下面几行:

    cd %CATALINE_HOME%/bin
    set JPDA_ADDRESS=8787
    set JPDA_TRANSPORT=dt_socket
    set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787
    startup

    这样需要远程调试时,运行debug.bat即可;不需要远程调试时,还是运行startup.bat文件。

  • windows下openbravoERP的安装

    2011-07-03 20:46:23

    系统:       windows xp
    所需软件: 1.openbravoERP-2.35-windows-installer
                    2.oracleXE
                    3.apache-tomcat-6.0.14
                    4.jdk-6u2-windows-i586-p
                    5.apache-ant-1.7.0-bin
    安装步骤:
                   1.先安装jdk-6u2-windows-i586-p(默认路径)
                   2.安装apache-tomcat-6.0.14(默认路径)端口设置为8081
                   3.安装oracleXE 端口8080
                   4.安装apache-ant-1.7.0-bin直接以文件夹存放
                   5.系统设置:
                          我的电脑——属性——高级——环境变量——用户变量(JAVA_HOME=java中jdk文件夹的路径;ANT_HOME=ant文件夹的路 径;CATALINA_HOME=tomcat文件夹的路径;CATALINA_OPTS=-server -Xms=512M -Xms=512M)——系统变量(classpath=.;java中jdk文件夹中lib文件夹中tools.jar;java中jdk文件夹中 lib文件夹中dt.jar)(path=java中jdk文件夹中的bin目录;ant中的bin目录)
                  6.设置完毕后重启电脑
    注:以上安装时使用默认路径是为了便于安装,路径可以更改。
                  7.双击openbravoERP-2.35-windows-installer安装
                  8.安装时编译时间有点长需要等待安装完毕后初始用户名:Openbravo  初始密码:openbravo

  • 优化tomcat的配置

    2011-07-03 20:40:59

    一、精简Tomcat和配置文件

    1.删除不需要的管理应用和帮助应用,可以提高tomcat安全性。删除webappsserver/wenapps下所有文件

     

    2.精简sever.xml配置文件,可以考虑使用tomcat发布版本中的最小配置文件,提高性能,如果有功能上的需求,在逐个的加入功能配置。

    Ø        备份原来的server.xmlserver.xml_bak

    Ø        复制server-minimal.xmlserver.xml

     

    3.修改server.xml,提高tomcat性能

    Ø        配置文件中的Connetctor节点,和连接数相关的参数配置和优化。

    *        maxThreadsTomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,默认值200。可以根据计算机的性能和内存大小调整,一般可以在400-500。最大可以在800左右。

    *        acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10

    *        minSpareThreadsTomcat初始化时创建的线程数。默认值4

    *        maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50

    *        enableLookups:是否反查域名,默认值为true。为了提高处理能力,应设置为false

    *        connnectionTimeout:网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,这样设置是有隐患的。通常可设置为30000毫秒。

    *        maxKeepAliveRequests:保持请求数量,默认值100

    *        bufferSize:输入流缓冲大小,默认值2048 bytes

    *        compression:压缩传输,取值on/off/force,默认值off

    其中和最大连接数相关的参数为maxThreadsacceptCount。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows2000个左右,Linux1000个左右。

    Ø        修改通用连接:

        <Connector port="8080" />

    为:

        <Connector port="8080" maxTreads="500" minSpareThreads="10" maxSpareThreads="50" acceptCount="50" connectionTimeout="60000"

                   enableLookups="false" redirectPort="8443" protocol="AJP/1.3"  compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata"

    compressableMimeType="text/html,text/xml"/>

    Ø        修改主机和应用配置:

    <Host name="localhost" appBase="webapps" />

     

    为:

         <Host name="localhost" appBase=" "

           unpackWARs="true" autoDeploy="true"

           xmlValidation="false" xmlNamespaceAware="false">

            <Context path="" docBase="/www/xxxx/site/web" reloadable="true" debug="0"/>

    </Host>

     

    4.优化JDK

    Tomcat默认可以使用的内存为128MB,Windows,在文件catalina.bat的前面,修改如下设置:

    JAVA_OPTS='$JAVA_OPTS -Xms[初始化内存大小] -Xmx[可以使用的最大内存]

    一般说来,应该使用物理内存的 80% 作为堆大小。如果本机上有Apache服务器,可以先折算Apache需要的内存,然后修改堆大小。建议设置为70%;建议设置[初始化内存大小]等于[可以使用的最大内存],这样可以减少平凡分配堆而降低性能。

    另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。

    如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

  • tomcat中的server.xml元素详解

    2011-07-03 20:39:16

    元素名
    属性
    解释
    server
    port
    指定一个端口,这个端口负责监听关闭tomcat的请求
    shutdown
    指定向端口发送的命令字符串
    service
    name
    指定service的名字
    Connector(表示客户端和service之间的连接)
    port
    指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求
    minProcessors
    服务器启动时创建的处理请求的线程数
    maxProcessors
    最大可以创建的处理请求的线程数
    enableLookups
    如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
    redirectPort
    指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
    acceptCount
    指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
    connectionTimeout
    指定超时的时间数(以毫秒为单位)
    Engine(表示指定service中的请求处理机,接收和处理来自Connector的请求)
    defaultHost
    指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
    Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范)
    docBase
    应用程序的路径或者是WAR文件存放的路径
    path
    表示此web应用程序的url的前缀,这样请求的urlhttp://localhost:8080/path/****
    reloadable
    这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib /WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序
    host(表示一个虚拟主机)
    name
    指定主机名
    appBase
    应用程序基本目录,即存放应用程序的目录
    unpackWARs
    如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
    Logger(表示日志,调试和错误信息)
    className
    指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口
    prefix
    指定log文件的前缀
    suffix
    指定log文件的后缀
    timestamp
    如果为true,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt
    Realm(表示存放用户名,密码及role的数据库)
    className
    指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口
    Valve(功能与Logger差不多,其prefixsuffix属性解释和Logger 中的一样)
    className
    指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息
    directory
    指定log文件存放的位置
    pattern
    有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多

        这个表格很清楚的描述了各个元素的层次关系及定义。

  • Ruby on Rails(ROR) Windows 开发环境的搭建

    2010-05-18 09:45:55

    1、下载

    下载地址 URL:http://rubyforge.org/frs/?group_id=904  最新的版本是 InstantRails-1.7-win.zip 

    2、安装

    Instant Rails 的安装非常简单,解压缩到你想要的文件夹就可以了。

    3、使用

    运行 .\InstantRails\ 目录下的InstantRails.exe。第一次运行会出现一些问题,比如说“80端口冲突”、“更变文件夹”……(忘记截图了 -_-! )不同的机器的问题可能会不同,根据警告提示,一般问题都会解决。重新启动后进入正常状态。

    4、测试

    环境配置完成,我们可以了解一下在 .\\nstantRails\rails_apps\ 目录下自带的两个实例:cookbook (留言板) 和 typo-2.6.0(blog)。单击左侧的“I”-> Rails Applications -> Manage Rails applications 打开界面选中左侧 Rails Applications 列表中的项目(可以多选)以后,点击 start with Mongrel 弹出命令行窗口,当显示“Use CTRL+C to Stop”,就可以在IE中运行实例了。

    在 IE 输入URL:http://127.0.0.1:3002(注意端口选择),就可以看到页面了

    完成这个过程大概需要10几分钟。

    补充一下,这样构建好的ROR开发环境,只能在存在Ruby文件夹下进行工作,这样就存在了很大的局限性。我们可以在path里面添加的一个指向Ruby and Rails 的路径,来方便我们的程序开发。

    补充说明:如何修改path

    在“我的电脑”->“属性”->“高级”->环境变量->系统变量。找到path并编辑,在后面加入Ruby的路径

  • Loadrunner8.1录制、回放乱码问题解决办法和快照问题解决办法.

    2010-04-07 17:22:30

    1、录制脚本乱码
    LR录制的脚本中可能会有乱码,主要是当URL中有中文时。
    通过如下问题可以解决此问题:
    a)  Go to Vugen -> Tools -> Recording Options -> Advanced
    b)  Check the option that reads "Support Charset" and select "UTF-8"

    2、回访乱码
    还有一类乱码问题是:IE访问页面一切正常,但是LR回放时在run viewer中显示的页面为乱码。
    这一问题一般是由于页面保存时的编码格式和页面中的charset格式不一致引起的(html头中通常会有<meta. http-equiv="Content-Type" c>)。遇到这类问题,只需要将页面做另存为,将保存的编码格式和页面中的charset格式统一起来就可以了。
    引起问题的原因是:
    IE浏览器解码时会优先考虑文件的保存编码格式,而后考虑页面中的charset格式,(正常情况下两者是一致的),而run viewer是直接使用页面中的charset格式打开的。
    例如:charset=gb2312,但是文件的保存的编码格式是UTF-8,IE访问时会以UTF-8解码,而run viewer却是以GB2312格式解码,以GB2312解UTF-8自然是乱码。
    出现乱码的原因和解决办法很可能不全面,请大家补充。
    说到底,还是run viewer功能比较简单引起的。
    run viewer中的乱码不影响测试结果。

    3、没有快照
    现在再来说一说LR的快照问题,LR脚本录制完成后回放,在回放概况中的快照都是红X,见附件。
    这一问题应该是LR中文补丁引起的,要去比较高的朋友,请不要打中文补丁。
    呵呵,LR对中文的支持还是不理想啊。

    最后将有关字符集的资料帖上来,供大家参考。

    字符集、字符编码
    1.文件分为文本文件和二进制文件﹐不过本质都一样﹐都是些01。
    2.计算机存储设备存储的0或1﹐称为计算机的一个二进制位(bit)。
    3.二进制文件的0和1有专门的应用程序来读﹐所以它们没有什么乱不乱码的问题﹐只要该程序认得就行。(像doc,xls,exe,dll等)
    4.文本文件就不一样了﹐notepad要认识它﹐vs.net要认识它,UE也要认识它…所以它们就要有一个标准。这个标准的原理其实很简单﹐就是把所有的字符都给它一个序号﹐然后根据这个序号来找字符就可以了。这个东东就是编码表,也叫字符集(charset)。
    5.文本文件存的都是字符﹐如﹕A,?,@,x。很明显一个bit不能表示﹐刚好计算机的存储单位–字节(byte)就是多个字节(1个byte=8个bit),因此用byte来表示字符就理所当然了。
    6. 第一个编码表–ASCII码很快产生﹐很简单﹐就是用一个byte来表示一个字符(最高位置0),总共能存储128(2^8)个字符。如A用65表示﹐ 存在计算机中就是01000001(65)﹐为了书写方便﹐我们一般记作0×41(16进制),97则表示小写的a,存在计算机中就是01100001 (97)﹐记作0×61。?用63表示,记作0×3F。
    7.英语国家的大小写字母加起来才52个字符﹐再加上数字﹐符号和一些特殊字符﹐已经足够使用。所以ASCII刚开始非常流行(谁叫计算机不是咱中国发明的… )
    8.随着计算机的普及﹐当非英语系的国家开始使用时﹐ASCII已经明显不能满足了(总不成天天使用xiao sheng来表示”小生”吧),所以这些国家(地区)就开始制订自己的标准。
    9. 中国大陆制订了简体汉字的字符集(GB2312)。和英语国家不同﹐我们的汉字远远不止128个﹐所以一个byte肯定不能表示完﹐那就多加个byte, 16位(65536)总可以了吧。不过这样虽解决了位数不够的问题﹐但是原来的英文文件怎么办?总不成又全部拿出来改成双字节吧。幸好﹐居然发现原来的 ASCII的第一位居然是0﹐那我们把第1位改成1不就OK了吗?以后凡看到0开头的就读1个字节﹐1开头的就读2个字节。(而且128*128表示所有的简体字也足够了)
    10.因此在GB2312标准中,”小”的序号是0xD0A1,表示成11010000 10100001,而A还是表示成01000001,这就是为什么简体操作系统读ASCII文件不会乱码﹐而反之则不然的原因。
    11.目前来说﹐情况还比较好﹐中国大陆的计算机运行正常。
    12.看到中国大陆制订了一个标准﹐其它国家和地区也不甘示弱﹐纷纷亮出自己的字符集,于是乎什么BIG5(中国台湾),shift_jis(日本),ks_c_5601-1987(韩国)都闪亮登场﹐一时间百鸟争鸣,百花齐放。
    13.每个国家都想与ASCII保持兼容﹐理所当然﹐后面的字符就完全不一样了﹐因此﹐同样的0xD0A1,在GB2312中是”小”字﹐而在BIG5中却是”苤”字。你想想﹐这样不乱才怪。
    14.到了这时候﹐总有人会想到﹐再这样继续下去是肯定不行的﹐于是它们就想到了﹐如果有一个标准﹐能包括所有字符那不就OK了吗?
    15. 于是”大哥大”标准就出来了﹐这就是unicode,为了能够足够表示世界上的所有字符这样光荣而又伟大的任务﹐这家伙用了四个字节来表示(2的32次方到底是多少﹐我也懒得算了),这下好了﹐天下太平了﹐再也不会有麻烦了﹐耳根清静了…(打住﹐你小子这么这么罗嗦呀)
    15.不过 unicode好是好﹐但是毕竟四个字节表示一个字符”浪费”太大了(我那破猫上网容易吗﹐电信黑呀﹐说好是2M﹐就给我200K…)﹐而且大家”惊奇”地发现﹐居然世界上一些”较强大”的国家的字符刚好集中在前65536位前﹐呵呵﹐结果unicode也分成了unicode-16和unicode -32了﹐自然﹐前者只用两个字节表示(所以只能表示前65536位喽,欧亚国家大部分字符都OK了﹐什么﹐你们那个@$Y$%字符没有﹐呵呵﹐不管我什么事,找标准协会﹐都是那帮家伙弄的…)
    16.虽然标准出来了﹐可是好歹ASCII也用了这么久﹐那些英语国家也在那里嚷嚷﹐这倒好 ﹐搞个什么破标准﹐我们又没有得到什么好处﹐反而让我们原来的程序都运行不了了(为什么呀﹐你想想﹐原来我们的程序字符都是一个字节一个字节认﹐现在倒好 ﹐全改成2个一起认﹐这还怎么跑呀?)﹐况且我们凭白无故了用了这么多0﹐真别扭(unicode中的前128位还是ASCII标准﹐只不过在前面加了8 个0)﹐由于那些国家”势力”比较大﹐所以这个问题不容忽视
    17.这个世界上的牛人总是这么多﹐这个问题很容易就被小意思地解决了。
    18. 想想GB2312怎么解决与ASCII兼容的问题的(1开头的就读2个字节﹐0开头的就读1个字节)﹐同样﹐UTF也这样﹐0开头的读1个字节 (ASCII码)﹐110开头的读2个字节﹐1110开头的读3个字节﹐这就是伟大的UTF-8(当然还有UTF-16,原理一样﹐xx开头的读4个字节 ﹐xx开头的读5个字节﹐xx开头的读6个字节)
    19.当然UTF-8没GB2312这么简单﹐读完之后不能直接查编码表﹐多加一个步骤﹐按照模板提取一下字符再查就OK了
    以下就是UTF-8的模板
    0×0000 - 0×007F用一个字节表示 0xxxxxxx
    0×0080 - 0×07FF用两个字节表示 110xxxxx 10xxxxxx
    0×0800 - 0xFFFF用三个字节表示 1110xxxx 10xxxxxx 10xxxxxx
    举个例子吧,
    如果你遇到了11100110 10110001 10001001 01000001 这样的字节流﹐首先你看第一个字节以1110开头﹐即读3个字节并按模板提取得到 0110 110001 001001(去除模板标志﹐再四字节四字节读即0×6c49),查unicode编码表就是”汉”字,而最后一个以0开头就一定是一个字节了﹐0×0041,也就是”A”。
    20.好了﹐上面是原理﹐再来谈谈简繁体操作系统转换时的乱码问题吧
    21.按照我的想法﹐windows操作系统应该有一个默认的系统字符集﹐如简体操作系统应该是GB码﹐繁体操作系统则是BIG5,英文操作系统是ASCII。系统内的软件(notepad)默认都是使用这个字符集。
    22.所以我在繁体操作系统默认存储的文本文件就是BIG5了﹐当这个文件到了简体系统里﹐它的notepad程序则使用自己的默认编码(GB)来读取﹐这样就乱了。
    23.因此如果在保存时就使用utf-8来保存﹐应该在两系统切换时就不会有问题了。
    24.而要解决这个问题其实也很简单﹐只要知道这个文本文件原来的编码就可以了﹐使用它读出来﹐再转成unicode即可。

1091/6123456>
Open Toolbar