<>问题来源

Client发送交易tx 到区块链,需要测试交易处理的tps。

<>详细描述

* 每笔交易tx携带的数据量并不一样,有大有小。
* 需要模拟多客户端发送串行发送交易tx。
* 统计发送出去总交易数totalTxs,已经根据发送交易带返回的交易处理成功数SuccessTxs,已经全部完成交易所花费的时间totalTime。
* 交易处理的tps=successTxs/totalTime
* 交易的成功率 successRate=successTxs/totalTxs
*
<>问题分析

* 使用多线程模拟客户端
* 各客户端串行发送一定数量的模拟交易。
因为使用的区块链系统是带返回的,所以当客户端发送一个交易出去后我们
* 额外,添加了线程池,维护一批常用的线程。
<>难点

为了尽可能在笔记本上测试出区块链的真实性能。可能需要提升的地方有

* 本地选用何种线程池?java的executors提供的四种包括
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。 newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
* 各个线程池交易的分配规则是什么?
比如要发送1000笔交易,线程池维护了固定的10个线程。因为各个交易的大小不一样,所以是每个线程平均分配1000/10=100个线程还是选用其他的动态分配规则?
* 因为所以交易的花费时间totalTime=最后一个交易处理完成的时间(不管成功还是失败)-第一笔交易的发送出去的时间。
<>解决策略

*
线程池使用newFixedThreadPool固定长度的线程池,把这个长度值length当成参数让测试人员去提交。其次,考虑到我开发使用的笔记本性能,我把length的最大值限定为1000.
* 动态分配任务。只要检测到线程池种的线程空闲,就把任务交给它。尽可能的让各个线程能在相近的时间点完全各自的任务。
*
串起来的思路大概是:1、用户指定线程池的线程数threadNum和需要模拟发送的交易数txsNum;2、在线程池中创建指定的线程数;3、创建txsNum个模拟交易,各交易中携带的业务数据也尽可能随机大小;4、发送交易。为各个线程添加交易并不断检测,一但检测到线程完成当前任务,则分配新的任务。【避免了固定平均分配可能带来的一些线程处理时间过长引起的totalTime变大的影响】

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信