并行计算性能测试

背景:现在需要A/B/C三个分数,然后我们再利用三个分值算出一个总分。原来的方式是一台服务器顺序计算出A/B/C,最后算出总分,此时的计算耗时约为A+B+C+ABC,(ABC为对ABC进行求和的运算);现在为提高整体计算的效率,采用并行计算,如果要计算总分,就把A/B/C的计算需求由主机同时分发给三台服务器,待三台服务器运算出结果后返回给主机,然后主机根据三台服务器的返回结果算出部分,此时的计算耗时约为max(A,B,C)+ABC,(忽略网络耗时)。

 

功能性的测试在这不作说明,重点关注性能测试中的负载均衡和信息准确性。

 

比方现在有四台服务器,SD,SD1,SD2,SD3,SD做为主机,而SD1,SD2,SD3作为分发机器。现在有如下关注点:1、SD分发给SD1,SD2,SD3是否均衡。2. SD同时大规模并发时,信息是否准确,线程池是否混乱。

 

本次使用TESTNG进行性能测试,(大家也可以选择LR及jmeter,本次是只想对校验负载均衡和校验数据准确性,并非计算服务性能曲线,所以选择TESTNG)

 

开始时我使用了TESTNG的标签,来指定invocationCount = 10000和threadPoolSize = 20,这两个参数的意思是一共调用服务10000次,而线程池一共20个,因此平均下来每个线程调用500次。

关注点一、查看分发是否均衡。因为有三个节点A/B/C需要进行运算,因此如下设计:1.一台主机3台分发机器,运行上述脚本,然后进入logs/sofa/sofa-sal-digest.log目录,统计每台服务器的调用情况,查看是否均衡。2.一台主机4台分发机器,查看负载是否均衡。3.一台主机2台分发机器,查看负载是否均衡。4.一台主机,1台分发机器,查看负载是否均衡。5.一台主机,没有分发机器,查看负载情况。

关注点二、信息准确性,大量并发时信息是否混乱。准备了十组数据,对应十组期望值,然后利用随机数,随机选取一组数据进行查询,对比查询到的结果是否准确。服务器使用情况同上。

关注点三、持续不断的并行计算时,信息是否准确。使用TESTNG的标签进行并发调用时,总共执行invocationCount=10000次,这样足够猛,但是不够持久。如果想长时间的运行,就得把这个值设置的很大,但是受限于我们的机器和网卡,机器运行会越来越慢。因此考虑自己单独启线程,然后死循环去调用,就是小剂量不停歇的去调服务,这样就能够达到我们的要求了。

 

下面是我用来进行并行计算的脚本:

@XMode(XMode.WEBSERVICE)
public class CallDataSetNormalTest {
 
    @XAutoWire(XAutoWire.BY_NAME)
    protected DataSetService dataSetService;
 
    /** 线程池 */
    private static final Executor EXECUTOR = Executors.newFixedThreadPool(20);
 
    @Test
    public void threadCall() {
 
        while (true) {
            for (int i = 0; i < 50; i++) {
                EXECUTOR.execute(new Runnable() {
                    public void run() {
                        callDataSet();
                    }
                });
            }
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }
        }
 
    }
 
    public void callDataSet() {
 
        String[][] userId = { { "2088102114256253", "2088102114256265" },
                { "2088102012407732", "2088102114256277" }    };
 
        Money[] money = { new Money(106), new Money(502) };
 
        DataSetQuery dataSetQuery = new DataSetQuery();
        dataSetQuery.setDataSetName("FP_Model");
        dataSetQuery.setCallFrom("ctu");
        Map<Params, Object> paramsValues= new HashMap<Params, Object>();
 
        Random random = new Random();
        int i = Math.abs(random.nextInt()) % 10;
        String buyer = userId[i][0];
        String seller = userId[i][1];
 
        paramsValues.put(Params.BUYER_ID, buyer);
        paramsValues.put(Params.SELLER_ID, seller);
       dataSetQuery.setParamsValues(paramsValues);
 
        DataSetIndicatorInfo info = newDataSetIndicatorInfo();
        info.setIndicatorName("ZJ2");
        info.setIndicatorDesc("ZJ2");
        info.setReturnType("java.lang.Double");
        DataSetResult dr = dataSetService.callDataSet(dataSetQuery);
        double expected =money[i].getAmount().doubleValue();
        double actual = (Double) dr.getResult().get(info);
        if (expected != actual) {
            logger.info("resultcode= " + dr.getResultCode());
            logger.info("actual = " + actual);
            logger.info("expected = " + expected);
        }
 
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值