记一次诡异的调优

最近碰到的一个Java应用,费了半天劲还是没定位到是哪儿的问。发上来给大家看看,给点建议。

环境

  • DB Server:32core HPUX DB2
  • App Server * 2:8core HPUX WAS6.1 每个节点2个app

初次测试现象

  • WAS,DB2CPU均上不去,CPU、内存、磁盘、网络等都正常。
  • 从loadrunner报告来看,有两个用例很奇怪,在16/24/50用户下,呈线性增长。根据经验,这两个用例可能存在资源争用,造成串行的地方。
  • 检查DB2,正常,语句执行都很快,部分用例有锁,但与造成问题的两个用例无关。

第一次尝试:初步定位是WAS的问题,针对WAS进行排查。

  • 关闭WAS应用打印的日志(据观察有System.out),刚开始有往外打印东西,量不大,但是很频繁,一秒钟大概几十条,无效。
  • 调整WAS监控日志为error,避免过多信息。无效。
  • 后减少用户数,使用1个用户长时间跑,发现那两个用例依旧随时间线性增长。说明问题不是因为资源争用,更可能是程序问题。
  • 检查WAS中的Apache,配置正常,返回页正常。

第二次尝试:定位应用程序哪块的问题

  • 因为WAS跑在HPUX上,使用HPjmeter跟踪线程状态,发现线程在IO上等待事件非常高。而程序占用IO最多的地方就是数据库连接。
  • 打印线程堆栈,发现大部分线程阻塞在SocketRead上。证明了HPjmeter IO占用高。
  • SokcetRead阻塞,可能以下几个地方有问题:数据库(很值得怀疑,但从数据库监控看,没有问题),网络(内网环境,这个应该也不会有问题),操作系统IO部分。

第三次尝试:针对SocketRead定位问题

  • 更新WAS所带JDK,无效。(JDK OK)
  • 更新操作系统IO部分最新Patch,无效。(OS IO OK)
  • 更新WAS的JDBC驱动,无效。(JDBC OK)
  • 把WAS和DB放在同一台机器上,无效。(网络 OK)
  • 通过WAS监控,其中JDBC Time很短(间接也说明了数据库正常),但是UseTime很高(是JDBC Time的100倍+)。
  • 程序除了这两个用例外,其他用例均正常。

悬而未决:问题到这,进了死胡同了。也没有更好的想法。

  • Use Time、JDBC Time、SocketRead的矛盾。

    • JDBC Time=JDBC处理时间+网络时间+数据库处理时间。JDBC Time应该包括了JDBC的SocketRead的时间。但是JDBC Time很小,而程序阻塞在SocketRead上。
    • Use Time=连接分配到连接归还的时间差=n*JDBC Time(在整个连接分配到归还之间的所有JDBC请求)+业务逻辑处理时间。
    • Use Time与JDBC Time差距很大,而且JDBC Time很小,能解释的话,第一种原因,就是在整个UseTime中有大量的JDBC请求,但是从这个业务看,不会有100倍那么多。
    • 第二种原因,是“业务逻辑程序处理时间”占用了很多。这个是有可能的,而且程序编写的bug也能说明为什么在1个用户的时候,用例执行时间也程序线性。但是,程序最耗时的地方出现在JDBC的SocketRead上,而JDBC Time又未反应出这部分的时间。
  • 什么造成了SocketRead阻塞
    • 这个问题一直没有弄清楚,在数据、网络都正常的话,Socket不应该阻塞
  • WAS的Java堆调整。这个问题是在调整WAS时碰到的。
    • WAS个人不是太熟,但是从一般JVM调整来说,基本是类似的,但是这次在WAS上碰到的问题也很诡异。
    • WAS堆之前配置是1560m,当调整为2048m后,用例的执行时间时间反而变长了。WAS堆之前配置是1560m,当调整为1024m后,用例的执行时间时间也变长了。很神奇的问题,程序执行速度一般取决于CPU和IO,内存影响很小,特别当内存足够的情况下。即便内存有影响,两个不同方向的调整居然能得出同样的结果,很令人费解。
    • 不知道是否有WAS方面的大牛给点提示:)

结论

  • 应用应该是有问题的,但是更细的东西或许只有看到代码才知道
  • WAS真不会用...

记一次诡异的调优,布布扣,bubuko.com

时间: 2024-10-26 21:05:00

记一次诡异的调优的相关文章

记一次IDEA编译器调优

前言: 我们知道,IDEA是用Java写的,那么他肯定也存在虚拟机的调优的问题,那么今天我们就对它进行开刀. 下面是默认参数 位置在:C:\Program Files\JetBrains\IntelliJ IDEA 2018.2\bin\idea64.exe.vmoptions 1 -Xms128m 2 -Xmx756m 3 -XX:ReservedCodeCacheSize=240m 4 -XX:+UseConcMarkSweepGC 5 -XX:SoftRefLRUPolicyMSPerMB

java调优随记-java对象大小

在java中,基本数据类型的大小是固定.但是java对象的大小是不固定的,需要通过计算. 在java中,一个空对象(没有属性和方法的对象)在堆中占用8byte,比如 Object obj = new Object();另外栈中存储引用需要占用4byte的空间,总共需要16byte空间(喂,为为什么不是12byte?因为java在内存分配的时候都是以8的倍数在分配).在java中所有的对象都继承Object,所以不论什么样的对象大小都不能小于8byte. 计算一下下面的对象的大小? Class O

记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?)

记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?) 前几天帮客户优化一个数据库,那个数据库的大小是6G 这麽小的数据库按道理不会有太大的性能问题的,但是客户反应说CPU占用很高,经常达到80%~90% 我检查了任务管理器,确实是SQLSERVER占的CPU 而服务器的内存是16G内存,只占用了7G+ 客户的环境: Windows2008R2 SQLSERVER2005 SP3 64位 企业版 服务器内存:16G CPU:8核 RDS:阿里云主机

java调优随记-堆和栈

基础知识: 关于堆和栈,堆和栈是程序运行的关键,关于堆和栈的定义和解释可自行搜索,我比较认可以程序运行过程中他们扮演的角色作为对比的点:堆是存储的单位,而栈是程序运行时的单位.栈解决的是程序的运行问题,即程序如何运行,如何处理数据.堆解决的是存储问题,即数据存储在哪里,怎么存储. 程序中每启动一个线程就有一个栈与之对应.因为每个线程执行的逻辑不同,所以需要独立的栈来描线程如何运行.而堆是所有线程共享的. 栈之所以是运行时单位,主要是因为栈中保存的都是当前线程中,包括局部变量,程序运行状态和方法返

记一次JVM调优之旅(斗争full gc)

俗话说技多不压身,当年苦读<深入理解JVM>还专门整理了笔记,现在就用上了- 笔记 http://www.cnblogs.com/syjkfind/p/3901774.html [症状] 用户操作数据导出时总会发生卡顿,后台占内存的定时任务发生时也会.JVM参数就不贴了,比较普通且相对合理. [思路] 查gc日志是发生了full gc,tomcat日志零零散散有很多exception. 另外凭着对代码的了解,触发时同时刻的日志显示正在执行较大数据量的查询而且装载进JVM,方法调用和临时变量也很

记一次Web服务的性能调优

前言 一个项目在经历开发.测试.上线后,当时的用户规模还比较小,所以刚刚上线的项目一般会表现稳定.但是随着时间的推移,用户数量的增加,qps的增加等因素会造成项目慢慢表现出网页半天无响应的状况.在之前的工作中也恰巧遇到这个过程,当时对项目进行了很多性能测试和调优,今天借助博客园,将这次性能调优的过程进行整理后写成随笔,希望给广大Java后端开发的工程师提供帮助,也借此机会,对性能调优进行一些总结工作,达到备忘的目的. 测试工具与环境 性能测试工具 Loadrunner:一种预测系统行为和性能的负

记一次高并发场景下.net监控程序数据上报的性能调优

最近在和小伙伴们做充电与通信程序的架构迁移.迁移前的架构是,通信程序负责接收来自充电集控设备的数据实时数据,通过Thrift调用后端的充电服务,充电服务收到响应后放到进程的Queue中,然后在管理线程的调度下,启动多线程进程数据处理. 随着业务规模的不断扩大和对系统可用性的逐步提高.现在这个架构存在很多的问题,比如: 1.充电服务重启,可能会丢数据. 2.充电服务重启会波及影响通信服务. 3.充电服务与通信服务面对的需求和变化是不一样,强依赖的架构带来很多的问题. 为了解决上述的这些问题,项目组

记一次性能调优

说到性能调优,给人的感觉往往都是修炼有成的专家干得事了,对于我们这些菜鸟还是想也不要想了,做好分内事,不出现纰漏就OK了.对于这种观点我表示严肃的否决!那想学习性能调优的童鞋应该从哪里下手呢?接下来就让我们来谈谈关于性能调优你所忽视的一些常识. 一.代码:前文讲过“华为Java编程军规,每季度代码验收标准”这个标准是衡量代码本身的缺陷,也是衡量一个研发人员本身的价值.代码是性能调优中的一粒分子,分子虽小但经过上亿次的分裂也会变成黑洞,所以代码本身的缺陷也是我们性能调优的主因之一. 1 军规一:[

数据库性能调优(转)

数据库性能调优 SQLServer性能监控 这套性能优化的清单将至少准科学的帮助你找出你的SQLServer任何明显的性能问题.说是这样说,SQLServer的性能调优仍然是很困难的.我试图用这套清单去找出“容易”的sqlserver性能问题,困难的留待稍后.我这样做是因为很容易将容易和困难的的性能调优问题搞混.通过列出一个“容易”的性能调优范围,就很容易的将这些问题解决,一旦解决了这些容易的问题,那么你就能集中去解决更困难的问题. 使用这个SQLServer性能调优清单的一个好处是,它将不仅仅