`
captain
  • 浏览: 135056 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

小小困惑:各位在公司都是如何做稳定性测试的?

阅读更多
  公司产品在做验收,压力、负载测试全部通过了,目前在做稳定性测试,计划是让200人(分属不同的用户组,做不同的操作)负载不间断运行200小时,产品用的是公司内部的标签库+spring2.5+struts1.2.9+hibernate3.3,ehcache作为二级查询缓存,默认使用apache的dbcp连接池,但经测试后十分不稳定,换c3p0后效果好些,但是运行20小时左右就持续抛出jdbc fails等异常,接着出现out of memory。。。最后无奈把连接池切换到proxool,
具体配置如下
	 <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close">
    <property name="driver">
      <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="driverUrl">
      <value>${jdbc.url}</value>
    </property>
    <property name="user">
      <value>cap</value>
    </property>
    <property name="password">
      <value>cap</value>
    </property>
    <property name="alias">
      <value>dbpool</value>
    </property>
    <property name="prototypeCount">
      <value>5</value>
    </property>
    <property name="maximumConnectionCount">
      <value>100</value>
    </property>
    <property name="minimumConnectionCount">
      <value>10</value>
    </property>
    <property name="trace">
      <value>true</value>
    </property>
    <property name="verbose">
      <value>true</value>
    </property>

情况开始好转,然而好景不长,系统稳定运行了96小时后,开始抛出一下异常:
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
        at java.lang.Thread.run(Thread.java:595)
10528328 [http-8080-Processor352] ERROR org.hibernate.transaction.JDBCTransaction - JDBC begin failed
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: Software caused connection abort: socket write error

STACKTRACE:

java.net.SocketException: Software caused connection abort: socket write error
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
        at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2744)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1612)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3250)
        at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5395)
        at sun.reflect.GeneratedMethodAccessor138.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.logicalcobwebs.proxool.WrappedConnection.invoke(WrappedConnection.java:162)
        at org.logicalcobwebs.proxool.WrappedConnection.intercept(WrappedConnection.java:87)
        at $java.io.Serializable$$EnhancerByProxool$$4c8217cb.setAutoCommit(<generated>)
        at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:91)
        at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:558)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTra
nsactionManager.java:377)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(Transaction
AspectSupport.java:263)
** END NESTED EXCEPTION **



Last packet sent to the server was 0 ms ago.
        at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2759)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1612)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3250)
        at com.mysql.jdbc.Connection.setAutoCommit(Connection.java:5395)
        at sun.reflect.GeneratedMethodAccessor138.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.logicalcobwebs.proxool.WrappedConnection.invoke(WrappedConnection.java:162)
        at org.logicalcobwebs.proxool.WrappedConnection.intercept(WrappedConnection.java:87)
        at $java.io.Serializable$$EnhancerByProxool$$4c8217cb.setAutoCommit(<generated>)
        at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:91)
        at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:558)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTra
nsactionManager.java:377)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(Transaction
AspectSupport.java:263)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)

        at java.lang.Thread.run(Thread.java:595)
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null

利用proxool提供的监控工具,几百万个事务全部正常执行,loadrunner的事务也全部正常,没有任何失败和错误的事务,这下我突然间没辙了,tomcat的jvm参数,连接池参数,我全设置过了,也排除了内存泄漏和连接池没释放的情况,我的困惑有下:
1.产生这样的异常还会有哪些原因呢?
2.各位在对项目或者产品进行稳定性测试的时候,真的都做到后台不报出任何异常?
分享到:
评论
44 楼 wyfshchaoya 2008-12-01  
wait_timeout=300  在测试的时候看到这样的代码真的想杀人....呵呵...真要命.
43 楼 godson_2003 2008-11-24  
wait_timeout=300 是什么意思?

不好意思 没怎么用mysql

不解:查询跟事务有什么关系?
42 楼 captain 2008-11-24  
dennis_zane 写道
楼主解决问题就不反馈了?大伙都等着你消息呢

问题终于解决了。实在不好意思,修改参数后得进行一天的压力、负载测试以及1个星期的稳定性测试,所以今天才有时间来回帖。
感谢各位的建议,尤其是dennis_zane,正是因为顺着大家给提供的主线出发,我才找到问题的根源。
主要有两个地方:
一。我无意远程登录数据库所在的测试组服务器,打开mysql下的my.ini,顿时被他们设定的一个参数雷倒:
wait_timeout=300 

天啊,大家一看就知道这意味着啥了吧。。如此多的jdbc fails, socket write error,原来是因为这个设置,我为前面错怪DBCP,c3p0感到羞愧。
解决方法:注释掉这一设置,恢复成默认的8小时。
二。首先检讨自己的愚昧。
在项目的新版本中,重构了许多代码,因为演示版本没有涉及到update和save等操作,因此我索性把所有service层的事务控制取消了,不就是简单查询逻辑么。
后果就是,在做并发测试的时候,实际最大并发300的时候,最大连接池数配上300居然还老报连接池不够的异常,多亏proxool有个实时监控连接池使用情况的servlet,我发现每次查询后,连接还是active状态,不是马上释放。所有使用后的连接都会等到5分钟后才会自动释放,奇怪,我的autoCommit参数都加了,咋就不释放?
百无聊赖下,补上原有的事务配置:
	<aop:config proxy-target-class="true">
		<aop:advisor pointcut="execution(* com.captain.sample.service..*Service.*(..))"
			advice-ref="txAdvice" />
	</aop:config>

	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
					<tx:method name="*" />
		</tx:attributes>
	</tx:advice>

问题解决,所有查询提交完后立马释放连接,原有配置跑500并发没有出现任何异常。
结论:
  查询式操作最好同样附上spring事务控制,别图省事;
  原有问题跟DBCP、c3p0以及proxool孰优孰劣无关,问题在于使用连接池的程序员还有测试数据库雷人的wait_timeout=300
再次衷心感谢各位。
41 楼 dennis_zane 2008-11-22  
楼主解决问题就不反馈了?大伙都等着你消息呢
40 楼 yunmanfan 2008-11-22  
dennis_zane 写道
这个异常是网络层的异常,是由于远端关闭了socket,而本地仍然继续写就会抛出这个异常。这个问题通常是由于你的网络问题引起的,防火墙、网卡等等,你可以在不同的机器、不同的网络环境中测试看看。如果不影响使用,可以忽略他。

同意,根据报告的异常可以判断
39 楼 elstage 2008-11-21  
楼主用上tomcat或者数据库集群了么?
38 楼 kakaluyi 2008-11-21  
简单的要死,用线程编程,建50个线程,每个线程循环执行相应的逻辑操作(Server中比如创建用户,更改用户,增加购物车什么的,具体看你的网站有什么功能),每个动作后线程每隔2,3秒sleep一下,循环多少次由你来定。这样就好 楼主我帮你省了请50个大学生省的钱了,怎么谢我啊 -_-!
37 楼 jim19770812 2008-11-21  
算错了,呵呵,楼上好眼力
36 楼 swen00 2008-11-20  
按照500/人就是500×50=2500
是25000阿大哥

找大学生不如找50个美女哈
35 楼 jim19770812 2008-11-20  
找50个大学生想法还不错?

得准备电脑,得管饭,得发钱,得培训,还得派人盯着防止偷懒怠工。
来算算费用吧
电脑:2400×50=120000
桌椅板凳:150×50=7500
200小时的酬劳折合三天:按照500/人就是500×50=2500
午餐:8/人×50×3=1200

没算租金都两万多了,相比较而言,使用虚拟机和自动化测试技术要廉价的多,而且效果很好,不用租金,不用薪水,不需要午餐,也不回偷懒怠工。
34 楼 sunwei_07 2008-11-20  
呵呵,找50个大学生,这想法真不错呢~~~~
33 楼 jim19770812 2008-11-19  
嗯。。以前的公司也曾经想搞过这种测试办法,准备找50个大学生来模拟用户操作,当时就给我否了,这样实在太笨了,得亏了不是做个大型网站,要不然还不的找上成千上万人来测试??

我的想法是用自动话测试+虚拟技术。
首先是自动化测试工具记录下主要的业务操作,然后装若干的虚拟机,然后弄十来台台电脑(内存要大一点),每个电脑上运行五六个虚拟机,每个虚拟机里模式十来个操作,然后运行就是了。这样就是600个并发访问了。如果业务变了,只要把一个虚拟机更新一下,然后其余虚拟机原样复制就ok了。
32 楼 sunwei_07 2008-11-18  
单位项目使用C3P0一直很稳定
31 楼 pangyi 2008-11-18  
DBCP不会那么差,cp30和proxool都是非常不错的连接池。

我认为是你们程序中没有处理好数据库链接异常,从而导致发生异常后,数据库链接不能得到释放。

还是从代码里找问题吧。我以前遇到过类似的问题。
30 楼 bengan 2008-11-18  
captain 写道
多谢各位建议,我似乎找到问题的根结,但现在还不敢100%肯定,正在重新走压力测试,稳定测试,负载测试等流程,下周上来汇报。

也碰到過類似的問題,等待lz的答案
29 楼 chq32 2008-11-16  
不要跟spring整在一起,用proxool自己的方式配配看
28 楼 土匪一份子 2008-11-14  
dennis_zane 写道
这个异常是网络层的异常,是由于远端关闭了socket,而本地仍然继续写就会抛出这个异常。这个问题通常是由于你的网络问题引起的,防火墙、网卡等等,你可以在不同的机器、不同的网络环境中测试看看。如果不影响使用,可以忽略他。

java.net.SocketException: Software caused connection abort: socket write error  
好眼熟  前两天系统突然慢掉。。。  看日志抛这个异常  有时候系统一下就可以缓过来  有时候很长时间缓不过来  也跟客户解释说可能是网络问题  先观察几天
楼主有什么进展发表一下。。。
27 楼 dennis_zane 2008-11-14  
captain 写道
多谢各位建议,我似乎找到问题的根结,但现在还不敢100%肯定,正在重新走压力测试,稳定测试,负载测试等流程,下周上来汇报。

问题在哪?别忘了哦
26 楼 captain 2008-11-14  
多谢各位建议,我似乎找到问题的根结,但现在还不敢100%肯定,正在重新走压力测试,稳定测试,负载测试等流程,下周上来汇报。

相关推荐

    无穷的困惑:个体行为的基础是什么?.pptx

    无穷的困惑:个体行为的基础是什么?.pptx

    破解内部审计的困惑与问题--课后测试.docx

    破解内部审计的困惑与问题是一份关于内部审计的课后测试,涵盖了内部审计的基础知识、审计模式、风险评估、内控要素、审计独立性等方面的知识点。本文将对这些知识点进行详细的解释和分析。 一、内部审计的基础知识...

    电改困惑:中国新能源并网为何难.pdf

    电改困惑:中国新能源并网为何难.pdf

    投资界的最大困惑:何处寻找未来的腾讯和阿里

    投资界的最大困惑:何处寻找未来的腾讯和阿里

    兴长信达刘磊的困惑:传统企业电商野蛮生长.docx

    兴长信达刘磊的困惑:传统企业电商野蛮生长.docx

    用python计算lda语言模型的困惑度并作图

    困惑度是一种评估语言模型好坏的指标,定义为exp^{ - (∑log(p(w))) / (N) },其中P(W)是指测试集中出现的每个词的概率,N是测试集中出现的所有词的数量。该指标可以用来评估语言模型的好坏,越小的困惑度表示语言...

    从无穷开始:科学的困惑与疆界.pdf

    人类能直接认知的事物是有限的。但“无穷”二字经常会在思考的瞬间乍现。伊曼努尔·列维纳斯曾经说过:“有些事物能让思想超越一切限制...这一概念自然而然地联系到自然数的连续性上: 1、 2、 3……一个数后面总跟着另

    测试射频电感时,如何正确处理补偿值?

    测试射频电感时,关于补偿值的问题往往让刚接触这类产品的小伙伴感到困惑,这么小的电感量,为什么要在测试电感量的基础上增加补偿值来校准?实际线路设计中该如何处理这个补偿值问题呢?补偿值的庐山真面目 射频...

    产品上线的前戏:可用性测试(包含关键维度分析及过程).docx

    可用性测试的类型可以分为两类,一类是形成性的测试,也即是前期或中期设计测试,在产品产出前对产品可用性进行测试。发现可用性问题,改善产品体验;一类是总结性测试,在产品后期迭代改版,也即产品上线后整个过程...

    性能测试报告模板.rar

    性能测试是IT行业中一个至关重要的环节,特别是在软件开发与维护过程中,它用于评估系统的承载能力、响应速度以及稳定性。"性能测试报告模板.rar"提供的内容是帮助测试人员规范地记录和展示性能测试结果的一种工具。...

    ChatGPT对话系统的可扩展性与稳定性解析.docx

    在稳定性方面,ChatGPT 的生成模型本质上是一个概率模型,存在输出不稳定的问题,可能会导致相同的输入产生不同的响应,从而给用户带来困惑和不确定感。为了提高 ChatGPT 的稳定性,可以考虑引入模型的先验知识和...

    测试界面urong.rar

    2. 性能测试:评估系统在高负载或长时间运行条件下的响应速度、稳定性、资源消耗等。对于界面测试,这可能涉及页面加载速度、交互延迟等方面。 3. 兼容性测试:确保软件在不同的硬件、操作系统、浏览器或移动设备上...

    软件测试报告一详细模板(经典).docx 测试人员写文档的最好模板

    在实践中,测试报告的编写需要注意以下几点: 1. 测试报告应该根据实际情况进行调整和修改,以适应不同的项目和测试需求。 2. 测试报告应该具有明确的结构和格式,以便读者能够快速了解测试的目的、结果和结论。 3....

    一张图解决对互联网运营的困惑:定目标、列手段、配岗位、做考核

    我在给企业做诊断的时候,发现他对运营的了解非常少,直接导致花的都是冤枉钱。老陈对自己的行业超级熟悉,谈起传统那套打法能滔滔不绝讲5个小时,中间不喝水,但遇到互联网这套新玩法就犯难了,不做怕被淘汰,做又...

    测试中的常见问题分析

    在软件开发过程中,测试是至关重要的环节,它确保产品的质量,发现并修复潜在的问题,以提供用户一个稳定、高效和安全的使用体验。本文将详细探讨“测试中的常见问题分析”,涵盖形象类问题、可用性问题和稳定性问题...

    H-B组测试需求评审汇总1

    在本次的“H-B组测试需求评审汇总1...综上所述,此次评审暴露了文档编写、测试设计和执行、以及性能指标定义等方面的问题,这些问题都需要在后续的工作中进行改进和完善,以保证基于Scrapy的WebUI项目的质量和可靠性。

    小小Vir(整人软件源码)

    6. **调试与测试**:在发布整人软件之前,需要进行充分的调试和测试,以确保软件的稳定运行,避免因错误导致的意外情况。 7. **法律问题**:使用整人软件需注意不要侵犯他人的权利,比如侵犯隐私权或知识产权,同时...

    国际宏观评论-天风证券-宏观点评:鲍威尔的困惑——是工作找不到人?还是人找不到工作?.pdf

    国际宏观评论-天风证券-宏观点评:鲍威尔的困惑——是工作找不到人?还是人找不到工作?.pdf

    手机测试经验总结(软件和硬件测试方面)

    初到公司我十分困惑,没有接受过系统的培训,对测试一无所知,既不知道该测试什么,也不知道如何开始测试。 我想涉足手机测试行业的你们,一样会遇到当初我遇到的过的问题,因此这次讲座就是给大家分享我在手机测试...

    App开发者日记:iOS App开发是什么样的?.docx

    在这个过程中,测试是至关重要的环节,因为只有通过广泛的测试,才能确保应用的稳定性和用户体验。然而,iOS平台的测试面临独特的挑战。尽管有iOS模拟器,但真机测试是必不可少的,而苹果对开发者账户在设备上的限制...

Global site tag (gtag.js) - Google Analytics