线程池参数调优配置测试方法
Posted ERGOisTESTING
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池参数调优配置测试方法相关的知识,希望对你有一定的参考价值。
【背景】
接到新的测试需求——压测出线程池参数最佳配置。之前没测过类似的任务,遂记录下测试方法。
线程池参数简介
core.pool.size:核心线程数,使用过的核心线程会一直存活;
work.queue.size:任务队列,核心线程使用完了会将任务放入任务队列,任务队列中的任务只会使用核心线程执行;
max.pool.size:最大线程数,当任务队列满了时,会临时创建线程来执行新任务,任务超过最大线程数后会抛出异常拒绝;
【正文】
0、基本思路
持续模拟发送大量业务数据,同时监控java线程池状况,根据具体情况再实时分析。模拟业务数据发送部分在该项目之前的业务性能测试中已有现成脚本,只要解决java线程池状态的监控即可。
1、线程池监控-p1
在网上找了可以输出线程池信息的代码示例。
(来源:https://blog.csdn.net/youanyyou/article/details/80405873)
再找一个热心开发配合处理以下任一:
a.输出实时日志。
b.提供相关接口。
c.给出相关页面。
以上三者任一皆可达到监控的目的。这里我得到了b的支援,开发提供了一个接口,可用post方法提交请求参数(子系统名),接口返回当前子系统各个线程池的状态值,主要包括以下几项:
(固定)线程池名称String poolName;
(固定)最大线程数int maximumPoolSize;
(实时)当前线程数量int PoolSize;
(固定)核心线程数量int corePoolSize;
(实时)线程数量达到过的最大值int largestPoolSize;
(实时)正在执行的任务数量int activeTaskCount;
(累计)任务总数量long taskCount;(成功+失败+进行中)
(累计)完成的任务数量long completedTaskCount;
(实时)队列排队数量int queueSize;
(实时)剩余队列容量queueRemainingCapacity
(固定)队列配置长度queueSize+queueRemainingCapacity
2、线程池监控-p2
基于开发提供的接口,用LR编写脚本,以其中一个子系统为例,脚本如下:
试运行效果如下(另一子系统脚本):
3、分析方法
一般最大线程数maximumPoolSize、核心线程数量corePoolSize、队列长度(queueSize+queueRemainingCapacity)这个几个参数是在配置中提前预设好的,后续根据测试需要逐个调整,即优化对象,可以不在脚本中做监控。
当前线程数量PoolSize、线程数量达到过的最大值largestPoolSize、正在执行的任务数activeTaskCount、任务队列排队数量queueSize、剩余队列容量queueRemainingCapacity等等这几个值为实时变化的值。
查看某个线程池队largestPoolSize较大则需要调大maximumPoolSize配置;任务队列排队数量queueSize较大同时queueRemainingCapacity为0则可考虑调大队列长度,当然不可无限制增大队列,若由于队列太长而等待较长则需要考虑增大核心线程数或者减小队列长度,使超队列的任务可以通过临时线程去处理……根据实际情况进行调整尝试,当然,根本来说也要考虑服务器性能是否可负担线程池的扩展。
多多尝试,最终根据测试环境的测试结果比对生产业务量与生产配置,给出生产配置的参考建议。
【结语】
这个测试案例中LR不是作为压测工具而是作为监控工具,类似的情况如LR监控tomcat、监控nginx等等。
《》
《》
本案前提①开发可以提供测试接口②测试人员能利用接口,编写相应的脚本。如前文所说,提供日志/接口/页面任一即可,对测试而言,首先需要有这个意识何以达到监控目的,其次考虑涉及到代码所以找的开发,如果是tomcat/nginx这些监控测试可以自己更改环境配置或者搭建监控平台用以给LR脚本提供入口。
以上是关于线程池参数调优配置测试方法的主要内容,如果未能解决你的问题,请参考以下文章