背景:现在需要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
法律声明:未经许可,任何模仿本站模板、转载本站内容等行为者,本站保留追究其法律责任的权利! 隐私权政策声明