区块链交易处理的TPS测试

版权声明:版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/imbingoer 未经博主允许不得转载 https://blog.csdn.net/imbingoer/article/details/85120019

问题来源

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变大的影响】

猜你喜欢

转载自blog.csdn.net/imbingoer/article/details/85120019
今日推荐