软件上线后能否连续运行一周时间、一个月甚至一整年不出问题,是测量软件成熟度的硬标准。很多软件在短时间演示时表现得很完美,但一旦挂机运行几天,就会出现内存溢出(Out of Memory)、日志文件撑爆磁盘、数据库连接池泄漏(Connection Leak)等问题,最终会导致服务中断。稳定性测试(Stability Test),也叫长时间浸泡测试(Soak Test)或耐久性测试(Endurance Test),就是专门用来发现这类慢性病的测试手段。
长时间跑测有一套严谨的方法论。
第一步:确定测试目的和环境准备
长时间跑测的目的是测试软件在不断负载下,资源消耗是不是呈线性稳定状态,而不是随时间推移逐渐恶化。测试环境必须和生产环境配置一致,否则得出的数据没有参考作用。尤其要注意关闭操作系统的自动休眠、自动更新、屏幕保护等干扰项。
第二步:设计混合业务负载模型(Workload Model)
稳定性测试最忌讳空跑。如果只是把软件打开放在那里,CPU占用率接近0,内存回收机制(GC)根本不会触发,这样的长时间跑测毫无作用。
正确的做法是设计典型业务压力负载。如对于一个Web测评对象,要模拟一定数量的虚拟用户(Virtual User)不停地执行登录、查询、提交表单等操作。负载量一般设置为预期峰值(Peak Load)的40%至60%,保持一个中等强度的背景压力。这样可以不断激发软件的GC回收、线程调度、磁盘I/O等底层机制。
第三步:确定跑测时长和观察周期
行业经验中,稳定性测试的最短有效时长是24小时,推荐时长为72小时(3天),对于金融或电信级系统,有时需要连续跑测7×24小时甚至更久。观察周期一般为每小时采集一次重点数据,如果资源曲线出现异常上扬趋势,可加密采样频率。
第四步:监控标准
长时间的跑测过程中,测试人员必须紧盯以下四个方面的数据:
内存使用趋势:这是稳定性测试重要的观察点。如果内存在每次GC之后依然呈现锯齿状缓慢上升的趋势,说明存在内存泄漏(Memory Leak)。用专业术语说,就是不可回收的堆内存(Heap Memory)不断增长。
CPU占用率:正常情况下,CPU应该在负载范围内波动。如果长时间跑测后,即便负载不变,CPU占用率却越来越高,可能意味着某些后台线程(Thread)陷入了死循环或算法效率随数据量增加而衰减。
句柄和线程数:操作系统分配给每个进程的句柄(Handle)数量是有限的。如果跑测24小时后,发现软件的句柄数从几百涨到了几万且不回落,说明代码里打开了文件没关闭,或者网络连接(Socket)没释放。这种问题在系统测评中非常常见,时间长了往往会导致系统拒绝服务(Denial of Service)。
磁盘空间:长时间运行会产生海量日志文件。如果没有配置日志滚动清理方法,磁盘空间会被撑爆,导致软件无法写入数据而崩溃。
第五步:恢复测试
跑测结束后,不能直接关机了事。停止负载观察系统是不是能恢复到空闲状态下的正常资源水位。如果停止所有用户操作后,内存依然居高不下,CPU依然繁忙,说明软件在释放资源方面存在缺陷。
委托拥有CMA认证和CNAS认证的第三方软件测评实验室是更高效的选择。湖南卓码软件测评有限公司在实施性能测试(Performance Test)和软件确认测试时,会使用专业的全链路监控探针,精确记录每一小时的内存堆栈快照(Heap Dump)。一旦发现稳定性短板,能够快速定位是代码方面的思路错误,还是中间件配置参数不合理。