性能测试中,CPU和内存是关注最多的两个性能指标。以我行应用最多的系统架构(WAS+Oracle)来说,CPU使用率高的问题多发生于数据库,比如索引不当引发的表扫描、绑定变量使用不当引发的硬解析、连接池使用不当引发的频繁建立断开连接,这些都会导致数据库服务器CPU使用率高。

  内存问题则多发生于应用服务器。部署在WAS平台的Java应用,经常发生的问题是JVM堆内存溢出。产生该问题的原因有很多:

  ·由环境引发的,虚拟机物理内存不足;

  ·由参数配置引发的,JVM堆内存设置过小;

  ·由应用程序引发的,内存泄露,错误使用大对象等等。

  在实际性能测试过程中选择监控指标时,对JVM堆内存的监控分析比对操作系统内存的分析更为重要。JVM堆内存溢出的原因中,虚拟机物理内存不足常常被忽视。本文结合项目测试过程中发现的由内存不足引发的性能问题,设计几个场景来探索JVM堆内存和虚拟机内存之间的影响关系。

一、

莫名其妙的“会话超时”

  在某交易(登录+查询+退出)的疲劳场景中,发现应用服务器内存使用率超过90%,且被测交易存在大量报错:用户未登录或已超时,请登录。WAS中会话相关的两个参数,最大内存中会话数1000和会话超时30分钟。性能测试场景中,会话数使用不到1000,且登录之后并没有退出,也不会发生用户未登录或已超时。所以,报错的原因在哪里?

  WAS的JVM堆内存和操作系统内存状态如图所示。

  可以看到,JVM堆内存的分配达到最大值3G,堆实际使用值在到达3G时发生GC,循环如是。JVM堆内存未发生内存溢出,没有生成heapdump、javacore文件,Server没有重启。操作系统内存使用已达92%,且Swap空间使用了1G左右。

  Swap分区通常被称为交换分区,这是一块特殊的磁盘空间,当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间。也就是说,当操作系统开始使用Swap空间时,就意味着内存不够。同时,由于Swap分区是磁盘空间,使用Swap分区会频繁读写磁盘,这会显著降低操作系统的运行速度。

  根据以上分析,初步判断,虚拟机内存不足,使用到Swap分区。如果session信息被从内存交换到Swap分区,那这段时间该线程的查询请求,无法验证到session,就会报“用户未登录或已超时,请登录”,交易失败;如果session信息又被从Swap交换至内存,又不报错,交易成功。下面通过一些实验来验证这一推测。

二、

揭开内存的神秘面纱

  首先,我们看一下测试环境和生产环境的资源配置。可以看出测试环境单台虚拟机的配置(CPU内存)是生产环境的1/2,这也是内存不足的根源,下面围绕内存设计三个场景的测试。

场景一:疲劳测试发生问题的场景。

  JVM堆内存GC正常,虚拟机内存不足,使用了Swap分区。为了进一步确定Swap分区确实是被WAS使用 ,我们进入到/proc下WAS Server进程的目录,cd /proc/${WasServerPid},该目录下的smaps文件详细记录了该进程的内存使用情况,然后执行cat smaps | grep Swap | grep -v "0 kB" | sort -nr,便可查看进程对Swap的使用。通过查看,该WAS节点的Server1使用了538MB,Server2使用了574MB,加起来1G左右,这与此前监控的结果相符。而重启Server时,这两个值都是0,即未使用Swap分区。

场景二:每个节点只保留1个Server,JVM堆内存最大值为3G,虚拟机8G内存对于单Server完全够用。

  测试过程中,交易整体运行平稳,没有报错。JVM堆的分配值也是到达3G,然后通过GC循环使用。但由于只启动了一个Server,内存够用,没有使用到Swap分区,并且存在一定的富余。WAS的JVM堆内存和操作系统内存状态如图所示。

性能测试WAS内存使用的探索和分析的更多相关文章

  1. VPS性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench和压力测试

    现在便宜的VPS主机越来越多了,一些美国的VPS主机甚至给出1美元一月的VPS,堪比虚拟主机还要便宜,巨大的价格优势吸引不少人购买和使用,而近些年来国内的主机商也开始意识到便宜的VPS对草根站长的诱惑 ...

  2. 大并发连接的oracle在Linux下内存不足的问题的分析

    大并发连接的oracle在Linux下内存不足的问题的分析 2010-01-28 20:06:21 分类: Oracle 最近一台装有Rhel5.3的40G内存的机器上有一个oracle数据库,数据库 ...

  3. 内存不足(OutOfMemory)的调试分析

    32位操作系统的寻址空间是4G,其中有2G被操作系统占用,也就是说留给用户进程的内存只有2G(其中还要扣除程序加载时映像占用的部分空间,一般只有1.6G~1.8G左右可以使用). 如果进程运行中需要申 ...

  4. JVM内存状况查看方法和分析工具

    Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及JVM内存的状况,同时开源界和商业界也有一些工具可用于查看.分析GC及JVM内存的状况.通过这些分析,可以排查程序中内存泄露的问题及 ...

  5. DEBUG模式下, 内存中的变量地址分析

    测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...

  6. 性能测试分享: Jmeter的源码分析main函数参数

    性能测试分享: Jmeter的源码分析main函数参数   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...

  7. 用python探索和分析网络数据

    Edited by Markdown Refered from: John Ladd, Jessica Otis, Christopher N. Warren, and Scott Weingart, ...

  8. 读书摘要观后感与总结:《Glibc内存管理:ptmalloc2源代码分析》

    更新中 在Linux平台下做漏洞利用的时候,针对于Heap部分总是有些不求甚解,下面开个博文来记录下<Glibc内存管理:ptmalloc2源代码分析>这本书的读后感和收获,一些简单的点将 ...

  9. [性能测试]:内存泄漏以及MAT(Memory Analyzer Tool)工具使用分析

    一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...

随机推荐

  1. 第一天——编程语言与python

    ------------恢复内容开始------------ what's the python? python是一门编程语言,编程语言就是人用来和计算机沟通的语言,语言就是人与人,人与事物进行沟通的 ...

  2. Python之excel第三方库xlrd和xlwt

    Python读取excel表格的库xlrd,首先安装xlrd: pip3 install xlrd 代码: #!usr/bin/env python3 #!-*-coding=utf-8 -*- '' ...

  3. Git提交错了不用慌,这三招帮你修改记录

    大家好,今天我们来聊聊git当中一个很重要的功能--历史记录的修改. 有的时候我们会突然发现某个地方需要修改,最常见的某个不应该被提交的文件被提交了进来.我们希望它不只是在后序的版本当中不再出现,而是 ...

  4. 从零开始部署发布Java项目到服务器的Docker中

    本以为很简单,由于没用过docker和java,本文将会阐述一路遇到的拦路虎. 首先,写好Java项目,本地跑通. 可能会遇到的问题: 1.jar包正常运行,war包404: 如何打包很多教程都有介绍 ...

  5. 自定义 demo 集合

    各种写着玩的自定义控件demo 有时网上看到一些比较有意思的开源项目,有时间的话就会自己也撸一个出来,但是一般只关注实现样式.动画等,不会太去细致完整地完成,俗称占个坑~ 持续更新中... githu ...

  6. maven项目添加jar包

    使用集成工具创建一个maven项目,如果需要添加开发包,只需去maven仓库找到对应的包,将配置信息加入pom.xml文件即可.这样,我们就再也不用到处寻找和下载jar包了. 用例:开发工具 STS ...

  7. C++编译过程概述

    一 ---导读 想象成工厂要产出一个产品的过程,经过流水线上一步一步,不同的人的操作,然后经过整合,就得到了一个完整可用的产品. 二---编译过程图解 三---在linux中编程详解编译过程 当我们在 ...

  8. 仿小米logo案例

    效果:做一个具有logo能过渡切换效果,类似于小米网站的logo 思路:将两个用于切换的logo以文字形式嵌入活动块banner的左右半,活动块banner的上级是主展示块box,初态只展示右半log ...

  9. 第十章节 BJROBOT PID 动态调节【ROS全开源阿克曼转向智能网联无人驾驶车】

    1.把小车架空,平放在地板上,注意四个轮子一定要悬空.用资料里的虚拟机,打开一个终端 ssh 过去主控端启动 roslaunch znjrobot bringup.launch.   2.在虚拟机端再 ...

  10. SalesForce学习——权限管理

    Salesforce 对于权限的管理是非常严谨的并且支持不同维度的权限控制.常用的有简档.权限集.角色层级机构.组织范围. 简档:Profiles是Salesforce为每个用户指定的标准配置文件,在 ...