大连仟亿科技
客服中心
  • 电话
  • 电话咨询:0411-39943997
  • 手机
  • 手机咨询:15840979770
    手机咨询:13889672791
网络营销 >更多
您现在的位置:仟亿科技 > 新闻中心 > 常见问题

并行计算性能测试

作者:billionnet 发布于:2012/11/20 17:40:00 点击量:

背景:现在需要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 paramsValues= new HashMap();

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);

}

}

}



分享到:


评论加载中...
内容:
评论者: 验证码:
  

Copyright@ 2011-2017 版权所有:大连仟亿科技有限公司 辽ICP备11013762-1号   google网站地图   百度网站地图   网站地图

公司地址:大连市沙河口区中山路692号辰熙星海国际2215 客服电话:0411-39943997 QQ:2088827823 42286563

法律声明:未经许可,任何模仿本站模板、转载本站内容等行为者,本站保留追究其法律责任的权利! 隐私权政策声明