压力测试异常

异常现象总结

1.  NumberFormatException之前大多出现在压力测试接近结束的时候,这时候是最有可能出现待办任务没有的时候。

2.  数据库操作出现大量异常,springTransaction rolled back because it has been marked as rollback-only,可能就是事务嵌套造成的原因。因为里面的事务已经标记事务必须回滚而外部事务还尝试提交。

3.  当出现大量事务rollback异常后,会有很多线程被阻止在需要启用事务的方法上,比如控制层调用一个服务层的方法,但始终进步了这个方法体内,一直到OutOfMemory。初步分析的情况是未提交事务的数据库连接不能使用或者是没有资源用于开启事务引起的。

4.  并发加载到35个服务器就停止响应,一段时间后报OutOfMemory异常,分析JavaCore文件大量线程停留在Page方法中的findAll方法,而此时查看数据库连接池,远未达到150条连接的上限,由此初步推断是数据量太大的原因。

 

 

其他

1.  更改了oracle的数据库驱动的版本为 10.2.0.1.0版本。原因参见http://forums.oracle.com/forums/thread.jspa?threadID=498046&start=15&tstart=0

Caused by: java.lang.NullPointerException

at oracle.jdbc.driver.T4C8Oall.getNumRows(T4C8Oall.java:876)

at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:831)

2. 修改 JSONDefaultAnnotationMethodHandlerAdapter 增加处理spring控制器抛出来的运行时异常,原来只处理了检查异常。 Spring可以配置HandlerExceptionResolver来处理异常,建议以后使用spring的方式来处理异常。

### 异常场景下压力测试的工具与方法 #### 工具介绍 对于异常场景下的压力测试,可以选择多种成熟的开源或商业工具。以下是几种常用的工具及其特点: 1. **JMeter** JMeter 是一款功能强大的开源性能测试工具,支持模拟大量并发用户访问系统的行为。可以通过配置线程组、定时器和断言等功能,模拟各种异常情况并观察系统的稳定性[^3]。 2. **Locust** Locust 是一种基于 Python 的分布式负载测试工具,允许开发者编写灵活的任务脚本来定义用户的交互行为。它的动态特性非常适合用于复杂场景的压力测试[^4]。 3. **Gatling** Gatling 提供了一种 DSL(领域特定语言),能够快速构建复杂的测试方案。它内置了详细的报告机制,便于分析异常条件下的系统表现[^1]。 4. **Apache Benchmark (ab)** 虽然 ab 更适合简单的基准测试,但在某些情况下也可以用来触发基本的异常状态检测。不过由于其灵活性较低,在高级需求面前显得不足[^3]。 --- #### 方法论 为了有效地实施异常场景下的压力测试,需遵循以下原则和技术手段: 1. **设定目标** 明确要验证的具体业务逻辑或者技术指标,比如最大吞吐量、平均响应时间、错误率等。这有助于聚焦于关键风险区域[^2]。 2. **创建真实环境** 尽可能复制生产环境中可能出现的各种状况,包括但不限于网络延迟增加、数据库连接失败、磁盘空间耗尽等情况。利用容器化技术和虚拟机可以帮助搭建接近真实的实验平台[^3]。 3. **设计多样化测试用例** 结合实际应用的特点,制定覆盖不同维度的测试计划。例如: - 单一资源过载:仅让某个组件处于高压之下; - 多重因素叠加:同时引入多个不利变量共同作用; - 边界值探索:尝试超出正常范围的操作参数看是否会引发崩溃[^1]。 4. **监控与记录数据** 使用专业的 APM(Application Performance Management) 解决方案持续跟踪整个过程中的各项统计数值变化趋势。常见的有 Prometheus + Grafana 组合图表展示实时流量图谱;Zabbix 则擅长长期存储历史档案以便后续审查对比差异之处[^3]。 5. **评估结果** 对收集到的数据进行全面剖析,找出潜在隐患所在位置,并据此调整优化策略直至达到预期效果为止[^2]。 --- #### 示例代码片段 下面给出一段基于 `locust` 实现简单 HTTP 请求超时处理的例子作为参考: ```python from locust import HttpUser, TaskSet, task, between class UserBehavior(TaskSet): @task(1) def timeout_test(self): with self.client.get("/api/resource", catch_response=True, name="Timeout Test") as response: if response.elapsed.total_seconds() > 5: # 如果超过五秒则视为失败 response.failure(f"Request took too long! {response.elapsed.total_seconds()} seconds") class WebsiteUser(HttpUser): tasks = [UserBehavior] wait_time = between(1, 2) # 设置等待时间为随机分布在一秒至两秒之间 ``` 此段程序展示了如何通过捕获响应对象计算具体耗费的时间长度从而判定是否满足预设阈值的要求[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值