PMP ,专注于WEB功能测试、性能测试、安全测试的研究,从事全面质量管理工作。曾任多家公司测试经理、测试主管。在电子政务、银行、电商、跨境电商、直播电商领域工作多年,曾获得某龙头集团公司公测一等奖,曾任职某头部直播电商公司测试团队负责人,具有业务敏感性,擅长从0到1搭建测试团队,具有海外工作经历,以及质量管理体系搭建。邮箱:89233502@qq.com

发布新日志

  • 测试用例生成工具PICT的安装与使用 -亲测好用

    2021-06-07 21:00:48

    这个工具本人亲自用过,适用于多种组合--比如正交测试用例设计;

    PICT(Pairwise Independent Combinatorial Testing,成对独立组合
    测试)是微软开发的一款测试用例生成工具(生成配对测试用例的工具很多,感兴趣的可以参考http://www.pairwise.org/tools.asp的介绍),它可以生成测试用例和测试配置,其理论基础是成对测试技术(Pairwise Testing,之前有文章单独介绍过,在此不多介绍)。
      一、PICT安装
      通过官网链接?http://download.microsoft.com/do ... 76cc014b/pict33.msi下载安装包,然后一路点击next安装即可。
      安装成功后验证:打开cmd命令终端,输入pict显示如下即证明安装成功。

    图1 pict安装成功验证
      二、PICT使用
      1.建模
      PICT是一个命令行工具。在使用PICT生成用例前,需要准备好一个模型文件,PICT将会根据模型文件自动生成组合列表。根据配对测试基于的假设:模型文件中,每个测试点/维度都是正交的,且每个测试点/维度具有有限的影响因子。假如针对邮箱**功能使用PICT生成用例,**功能包含:用户名、密码、手机号、是否同意服务协议4个测试维度,每个测试维度所包含的有限影响因子如下表所示。
    表1 测试分析建模
      2.编辑模型文件
      根据建模结果,编辑模型文件,如下图所示:

    图2 模型文件
      3.运行模型文件
      打开cmd命令终端,运行pict test.txt>test.xls,将测试点组合结果输出到test.xls文件。结果如下图所示,共生成157个测试点,在原本13*12*5*2=1560个用例基础上,用例精减率达到90%:

    图3 pict执行结果
      4.约束条件
      在2、3中的例子,使用的是无约束条件pict模型。而在现实中,对于已经经历多个迭代的版本,可能有些组合条件已经测试,因此,可以在pict的模型文件中使用约束条件将之排除。如2、3例中,添加约束条件:“if [用户名] = "为空" or [密码] = "为空" then [手机号] <> "为空";“,表示如果“用户名”或“密码”为空时,“手机号”不为空。

    图4 添加约束条件的模型文件
      执行上述添加约束条件后的模型文件,生成test1.xls结果如下图所示,与无约束条件的图3想比,测试点数仍为157个,但测试点中不包括:“用户名”=“为空”,“手机号”=“为空”和“密码”=“为空”,“手机号”=“为空”这两例。

    图5 添加约束条件后pict执行结果
      三、效益
      PICT是使用较广的一种配对测试用例生成工具。对于多维度多因子的组合测试,使用PICT可以快速、有效地筛选出经过配对测试筛选后的组合,有助于测试人员节省测试要点整理时间和测试执行时间。
      四、FAQ
      1.pict执行模型文件报错,错误提示为乱码?
      答:pict仅仅支持ANSI和UTF8 ,此处保存为UTF8仍然乱码,则另存为ANSI就可以了。
      2.执行模型文件错误,提示没有定义参数值?
      答:模型文件中的冒号:和逗号,需要为英文字符。
      3.加入约束条件后执行文件,提示输入错误?
      答:约束条件字符串值用双引号而不是单引号。
  • jira中设置过滤器权限以及系统仪表盘设置

    2021-01-25 13:55:46

    一、配置可以共享过滤器的权限
    在Global Permissions中,把特定组加入到可以共享过滤器的权限
     
    1、用超级管理员登陆到jira页面,
    2、进入"管理"页面
    3、点击左边的"Global Permissions"进入权限管理页面
    4、在页面下部的"Add Permission"中的"Group:"部分选择需要拥有权限的组,比如"jira-developer",在"Permission:"选择中"Create Shared Filter"并点击"增加"这样所有在"jira-developer"组的用户就有共享过滤器的权限了。
    5、在jira过滤器配置直接就有共享按钮了。

    二、配置过滤器的权限
    1、问题列表配置搜索条件,另存为过滤器,并设置过滤器访问权限,权限也可以后面再配;
    2、过滤器管理--点击星星 --详情页 配置过滤器访问权限,一般设置ldap权限;
    三、配置系统仪表盘
    1、管理员登录系统仪表盘,创建小程序,引用所配置过的过滤器,设置问题显示字段和字段排序,并设置刷新时间,一般是15分钟;
    2、拖拽完成系统仪表盘的排版;所有研发人员和测试人员就能看到你配置的仪表盘了,大功告成。

    截图发不上去,上一篇发了截图直接没保存,51testing的论坛要优化下了。
  • nmon学习笔记

    2015-07-03 17:53:42

    nmon学习笔记 见附件
  • nmon学习笔记

    2015-07-03 17:51:19

    windows

    1 如何获取windows计数器:
    Lr:System Resouce Graphs-windowsResources ,右键资源,添加Machine,输入Name的IP地址,
    就能监控某个IP的windows资源

    2 任务管理器
      taskmgr

    2 性能监视器
      perfmon


    Linux:

    查看服务器是几cpu还是几核:

    cat /proc/cpuinfo | grep "physical id" | sort |uniq |wc -l

    cat /proc/cpuinfo |grep "cpu cors"|uniq



    Linux 系统资源常用命令
    cpu:top/vmstat/mpstat/iostat/sar

    memory:top/free/vmstat/iostat/sar/mpstat

    Disk IO:vmstat/iostat/mpstat/sar


    top命令:
    1:当前时间,系统启动时间,当前系统登录用户,平均负载
    2:所有启动进城,目前运行的,挂起,无用
    3:目前cpu使用情况
    4:物理内存,已用内存,空闲内存,缓冲区占用


    uptime:
    当前时间、系统运行多久,目前有多少登陆用户,系统过去1,5,15分钟平均负载
    一般load average<3良好,大于5有问题,平均负载为1


    free:
    显示内存使用情况,使用权限是所有用户。
    如:free -s 2 -m 每2秒刷新一次内存使用情况

    meminfor:cat /proc/meminfor

    vmstat:
    显示虚拟内存,磁盘,页交换区,cpu活动统计信息。
    swap:页交换空间大小
    so:如果swap过多,表明物理 内存不足


    netstat:

    iotstat、sar命令不识别,需要安装linux时将该命令安装上。

    sar用来数cpu使用率、内存、网络、进程活动、磁盘活动

    LR获取Linux指标:
    1、lr-system resouces graphs 
       Unix-resouces-add Machine-输入IP地址,(需要安装RPC,启动后才可获取到)

    2、实时监控-linux命令

    2、第三方监控工具(只支持linux)
    nmon/glance

    nmon工具:

    1、下载nmon版本与操作系统版本要匹配
    2、权限-可执行权限

    使用方法:
    1、#./nmon c m d n t
    2、 记录文件 ./nmo -F res_项目简称_mix_app_用户数_时间日期.nmon -s 2 -c 1800 &
         2秒取一次 ,取1800次,写入到文件中,进程关闭不再执行。
     
    分析nmon结果:cpu 内存 磁盘 网络

    打开nmon文件出现问题,sheet页的行数超过最大范围,进行规律拆分,将“总表头”放在每个文件中。


    做过优化,改过程序,测试全部重做。

    业务数据监控目的:
    手段:
    1、检查点,检查数据是否操作成功。
    2、业务数据监控手段:数据库,对于DML操作,
    3、利用log输入函数查看日志数据是否操作成功。
  • nmon学习笔记

    2015-07-03 17:48:42

    1 如何获取windows计数器:
    Lr:System Resouce Graphs-windowsResources ,右键资源,添加Machine,输入Name的IP地址,就能监控某个IP的windows资源

    2 任务管理器
      taskmgr

    2 性能监视器
      perfmon


    Linux:

    查看服务器是几cpu还是几核:

    cat /proc/cpuinfo | grep "physical id" | sort |uniq |wc -l

    cat /proc/cpuinfo |grep "cpu cors"|uniq



    Linux 系统资源常用命令
    cpu:top/vmstat/mpstat/iostat/sar

    memory:top/free/vmstat/iostat/sar/mpstat

    Disk IO:vmstat/iostat/mpstat/sar


    top命令:
    1:当前时间,系统启动时间,当前系统登录用户,平均负载
    2:所有启动进城,目前运行的,挂起,无用
    3:目前cpu使用情况
    4:物理内存,已用内存,空闲内存,缓冲区占用


    uptime:
    当前时间、系统运行多久,目前有多少登陆用户,系统过去1,5,15分钟平均负载
    一般load average<3良好,大于5有问题,平均负载为1


    free:
    显示内存使用情况,使用权限是所有用户。
    如:free -s 2 -m 每2秒刷新一次内存使用情况

    meminfor:cat /proc/meminfor

    vmstat:
    显示虚拟内存,磁盘,页交换区,cpu活动统计信息。
    swap:页交换空间大小
    so:如果swap过多,表明物理 内存不足


    netstat:

    iotstat、sar命令不识别,需要安装linux时将该命令安装上。

    sar用来数cpu使用率、内存、网络、进程活动、磁盘活动

    LR获取Linux指标:
    1、lr-system resouces graphs 
       Unix-resouces-add Machine-输入IP地址,(需要安装RPC,启动后才可获取到)

    2、实时监控-linux命令

    2、第三方监控工具(只支持linux)
    nmon/glance

    nmon工具:

    1、下载nmon版本与操作系统版本要匹配
    2、权限-可执行权限

    使用方法:
    1、#./nmon c m d n t
    2、 记录文件 ./nmo -F res_项目简称_mix_app_用户数_时间日期.nmon -s 2 -c 1800 &
         2秒取一次 ,取1800次,写入到文件中,进程关闭不再执行。
     
    分析nmon结果:cpu 内存 磁盘 网络

    打开nmon文件出现问题,sheet页的行数超过最大范围,进行规律拆分,将“总表头”放在每个文件中。


    做过优化,改过程序,测试全部重做。

    业务数据监控目的:
    手段:
    1、检查点,检查数据是否操作成功。
    2、业务数据监控手段:数据库,对于DML操作,
    3、利用log输入函数查看日志数据是否操作成功。
  • 高流量大并发Linux TCP性能调优

    2015-02-27 18:05:53

    其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。
      本文参考文章为:
      优化Linux下的内核TCP参数来提高服务器负载能力
      Linux Tuning
      本文所面对的情况为:
      高并发数
      高延迟高丢包(典型的美国服务器)
      值得注意的是,因为openvz的VPS权限比较低,能够修改的地方比较少,所以使用openvz的VPS作VPN服务器是非常不推荐的。
      我们通过修改 /etc/sysctl.conf 来达到调整的目的,注意修改完以后记得使用:
      sysctl -p
      来使修改生效。
      首先,针对高并发数,我们需要提高一些linux的默认限制:
      fs.file-max = 51200
      #提高整个系统的文件限制
      net.ipv4.tcp_syncookies = 1
      #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
      net.ipv4.tcp_tw_reuse = 1
      #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
      net.ipv4.tcp_tw_recycle = 0
      #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
      #为了对NAT设备更友好,建议设置为0。
      net.ipv4.tcp_fin_timeout = 30
      #修改系統默认的 TIMEOUT 时间。
      net.ipv4.tcp_keepalive_time = 1200
      #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
      net.ipv4.ip_local_port_range = 10000 65000 #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
      net.ipv4.tcp_max_syn_backlog = 8192
      #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
      net.ipv4.tcp_max_tw_buckets = 5000
      #表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。
      #额外的,对于内核版本新于**3.7.1**的,我们可以开启tcp_fastopen:
      net.ipv4.tcp_fastopen = 3
      其次,针对大流量高丢包高延迟的情况,我们通过增大缓存来提高 TCP 性能,自己看E文注释吧……感觉我翻译出来各种味道不对 = =:
    # increase TCP max buffer size settable using setsockopt()
    net.core.rmem_max = 67108864
    net.core.wmem_max = 67108864
    # increase Linux autotuning TCP buffer limit
    net.ipv4.tcp_rmem = 4096 87380 67108864
    net.ipv4.tcp_wmem = 4096 65536 67108864
    # increase the length of the processor input queue
    net.core.netdev_max_backlog = 250000
    # recommended for hosts with jumbo frames enabled
    net.ipv4.tcp_mtu_probing=1
      这里面涉及到一个 TCP 拥塞算法的问题,你可以用下面的命令查看本机提供的拥塞算法控制模块:
      sysctl net.ipv4.tcp_available_congestion_control
      如果没有下文提到的htcp,hybla算法,你可以尝试通过modprobe启用模块:
      /sbin/modprobe tcp_htcp
      /sbin/modprobe tcp_hybla
      对于几种算法的分析,详情可以参考下: TCP拥塞控制算法 优缺点 适用环境 性能分析 ,但是这里面没有涉及到专门为卫星通讯设计的拥塞控制算法:Hybla。根据各位大神的实验,我们发现Hybla算法恰好是最适合美国服务器的 TCP 拥塞算法,而对于日本服务器,个人想当然的认为htcp算法应该可以比默认的cubic算法达到更好的效果。但是因为htcp算法恰好没有编入我们所使用的VPS中,所以没办法测试
      #设置 TCP 拥塞算法为 hybla
      net.ipv4.tcp_congestion_control=hybla
  • 减少缺陷漏测的系统方法(转)

    2015-02-27 18:03:45

    功能缺陷的测试方法流程
       第一步: 功能测试分析 功能测试阶段
                目的: 提取功能测试对象
                           准备功能测试数据
                减少因为功能测试对象遗漏的漏测

       第二步:功能验证功能测试阶段
                目的:检查功能是否已基本正确实现   
                测试方法 :
    基于生命期: 对象创建 -使用- 销毁 的验证
    数据测试方法: 静态数据测试方法和动态数据测试方法 (边界值和数据等价类、7因子数据类型)
                减少功能的基本逻辑错误漏测和数据处理错误的漏测

       第三步:单功能内测试 功能测试阶段
                目的:发现功能是否存在分支情况、异常情况处理不足的缺陷
                测试方法 :
                功能内子功能的场景插入法
                             重复法设计
                             反叛法设计
                             取消法设计
                            测一送一法设计
                           场景删除法设计
                减少功能内代码的漏测
                 
       第四步:多功能间组合测试 系统测试阶段的用户场景测试
                目的:发现功能间配合工作时存在的缺陷
                测试方法
                    基于用户场景的测试 (Scenario Test)
                减少多功能间组合错误的漏测

    为什么需要用户场景的测试模型?
         补充多个功能组合的测试用例解决传统正交组合测试后3个及以上功能组合缺陷的漏测
         通过常见用户操作序列的场景设计解决数学式穷尽组合爆炸的问题减少组合测试时间和成本,获得最佳投入产出比的组合测试

    用户场景测试的测试步骤 是 不同角色用户最常用的基本操作序列
    用户场景的探索测试    是 不同角色用户非常用的操作序列

    用户场景的探索测试
    在用户场景测试用例执行结束后 , 再用专项时间进行多功能组合的探索测试,补充用户场景测试用例之外的用户操作序列,提高用户操作序列的覆盖面。因为用户最常用的操作序列已在用户场景测试用例中覆盖,但又不能对非常规的操作序列不进行测试,   因此将非常规的操作序列的测试与测试成本进行一个平衡,通过专项的探索测试时间来补充这部分的测试。

    在补充用户操作序列的探索测试中可用的探索测试方法有:
    收藏家法
                同时开启多个功能,同时工作。
    技术根因
               同时多个功能交互容易出现资源竞争处理的错误。

    地标法
            改变一系列规定顺序操作的先后顺序。( A->B->C->D->E)改为 (A->D->C->B->E)
    技术根因
          在实际场景中用户因为对操作不熟悉难免会操作的步骤不是标准的步骤顺序,而程序实现时对于这些改变了操作顺序的操作步骤缺乏容错处理则会出现程序错误。

     混票法
           把最不常用的功能与常用功能进行组合
        技术根因
           在功能测试阶段由于时间及优先级限制,测试人员习惯把常用功能进行组合测试,时间一久就容易忘掉不常用功能与常用功能的组合,而用户的使用习惯中也一定会出现不常用功能与常用功能一起组合的场景

      
  • QTP11的破解方法

    2014-10-08 12:30:56

    QTP11的破解方法
      1)安装成功后,手工创建:C:\Program Files\Common Files\Mercury Interactive下,
      建立文件夹License Manager(这个很重要,必须要创建)
      2)拷贝破解文件mgn-mqt82.exe至第一步创建的目录下。
      3)运行破解文件,提示在C:\Program Files\Common Files\Mercury Interactive下创建了lservrc文件
      4)用记事本打开lservrc,拷贝第一个#号前的一大串字符串。运行QTP,输入这串字符
      5)安装QTP的功能测试许可服务器安装程序(打开qtp11的安装包里边的)
      6)删掉SafeNet Sentinel目录(C:\ProgramData\SafeNet Sentinel)
      7)运行\HP\QuickTest Professional\bin中的instdemo.exe
  • 软件测试常用的基础工具

    2014-08-20 20:57:52

    http请求监控工具:HttpWatchhttpdebug 、firebug
    文件监控工具:Filemonitor
    字符编码工具:CodeFree
    数据生成工具:DBMonsterdatafactory
    浏览器测试工具:ietester
    文件比较工具:Beyond Compare
    功能测试工具:QTPTCSelenium……
    性能测试工具:loadrunnerJmeter……
    数据库性能监测:spotlight
    Java剖析工具:JProfiler

    1、关于Web端站点的自动化测试:常用的开源测试工具:selenium框架+一门编程语言(建议python),或者收费软件QTP,推荐selenium,因为它是开源的、免费的,不存在盗版问题、且可扩展,所以国内的一线大公司喜欢用。
    2、Pc客户端自动化测试:常用的测试工具:QTP。付费软件,国内很多小公司在用,当然是盗版的。
    3、Android手机自动化测试:常用的测试工具:monkey、monkeyrunner、robutium、appium等,这些都是开源软件。一样,国内一流的公司都在使用。
     4、苹果端的自动化测试:常用的测试工具:Instrument、FoneMonke、Broomine、iphoneSDK自带的testunit。
  • 冒烟测试工作方法及注意事项

    2014-08-05 18:11:29

    冒烟测试工作方法:
      冒烟测试应将重要的功能全部覆盖。测试的时候注重覆盖率。

      列出冒烟测试的主要功能、测试点。

      运行主要流程测试用例与测试数据,检查主要功能是否已经基本正确实现

      初步运行主要功能的性能测试,是否存在明显的性能缺陷。

    如果是项目中的首次执行测试。首先我们需要验证测试用例是否适用,有很多情况下测试用例是在需求评审后就开始写的,由于项目种种的沟通因素,可能那个时候写的测试用例到测试执行的时候会过时、遗漏。因此在执行测试用例之前先要思考测试用例是否需要小范围的修改。
            在执行测试用例前,针对执行的子系统、模块,验证需要执行的测试用例是否存在遗漏。

    执行测试用例之前验证测试数据是否已经准备,是否存在还需要修正的数据。

    安排测试用例执行的先后顺序、测试用例的组合,并形成测试集。

    测试过程中发现缺陷,记录到缺陷管理中,并走缺陷管理流程。

    测试结果及时记录,无论是测试用例执行有没有通过。

    对测试发现的稳定定时进行归纳与总结,预测以后测试可能会存在的风险。需要每天进行一次对当天的测试情况回顾。
  • 常用的功能测试方法

    2014-06-10 12:58:59

    功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。常用的测试方法如下:
    1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确。
    2. 相关性检查:删除/增加一项会不会对其他项产生影响,如果产生影响,这些影响是否都正确。
    3. 检查按钮的功能是否正确:如update, cancel, delete, save等功能是否正确。
    4. 字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度,会不会出错.
    5. 字符类型检查: 在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错.
    6. 标点符号检查: 输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确.
    7.中文字符处理: 在可以输入中文的系统输入中文,看会否出现乱码或出错.
    8. 检查带出信息的完整性: 在查看信息和update信息时,查看所填写的信息是不是全部带出.,带出信息和添加的是否一致
    9. 信息重复: 在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理.
    10. 检查删除功能:在一些可以一次删除多个信息的地方,不选择任何信息,按”delete”,看系统如何处理,会否出错;然后选择一个和多个信息,进行删除,看是否正确处理.
    11. 检查添加和修改是否一致: 检查添加和修改信息的要求是否一致,例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型.
    12. 检查修改重名:修改时把不能重名的项改为已存在的内容,看会否处理,报错.同时,也要注意,会不会报和自己重名的错.
    13. 重复提交表单:一条已经成功提交的纪录,back后再提交,看看系统是否做了处理。
    14. 检查多次使用back键的情况: 在有back的地方,back,回到原来页面,再back,重复多次,看会否出错.
    15. search检查: 在有search功能的地方输入系统存在和不存在的内容,看search结果是否正确.如果可以输入多个search条件,可以同时添加合理和不合理的条件,看系统处理是否正确.
    16. 输入信息位置: 注意在光标停留的地方输入信息时,光标和所输入的信息会否跳到别的地方.
    17. 上传下载文件检查:上传下载文件的功能是否实现,上传文件是否能打开。对上传文件的格式有何规定,系统是否有解释信息,并检查系统是否能够做到。
    18. 必填项检查:应该填写的项没有填写时系统是否都做了处理,对必填项是否有提示信息,如在必填项前加*
    19. 快捷键检查:是否支持常用快捷键,如Ctrl+C Ctrl+V Backspace等,对一些不允许输入信息的字段,如选人,选日期对快捷方式是否也做了限制。
    20. 回车键检查: 在输入结束后直接按回车键,看系统处理如何,会否报错.

  • 给管理者和普通员工的21条建议(转)

    2014-06-10 12:50:14

           1.要按时完成任务。如果你无法按时完成,一定要第一时间告诉你的上司/老板

      2.如果完不成任务是因为缺资源(缺人,缺钱或其他),一定要在第一时间找上司/老板要资源

      3.要尽量满足你的岗位职责要求。如果你的岗位职责设置有问题,一定要和上司/老板谈,而不是忍耐

      4.上司/老板经常要求你做很多事情。不能全部做到不要紧,尽量多做一些就会有奇迹。同时要告诉上司/老板你不能做到什么

      5.不要同时想抓两只兔子。如果上司/老板要求你同时抓两只兔子,你自己要做取舍,先抓到一只,再抓第二只。同时抓两只兔子,你的老板也做不到

      6.不光要提出问题,要给出自己的答案。上司/老板喜欢的是既能看到问题,又能给出答案的人

      7.上司/老板问到的事情一定要第一时间回复

      8.上司/老板不再问的也要追踪到结束。上司/老板喜欢的是他想到的你做了,他没想到的你也做了

      9.给自己找个身边的榜样。通常你的上司/老板就是最好的榜样

      10.养成帮助别人的习惯,帮别人也是帮自己。这个世界最重要的资源是人脉,帮助别人是建立人脉最好的办法

      11.多和同事分享,分享不吃亏。上司/老板喜欢的是不仅自己能干,还能帮助别人干好的人

      12.花时间培养你的下属。这样你不仅会有比做成一件事更大的成就感,你还会得到更多晋升的机会

      13.管理人有三个台阶:指挥,指导,发动。要尽快上到更高的台阶,学会辅导,学会激励,学会启发

      14.不光会管人,还要会理事。理是事情的标准化,书面化,是经验总结,是流程梳理

      15.培养自己的归零心态。有成绩庆祝一下,之后就忘掉它,从头再来,不要让骄傲控制你。对待失败也是一样:总结一下为什么失败,然后忘掉它,从头再来,不要让沮丧控制你

      16.培养自己的感恩心态。只有感恩的人才会快乐,只有感恩的人才会得到更多的帮助

      17.不懂的要提问,困惑的要讨论,不同意的要争论。老板喜欢能和他对话的人,不喜欢唯唯诺诺的人

      18.不在背后说别人/上司/公司的坏话。有意见要当面和上司/老板谈,他们会感谢你的

      19.如果你觉得薪酬不公平,可以和上司/老板说,但不要期望马上有改变,上司/老板可能有他们的难处

      20.不要争薪酬,要争培训。薪酬不是争来的,薪酬是挣来的。培训能提高你的能力,能力永远是你自己的

      21.如果你觉得现在的上司/老板不够好,想办法改变他。如果不能改变,你可以炒他的鱿鱼。但不要相信下一个上司/老板会比现在的好。


  • linux/win下安装loadrunner步骤详解

    2014-05-28 17:50:27

    linux-loadruner :安装于linux 下的loadrunner genarater
    安装步骤参考:http://4951507.blog.51cto.com/4941507/1099487
    linux下安装loadrunner时:需要安装一下compat-libstdc++-33-3.2.3-69 软件包
    (参考文档:http://publib.boulder.ibm.com/infocenter/dmndhelp/v6r1mx/index.jsp?topic=/com.ibm.websphere.wps.610.doc/doc/tins_rhel_packages.html)
    ps:此安装包安装的原因:由于我在虚拟机安装loadrunner时报错找不到库函数,因此安装了一下这个包;如果安装过程中没有出现安装错误可以不安装
    win-loadrunner :安装于win 下的loadrunner 
    安装步骤参考:http://www.doc88.com/p-776376392972.html
    win下安装loadrunner时:
    1win loadrunner版本:loadrunner11
    2破解:必须装
     先执行lr_del
     再将loadrunner8.0里面的文件拷贝到安装目录下(比如我的安装目录为:C:\Program Files (x86)\HP\LoadRunner\bin)
    3中文插件(可装可不装,按照个人需求)
    4补丁(第一次安装可不装)

    ps:由于loadrunner11太大,不能共享;推荐下载网址:

    http://www.loadrunnercn.com/thread-5-1-1.html

    其他安装所需软件(金山快盘共享):http://www.kuaipan.cn/share.htm?s=aXw1IijcaKElxubW-A4fsFwAAAQ4=


  • linux/win下安装loadrunner步骤详解

    2014-05-28 17:50:27

    linux-loadruner :安装于linux 下的loadrunner genarater
    安装步骤参考:http://4951507.blog.51cto.com/4941507/1099487
    linux下安装loadrunner时:需要安装一下compat-libstdc++-33-3.2.3-69 软件包
    (参考文档:http://publib.boulder.ibm.com/infocenter/dmndhelp/v6r1mx/index.jsp?topic=/com.ibm.websphere.wps.610.doc/doc/tins_rhel_packages.html)
    ps:此安装包安装的原因:由于我在虚拟机安装loadrunner时报错找不到库函数,因此安装了一下这个包;如果安装过程中没有出现安装错误可以不安装
    win-loadrunner :安装于win 下的loadrunner 
    安装步骤参考:http://www.doc88.com/p-776376392972.html
    win下安装loadrunner时:
    1win loadrunner版本:loadrunner11
    2破解:必须装
     先执行lr_del
     再将loadrunner8.0里面的文件拷贝到安装目录下(比如我的安装目录为:C:\Program Files (x86)\HP\LoadRunner\bin)
    3中文插件(可装可不装,按照个人需求)
    4补丁(第一次安装可不装)

    ps:由于loadrunner11太大,不能共享;推荐下载网址:

    http://www.loadrunnercn.com/thread-5-1-1.html

    其他安装所需软件(金山快盘共享):http://www.kuaipan.cn/share.htm?s=aXw1IijcaKElxubW-A4fsFwAAAQ4=


  • (转)linux下安装loadrunner步骤以及出错解决方法(外加linux下ip地址欺骗)

    2014-05-28 17:48:36

    1. 到官方网站到HP官网下载Load Generator 安装文件 _Load_Generator_11.00_T7330-15010.iso或者其它网站下载loadrunner-11-load-generator.iso

    2.确认linux下安装c++,或者安装了c++但是与Load Generator 解析的c++文件不匹配时需要下载c++包,我这里下载的是:compat-libstdc++-33-3.2.3-69.el6.i686.rpm

    确认安装c++命令:rpm - q(ps:-与q之间有空格,出现usage)

    安装c++包命令:rpm -ivh compat-libstdc++-33-3.2.3-69.el6.i686.rpm(ps:-与ivh之间没有空格)

    安装包地址已共享:安装linux下loadrunner所需软件

    3.解压loadrunner-11-load-generator.iso,解压改文件需先创建一个空目录用于挂载解压后的文件

    eg: 

    第一步:先创建一个目录用于存放loadrunner-11-load-generator.iso和libstdc++-33-3.2.3-69.el6.i686.rpm;

       mkdir /sysvol/must_soft

    第二步:创建一个空目录用于挂载解压后的文件

       mkdir /sysvol/loadrunner

    第三步:解压loadrunner-11-load-generator.iso

    mount -o loop loadrunner-11-load-generator.iso  /sysvol/loadrunner

    (ps:这里使用loop挂载:使用loop的原因


    解压成功后能看到挂载目录,并且解压之后解压目录有三个文件:Hp  Linux  Solaris



    第四步:进入Linux 目录执行./installer.sh  选择:n----a----i----f 即安装完毕,安装完成之后的loadrunner的执行目录在/opt/HP/HP_LoadGenerator(默认位置)


    4.配置环境: 

    (1)查看自己的环境下是哪一种shell ( echo $0),我的环境下查看的为:/bin/bash

    【1】添加用户:useradd -g 0 -s /bin/bash hp_load

    【2】在root用户下,/root/.bashrc中添加环境变量:

    (这些环境变量来自于/opt/HP/HP_LoadGenerator/ env.csh)

    export PRODUCT_DIR=/opt/HP/HP_LoadGenerator
    export M_LROOT=$PRODUCT_DIR
    export LD_LIBRARY_PATH=${M_LROOT}/bin 
    export PATH=${M_LROOT}/bin:$PATH

     

    执行:source /root/.bashrc

    (2)验证loadrunner是否安装成功

        [1]切换到hp_load用户:su hp_load

        [2]cd /opt/HP/HP_LoadGenerator/bin/

           ./verify_generator

    若出现以下图1,表示刚刚在/root/.bashrc下的环境变量设置成功

    若出现以下图2,表示刚刚的环境变量设置失败,需重设图2:

    图2

     出现图一:表示还需要设置一下DISPLAY环境变量

    设置方法:在终端:export DISPLAY=192.168.8.188:0.0(ps:192.168.8.188为controller 服务器)

    如果在用户hp_load中无法export换成root用户重新export再切换到hp_load用户,执行确认是否安装成功的命令

    cd /opt/HP/HP_LoadGenerator/bin/;./verify_generator),出现下图表示刚刚的export成功


    此时验证是否成功已经不报:verify_generator must have a DISPLAY set, please set and rerun;而是报/tmp的权限问题。现在把/tmp目录改成777的权限即可:命令为:chmod 777 /tmp(ps :此操作需要在root用户下执行);再进行上一步的操作,出现下图所示:

    [hp_load@localhost bin]$ ./verify_generator 
    ===================================================
                  HP
         Vuser Environment Verification Utility
    ===================================================


    Product: LoadRunner 11.0 
    Version: 11.0.0.8866 
    Build: 8866  




    localhost.Infoworks: 


    verify_generator...OK
    verify_generator...OK
    verify_generator...OK 
    Don't forget to make sure that the name of the controller machine 
    is also in .rhosts 
    Verify $M_LROOT ...Failed 
    _____It was not possible to set the $M_LROOT from 
    _____the shell dot files. One of several things might be happening: 
    _____1) $M_LROOT is not set at all in the shell dot files. 
    _____2) There is some error in the shell dot files which stops their execution 
    _____   before it sets $M_LROOT. 
    _____3) There is conditional code in the shell dot files (most likely related to 
    _____   interactive and non interactive shells) and $M_LROOT is set 
    _____   only in one of the sections. 
    _____Aborting virtual user tests on host localhost.Infoworks 
    verify_generator...OK 
    _______________________________________________


    Summary:
    ________
    Vuser Host localhost.Infoworks: Failed


    验证ok,(ps:Vuser Host localhost.Infoworks: Failed此错误目前没有影响loadrunner代理的正常启动,暂不用考虑)


    5.启动linux下的loadrunner负载

    cd /opt/HP/HP_LoadGenerator/bin

    [hp_load@localhost bin]$ ./m_daemon_setup start
    m_agent_daemon ( 8273 ), 

    表示已经启动成功


    这些问题是我在安装过程中遇到的常规问题,如果还有其他的问题可以参考下面几个网址:

    http://wenku.baidu.com/view/bf4d761cff00bed5b9f31d99.html

    http://wenku.baidu.com/view/db72a74ce45c3b3567ec8b26.html


    linux下loadrunner 的ip地址欺骗:

    步骤一:添加虚拟网卡,用于配置可以欺骗的ip地址(注:用于ip地址欺骗的地址必须保证无人正在使用,一般公司里需要向it部门申请空闲ip地址段,以免照成网络使用混乱)

    一般写脚本用于添加虚拟网卡:

    直接配置虚拟网卡: eg: ifconfig em1:2 192.168.82.111 netmask 255.255.252.0

    add_network.sh

    #!/bin/bash
    ifconfig em1:1 192.168.82.110 netmask 255.255.252.0
    ifconfig em1:2 192.168.82.111 netmask 255.255.252.0
    ifconfig em1:3 192.168.82.112 netmask 255.255.252.0

    -----ip地址192.168.82.110~192.168.82.112均为空闲ip并且能够连接需要测试的服务器ip

    网卡配置完之后如下图所示:



    使用ip欺骗时需注意:
    1.要使用it部门给的可用ip列表,防止云平台的ip使用混乱
    2.使用完成之后最好释放ip资源(如果用xp就直接释放;如果用linux就service network restart就会还原)

  • 如何快速测出APP bug?

    2014-05-21 22:22:46

    对于移动APP应用的开发而言,难以清除的各种Bug常常令人非常头疼。而且更加让人难以忍受的是,这样Bug往往隐藏的很深。很多时候,甚至要到公测开放给用户使用之后,才会显现出来。对于小型的开发团队来说,十有八九是赔了产品又亏钱。

    那么我们怎样才能把APP中Bug在测试环境下,就彻底清除呢?下面笔者就给广大的移动开发者们,推荐10款免费的移动APP应用开发测试框架,这不仅可以帮我们大大简化测试流程,个个都还堪称是清除Bug的神器。

    怎么快速测试APP应用的BUG?

    一、跨平台开发移动应用测试框架

    1. 1

      Appium:无需SDK和编译即可测试

      一款开源且扩平台的自动化测试工具,适用于测试原生或混合型移动App,支持iOS、Android和FirefoxOS平台。通过它,开发者可以利用测试代码完全访问后端API和数据库。Appium是基于无需SDK和编译就可以对原生应用进行测试的理念而设计的。

      该框架不仅能完美支持iOS、Android应用,还可直接在PHP、Python、Ruby、C#、 Clojure、Java、Objective-C、JavaScript及Perl等语言中编写测试脚本。

      怎么快速测试APP应用的BUG?
    2. 2

      Calabash:全方位测试利器

      一款适用于iOS和Android平台的跨平台应用测试框架,支持Cucumber,开源且免费,隶属于Xamarin公司。通过Calabash,开发者可以对应用进行多方位测试,比如截屏、手势识别、实际功能代码等。

      怎么快速测试APP应用的BUG?
      END

    二、iOS应用开发移动应用测试框架

    1. 1

      KIF:专为iOS设计的移动应用测试框架

      全称Keep It Functional,来自Square,是一款专为iOS设计的移动应用测试框架。由于KIF是使用Objective-C语言编写的,因此,对于iOS开发者而言,用起来要更得心应手,可以称得上是一款非常值得收藏的iOS测试利器。

      怎么快速测试APP应用的BUG?
    2. 2

      Gitorious:截屏+Python脚本,测试细致入微

      基于Git版本控制系统的Web项目托管平台,使用Ruby on Rails开发。而其移动测试框架(MTF)也是深受开发者欢迎,Gitorious移动测试框架是一款充分利用Sikuli自动化工具的iOS测试框架。

      怎么快速测试APP应用的BUG?
    3. 3

      Frank:模拟用户黑盒测试

      一款深受开发者喜爱的iOS应用测试框架,该框架可以模拟用户操作对应用程序进行黑盒测试,并使用Cucumber作为自然语言来编写测试用例。此外,Frank还会对应用测试操作进行记录,以帮助开发者进行测试回顾。

      怎么快速测试APP应用的BUG?
    4. 4

      FlipTest:再也不用为决定不同版本的好坏发愁

      专为iOS设计的移动应用A/B测试框架,通过它,开发者可以无需重新向App Store提交应用或重构代码,只需添加一行代码,即可直接在iOS应用上进行A/B测试。

      怎么快速测试APP应用的BUG?
    5. 5

      Kiwi:专业iOS开发的行为驱动开发(BDD)库

      接口简单而高效,深受开发者的欢迎,也因此成为了许多开发新手的首选测试平台。和大多数iOS测试框架一样,Kiwi使用Objective-C语言编写,因此对于iOS开发者而言,绝对称得上是最佳测试拍档。

      怎么快速测试APP应用的BUG?
    6. 6

      Cedar:BDD风格多环境测试框架

      和Kiwi一样,Cedar也是一款BDD风格的Objective-C测试框架。它不仅适用于iOS和OS X代码库,而且在其他环境下也可以使用。

      怎么快速测试APP应用的BUG?
      END

    三、Android应用开发移动测试框架

    1. Robolectric:让Android开发从此摆脱模拟器测试的老套路

      Android开发者们注意了,这款测试框架一定会让你们兴奋不已,因为它是一款已基本上摆脱了模拟器测试的老套路的速率单元测试框架。Robolectric可以解压Android SDK,还能直接对应用进行测试,从而帮你轻而易举地解决所遇到的任何问题。

      怎么快速测试APP应用的BUG?
    2. AppGrader:Android开发者的意见大师

      Gitorious MTF能够利用截屏和Python脚本,进行细致入微的测试,并将测试结果返还给开发者以提高应用质量及修复漏洞。

      来自以色列的应用测试服务商uTest推出的一款测试产品。相比其他主流移动应用测试框架,AppGrader可能并不太为开发者所熟知,但它却能够为众多的Android开发者提供非常专业的意见参考。

      怎么快速测试APP应用的BUG?

  • oracle数据库备份

    2014-05-21 12:49:15

    oracle数据库备份

    1. 文件查看

      数据文件、控制文件、日志文件查看如下:

      select file#, status, enabled, name from V$datafile;--查看数据文件

      select * from v$controlfile;--控制文件

      select * from v$logfile;--日志文件

      2. 三种备份方法

      1)导入/导出(import/export

      1.支持类型: table, user tablespace full database

      2. 导入导出例子:

    exp system/manager@TEST file=d:\export.dmp full=y--将数据库TEST完全导出(全库备份),用户名system 密码manager 导出到D:\daochu.dmp

    exp system/manager@TEST file=d:\export.dmp wner=(system,sys)--systemsys的表导出

    exp aichannel/aichannel@TEST file= d:export.dmp tables= (tab1tab2)--tab1表和tab2表导出

    imp system/manager@TEST file=d:\export.dmp tables=(tab1,tab2);--export.dmptab1表和tab2表导入

    imp system/manager@TEST file=d:\export.dmp;

      3. 注意:若用户权限不够时需要修改权限

      --先以system/manager登录

      --授予权限

      grant exp_full_database, imp_full_database to username;

      2)冷备份(非归档模式)

      1. 步骤:shutdown数据库---> copy文件---> start数据库

      2.  例子:

    connect tigger/sccot as sysdba;

    shutdown immediate;

    cp d:/test*.dbf d:export   --cp 文件  目标文件夹    数据文件

    cp d:/test*.ctl d:export   --控制文件

    cp d:/test*.log d:export   --日志文件

    startup;

      3)热备份(归档模式)

      1. 说明:前提条件是数据库运行在归档模式(oracle数据库安装默认运行在非归档模式)

      2. 将数据库转换为归档模式如下:(注意数据库必须已装载到此实例并且不在任何实例中打开)

      --需先关闭数据库并加载数据库

    shutdown immediate;

    startup mount;--startup nomount 启动实例;startup mount 启动实例加载数据库; startup 启动实例加载数据库打开数据库)

    alter database archivelog;--数据库必须已装载到此实例并且不在任何实例中打开

      3. 归档相关操作

    archive log list;--查看是否出于归档模式;

    alter system set log_archive_start =true scope =spfile; --启用主动归档

    select name from v$archived_log; --查询归档日志

    alter system set log_achive_start=false scope=spfile;--将数据库切换为归档模式

    archive log stop;

    archive log start;

     4. 热备份具体步骤如下:

    shutdown immediate;

    startup mount;

    alter database archivelog;

    alter database open;

    alter tablespace users begin backup; --设置备份模式;

    host copy d:\oracle\*.dbf d:\export;--拷贝

    alter tablespace users end backup ;--结束备份状态

    alter system switch logfile--切换日志,使用当前日志归档

      5. 不足之处:不能出错

      6. 优点:备份时数据库仍然可以使用,备份时间短

      3.RMAN备份和恢复工具(rocovery manager

      1)说明:

      1.RMAN ORACLE提供的一个备份与恢复的工具,可以用来执行完全或不完全的数据库恢复。

      2.RMAN不能用于备份初始化参数文件和口令文件。

      3. 与传统工具相比,RMAN具有独特的优势:跳过未使用的数据块。当备份一个RMAN备份集时,RMAN不会备份从未被写入的数据块,而传统的方式无法获知那些是未被使用的数据块。

      4. RMAN可以进行增量备份(增量备份是针对于上一次备份(无论是哪种备份):备份上一次备份后,所有发生变化的文件)

      2)例子:

      --准备工作:

      connect tiger/sccot;

      startup mount

      alter database archivelog

      alter database open

      --查看备份相关信息

      list backupset;

      --备份全库

      backup database;

      --备份表空间

      backup tablespace tp1;

      --备份全库删除旧的归档日志

      backup databse plus archivelog delete input;--备份全库及控制文件、服务器参数文件与所有归档的重做日志,并删除旧的归档日志

  • Java 垃圾回收策略调优

    2014-05-12 18:20:12

    JVM参数调优是一个很头痛的问题,可能和应用有关系,下面是本人一些调优的实践经验,希望对读者能有帮助,环境LinuxAS4,resin2.1.17,JDK6.0,2CPU,4G内存,dell2950服务器,网站是shedewang.com,新手可能觉得这文章没有用。 

    一:串行垃圾回收,也就是默认配置,完成10万request用时153秒,JVM参数配置如下 
    $JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M -Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc -Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps "; 
    这种配置一般在resin启动24小时内似乎没有大问题,网站可以正常访问,但查看日志发现,在接近24小时时,Full GC执行越来越频繁,大约每隔3分钟就有一次Full GC,每次Full GC系统会停顿6秒左右,作为一个网站来说,用户等待6秒恐怕太长了,所以这种方式有待改善。MaxTenuringThreshold=7表示一个对象如果在救助空间移动7次还没有被回收就放入年老代,GCTimeRatio=19表示java可以用5%的时间来做垃圾回收,1/(1+19)=1 /20=5%。 

    二:并行回收,完成10万request用时117秒,配置如下: 
    $JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xmx2048M -Xms2048M -Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -Xnoclassgc -Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=500 -XX:+UseAdaptiveSizePolicy -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 "; 
    并行回收我尝试过多种组合配置,似乎都没什么用,resin启动3小时左右就会停顿,时间超过10 秒。也有可能是参数设置不够好的原因,MaxGCPauseMillis表示GC最大停顿时间,在resin刚启动还没有执行Full GC时系统是正常的,但一旦执行Full GC,MaxGCPauseMillis根本没有用,停顿时间可能超过20秒,之后会发生什么我也不再关心了,赶紧重启resin,尝试其他回收策略。 

    三:并发回收,完成10万request用时60秒,比并行回收差不多快一倍,是默认回收策略性能的2.5倍,配置如下: 
    $JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M -Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc -Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 "; 
    这个配置虽然不会出现10秒连不上的情况,但系统重启3个小时左右,每隔几分钟就会有5秒连不上的情况,查看gc.log,发现在执行ParNewGC时有个promotion failed错误,从而转向执行Full GC,造成系统停顿,而且会很频繁,每隔几分钟就有一次,所以还得改善。UseCMSCompactAtFullCollection是表是执行Full GC后对内存进行整理压缩,免得产生内存碎片,CMSFullGCsBeforeCompaction=N表示执行N次Full GC后执行内存压缩。 

    四:增量回收,完成10万request用时171秒,太慢了,配置如下 
    $JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M -Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc -Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xincgc "; 
    似乎回收得也不太干净,而且也对性能有较大影响,不值得试。 

    五:并发回收的I-CMS模式,和增量回收差不多,完成10万request用时170秒。 
    $JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M -Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc -Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10 -XX:-TraceClassUnloading "; 
    采用了sun推荐的参数,回收效果不好,照样有停顿,数小时之内就会频繁出现停顿,什么sun推荐的参数,照样不好使。 

    六:递增式低暂停收集器,还叫什么火车式回收,不知道属于哪个系,完成10万request用时153秒 
    $JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M -Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc -Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseTrainGC "; 
    该配置效果也不好,影响性能,所以没试。 

    七:相比之下,还是并发回收比较好,性能比较高,只要能解决ParNewGC(并行回收年轻代)时的promotion failed错误就一切好办了,查了很多文章,发现引起promotion failed错误的原因是CMS来不及回收(CMS默认在年老代占到90%左右才会执行),年老代又没有足够的空间供GC把一些活的对象从年轻代移到年老代,所以执行Full GC。CMSInitiatingOccupancyFraction=70表示年老代占到约70%时就开始执行CMS,这样就不会出现Full GC了。SoftRefLRUPolicyMSPerMB这个参数也是我认为比较有用的,官方解释是softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap,我觉得没必要等1秒,所以设置成0。配置如下 
    $JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M -Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -Xloggc:log/gc.log "; 
    上面这个配置内存上升的很慢,24小时之内几乎没有停顿现象,最长的只停滞了0.8s,ParNew GC每30秒左右才执行一次,每次回收约0.2秒,看来问题应该暂时解决了。 

    参数不明白的可以上网查,本人认为比较重要的几个参数是:-Xms -Xmx -Xmn MaxTenuringThreshold GCTimeRatio UseConcMarkSweepGC CMSInitiatingOccupancyFraction SoftRefLRUPolicyMSPerMB
  • JVM性能调优(转)

    2014-05-12 13:27:02

    最近因项目存在内存泄漏,故进行大规模的JVM性能调优  现把经验做一记录。

    一、JVM内存模型及垃圾收集算法

     1.根据Java虚拟机规范,JVM将内存划分为:

    • New(年轻代)
    • Tenured(年老代)
    • 永久代(Perm)

      其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。

     

    • 年轻代(New):年轻代用来存放JVM刚分配的Java对象
    • 年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代
    • 永久代(Perm):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。

    New又分为几个部分:

    • Eden:Eden用来存放JVM刚分配的对象
    • Survivor1
    • Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。

     2.垃圾回收算法

      垃圾回收算法可以分为三类,都基于标记-清除(复制)算法:

    • Serial算法(单线程)
    • 并行算法
    • 并发算法

      JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代选择并行算法,关于选择细节请参考JVM调优文档。

      稍微解释下的是,并行算法是用多线程进行垃圾回收,回收期间会暂停程序的执行,而并发算法,也是多线程回收,但期间不停止应用执行。所以,并发算法适用于交互性高的一些程序。经过观察,并发算法会减少年轻代的大小,其实就是使用了一个大的年老代,这反过来跟并行算法相比吞吐量相对较低。

      还有一个问题是,垃圾回收动作何时执行?

    • 当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的时,年轻代满是指Eden代满,Survivor满不会引发GC
    • 当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代
    • 当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载

      另一个问题是,何时会抛出OutOfMemoryException,并不是内存被耗空的时候才抛出

    • JVM98%的时间都花费在内存回收
    • 每次回收的内存小于2%

      满足这两个条件将触发OutOfMemoryException,这将会留给系统一个微小的间隙以做一些Down之前的操作,比如手动打印Heap Dump。

     

    二、内存泄漏及解决方法

     1.系统崩溃前的一些现象:

      • 每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4、5s
      • FullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC
      • 年老代的内存越来越大并且每次FullGC后年老代没有内存被释放

         之后系统会无法响应新的请求,逐渐到达OutOfMemoryError的临界值。

         

         2.生成堆的dump文件

         通过JMX的MBean生成当前的Heap信息,大小为一个3G(整个堆的大小)的hprof文件,如果没有启动JMX可以通过Java的jmap命令来生成该文件。

         

         3.分析dump文件

         下面要考虑的是如何打开这个3G的堆信息文件,显然一般的Window系统没有这么大的内存,必须借助高配置的Linux。当然我们可以借助X-Window把Linux上的图形导入到Window。我们考虑用下面几种工具打开该文件:

        1. Visual VM
        2. IBM HeapAnalyzer
        3. JDK 自带的Hprof工具

         使用这些工具时为了确保加载速度,建议设置最大内存为6G。使用后发现,这些工具都无法直观地观察到内存泄漏,Visual VM虽能观察到对象大小,但看不到调用堆栈;HeapAnalyzer虽然能看到调用堆栈,却无法正确打开一个3G的文件。因此,我们又选用了Eclipse专门的静态内存分析工具:Mat。

         

         4.分析内存泄漏

         通过Mat我们能清楚地看到,哪些对象被怀疑为内存泄漏,哪些对象占的空间最大及对象的调用关系。针对本案,在ThreadLocal中有很多的JbpmContext实例,经过调查是JBPM的Context没有关闭所致。

         另,通过Mat或JMX我们还可以分析线程状态,可以观察到线程被阻塞在哪个对象上,从而判断系统的瓶颈。

         

         5.回归问题

           Q:为什么崩溃前垃圾回收的时间越来越长?

           A:根据内存模型和垃圾回收算法,垃圾回收分两部分:内存标记、清除(复制),标记部分只要内存大小固定时间是不变的,变的是复制部分,因为每次垃圾回收都有一些回收不掉的内存,所以增加了复制量,导致时间延长。所以,垃圾回收的时间也可以作为判断内存泄漏的依据

           Q:为什么Full GC的次数越来越多?

           A:因此内存的积累,逐渐耗尽了年老代的内存,导致新对象分配没有更多的空间,从而导致频繁的垃圾回收

           Q:为什么年老代占用的内存越来越大?

           A:因为年轻代的内存无法被回收,越来越多地被Copy到年老代

        三、性能调优

         除了上述内存泄漏外,我们还发现CPU长期不足3%,系统吞吐量不够,针对8core×16G、64bit的Linux服务器来说,是严重的资源浪费。

         在CPU负载不足的同时,偶尔会有用户反映请求的时间过长,我们意识到必须对程序及JVM进行调优。从以下几个方面进行:

        • 线程池:解决用户响应时间长的问题
        • 连接池
        • JVM启动参数:调整各代的内存比例和垃圾回收算法,提高吞吐量
        • 程序算法:改进程序逻辑算法提高性能

          1.Java线程池(java.util.concurrent.ThreadPoolExecutor)

            大多数JVM6上的应用采用的线程池都是JDK自带的线程池,之所以把成熟的Java线程池进行罗嗦说明,是因为该线程池的行为与我们想象的有点出入。Java线程池有几个重要的配置参数:

        • corePoolSize:核心线程数(最新线程数)
        • maximumPoolSize:最大线程数,超过这个数量的任务会被拒绝,用户可以通过RejectedExecutionHandler接口自定义处理方式
        • keepAliveTime:线程保持活动的时间
        • workQueue:工作队列,存放执行的任务

            Java线程池需要传入一个Queue参数(workQueue)用来存放执行的任务,而对Queue的不同选择,线程池有完全不同的行为:

        • SynchronousQueue: 一个无容量的等待队列,一个线程的insert操作必须等待另一线程的remove操作,采用这个Queue线程池将会为每个任务分配一个新线程
        • LinkedBlockingQueue : 无界队列,采用该Queue,线程池将忽略 maximumPoolSize参数,仅用corePoolSize的线程处理所有的任务,未处理的任务便在LinkedBlockingQueue中排队
        • ArrayBlockingQueue: 有界队列,在有界队列和 maximumPoolSize的作用下,程序将很难被调优:更大的Queue和小的maximumPoolSize将导致CPU的低负载;小的Queue和大的池,Queue就没起动应有的作用。

            其实我们的要求很简单,希望线程池能跟连接池一样,能设置最小线程数、最大线程数,当最小数<任务<最大数时,应该分配新的线程处理;当任务>最大数时,应该等待有空闲线程再处理该任务。

            但线程池的设计思路是,任务应该放到Queue中,当Queue放不下时再考虑用新线程处理,如果Queue满且无法派生新线程,就拒绝该任务。设计导致“先放等执行”、“放不下再执行”、“拒绝不等待”。所以,根据不同的Queue参数,要提高吞吐量不能一味地增大maximumPoolSize。

            当然,要达到我们的目标,必须对线程池进行一定的封装,幸运的是ThreadPoolExecutor中留了足够的自定义接口以帮助我们达到目标。我们封装的方式是:

        • 以SynchronousQueue作为参数,使maximumPoolSize发挥作用,以防止线程被无限制的分配,同时可以通过提高maximumPoolSize来提高系统吞吐量
        • 自定义一个RejectedExecutionHandler,当线程数超过maximumPoolSize时进行处理,处理方式为隔一段时间检查线程池是否可以执行新Task,如果可以把拒绝的Task重新放入到线程池,检查的时间依赖keepAliveTime的大小。

          2.连接池(org.apache.commons.dbcp.BasicDataSource)

            在使用org.apache.commons.dbcp.BasicDataSource的时候,因为之前采用了默认配置,所以当访问量大时,通过JMX观察到很多Tomcat线程都阻塞在BasicDataSource使用的Apache ObjectPool的锁上,直接原因当时是因为BasicDataSource连接池的最大连接数设置的太小,默认的BasicDataSource配置,仅使用8个最大连接。

            我还观察到一个问题,当较长的时间不访问系统,比如2天,DB上的Mysql会断掉所以的连接,导致连接池中缓存的连接不能用。为了解决这些问题,我们充分研究了BasicDataSource,发现了一些优化的点:

        • Mysql默认支持100个链接,所以每个连接池的配置要根据集群中的机器数进行,如有2台服务器,可每个设置为60
        • initialSize:参数是一直打开的连接数
        • minEvictableIdleTimeMillis:该参数设置每个连接的空闲时间,超过这个时间连接将被关闭
        • timeBetweenEvictionRunsMillis:后台线程的运行周期,用来检测过期连接
        • maxActive:最大能分配的连接数
        • maxIdle:最大空闲数,当连接使用完毕后发现连接数大于maxIdle,连接将被直接关闭。只有initialSize < x < maxIdle的连接将被定期检测是否超期。这个参数主要用来在峰值访问时提高吞吐量。
        • initialSize是如何保持的?经过研究代码发现,BasicDataSource会关闭所有超期的连接,然后再打开initialSize数量的连接,这个特性与minEvictableIdleTimeMillis、timeBetweenEvictionRunsMillis一起保证了所有超期的initialSize连接都会被重新连接,从而避免了Mysql长时间无动作会断掉连接的问题。

          3.JVM参数

            在JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到一些目标:

        • GC的时间足够的小
        • GC的次数足够的少
        • 发生Full GC的周期足够的长

          前两个目前是相悖的,要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一个更大的堆,我们只能取其平衡。

           (1)针对JVM堆的设置一般,可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值
           (2)年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代,比如年轻代,通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小

           (3)年轻代和年老代设置多大才算合理?这个我问题毫无疑问是没有答案的,否则也就不会有调优。我们观察一下二者大小变化有哪些影响

        • 更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增加每次GC的时间;小的年老代会导致更频繁的Full GC
        • 更小的年轻代必然导致更大年老代,小的年轻代会导致普通GC很频繁,但每次的GC时间会更短;大的年老代会减少Full GC的频率
        • 如何选择应该依赖应用程序对象生命周期的分布情况:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性,在抉择时应该根据以下两点:(A)本着Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理 (B)通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间

          (4)在配置较好的机器上(比如多核、大内存),可以为年老代选择并行收集算法: -XX:+UseParallelOldGC ,默认为Serial收集

          (5)线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用而言这个默认值太了,一般256K就足用。理论上,在内存不变的情况下,减少每个线程的堆栈,可以产生更多的线程,但这实际上还受限于操作系统。

          (4)可以通过下面的参数打Heap Dump信息

        • -XX:HeapDumpPath
        • -XX:+PrintGCDetails
        • -XX:+PrintGCTimeStamps
        • -Xloggc:/usr/aaa/dump/heap_trace.txt

            通过下面参数可以控制OutOfMemoryError时打印堆的信息

        • -XX:+HeapDumpOnOutOfMemoryError

         请看一下一个时间的Java参数配置:(服务器:Linux 64Bit,8Core×16G)

         

         JAVA_OPTS="$JAVA_OPTS -server -Xms3G -Xmx3G -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/aaa/dump -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/usr/aaa/dump/heap_trace.txt -XX:NewSize=1G -XX:MaxNewSize=1G"

        经过观察该配置非常稳定,每次普通GC的时间在10ms左右,Full GC基本不发生,或隔很长很长的时间才发生一次

        通过分析dump文件可以发现,每个1小时都会发生一次Full GC,经过多方求证,只要在JVM中开启了JMX服务,JMX将会1小时执行一次Full GC以清除引用,关于这点请参考附件文档。

         4.程序算法调优:本次不作为重点


        参考资料:

        http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

         

      1. APP兼容性测试和手机占有率测试

        2014-05-04 12:55:01

        以下云测试地址:

        分为两种:快速兼容性测试和遍历测试
        其中快速兼容性测试中,输入测试地址后,可以选择不容的测试条件,如操作系统,分辨率,浏览器,最后生成一个测试报告。


        以下两个地址是关于各手机占有率的情况:

        http://screensiz.es/tablet
      1531/812345678>
      Open Toolbar