fix(性能测试): 性能测试多节点执行时线程数计算问题
This commit is contained in:
parent
63e642911d
commit
2e11eb2bac
|
@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("jmeter")
|
@RequestMapping("jmeter")
|
||||||
|
@ -25,10 +26,11 @@ public class JmeterFileController {
|
||||||
|
|
||||||
@GetMapping("download")
|
@GetMapping("download")
|
||||||
public ResponseEntity<byte[]> downloadJmeterFiles(@RequestParam("testId") String testId, @RequestParam("resourceId") String resourceId,
|
public ResponseEntity<byte[]> downloadJmeterFiles(@RequestParam("testId") String testId, @RequestParam("resourceId") String resourceId,
|
||||||
@RequestParam("ratio") double ratio,
|
@RequestParam("ratio") String ratio,
|
||||||
@RequestParam("reportId") String reportId, @RequestParam("resourceIndex") int resourceIndex) {
|
@RequestParam("reportId") String reportId, @RequestParam("resourceIndex") int resourceIndex) {
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
byte[] bytes = jmeterFileService.downloadZip(testId, resourceId, ratio, startTime, reportId, resourceIndex);
|
double[] ratios = Arrays.stream(ratio.split(",")).mapToDouble(Double::parseDouble).toArray();
|
||||||
|
byte[] bytes = jmeterFileService.downloadZip(testId, ratios, startTime, reportId, resourceIndex);
|
||||||
return ResponseEntity.ok()
|
return ResponseEntity.ok()
|
||||||
.contentType(MediaType.parseMediaType("application/octet-stream"))
|
.contentType(MediaType.parseMediaType("application/octet-stream"))
|
||||||
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + testId + ".zip\"")
|
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + testId + ".zip\"")
|
||||||
|
|
|
@ -88,7 +88,7 @@ public class EngineFactory {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static EngineContext createContext(LoadTestWithBLOBs loadTest, String resourceId, double ratio, long startTime, String reportId, int resourceIndex) {
|
public static EngineContext createContext(LoadTestWithBLOBs loadTest, double[] ratios, long startTime, String reportId, int resourceIndex) {
|
||||||
final List<FileMetadata> fileMetadataList = performanceTestService.getFileMetadataByTestId(loadTest.getId());
|
final List<FileMetadata> fileMetadataList = performanceTestService.getFileMetadataByTestId(loadTest.getId());
|
||||||
if (org.springframework.util.CollectionUtils.isEmpty(fileMetadataList)) {
|
if (org.springframework.util.CollectionUtils.isEmpty(fileMetadataList)) {
|
||||||
MSException.throwException(Translator.get("run_load_test_file_not_found") + loadTest.getId());
|
MSException.throwException(Translator.get("run_load_test_file_not_found") + loadTest.getId());
|
||||||
|
@ -124,7 +124,16 @@ public class EngineFactory {
|
||||||
if (values instanceof List) {
|
if (values instanceof List) {
|
||||||
Object value = b.get("value");
|
Object value = b.get("value");
|
||||||
if ("TargetLevel".equals(key)) {
|
if ("TargetLevel".equals(key)) {
|
||||||
value = Math.round(((Integer) b.get("value")) * ratio);
|
Integer targetLevel = ((Integer) b.get("value"));
|
||||||
|
if (resourceIndex + 1 == ratios.length) {
|
||||||
|
double beforeLast = 0; // 前几个线程数
|
||||||
|
for (int k = 0; k < ratios.length - 1; k++) {
|
||||||
|
beforeLast += Math.round(targetLevel * ratios[k]);
|
||||||
|
}
|
||||||
|
value = Math.round(targetLevel - beforeLast);
|
||||||
|
} else {
|
||||||
|
value = Math.round(targetLevel * ratios[resourceIndex]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
((List<Object>) values).add(value);
|
((List<Object>) values).add(value);
|
||||||
engineContext.addProperty(key, values);
|
engineContext.addProperty(key, values);
|
||||||
|
|
|
@ -19,9 +19,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class DockerTestEngine extends AbstractEngine {
|
public class DockerTestEngine extends AbstractEngine {
|
||||||
private static final String BASE_URL = "http://%s:%d";
|
private static final String BASE_URL = "http://%s:%d";
|
||||||
|
@ -50,20 +48,20 @@ public class DockerTestEngine extends AbstractEngine {
|
||||||
if (threadNum > totalThreadNum - runningSumThreadNum) {
|
if (threadNum > totalThreadNum - runningSumThreadNum) {
|
||||||
MSException.throwException(Translator.get("max_thread_insufficient"));
|
MSException.throwException(Translator.get("max_thread_insufficient"));
|
||||||
}
|
}
|
||||||
List<Integer> resourceRatio = resourceList.stream()
|
Object[] resourceRatios = resourceList.stream()
|
||||||
.filter(r -> ResourceStatusEnum.VALID.name().equals(r.getStatus()))
|
.filter(r -> ResourceStatusEnum.VALID.name().equals(r.getStatus()))
|
||||||
.map(r -> JSON.parseObject(r.getConfiguration(), NodeDTO.class).getMaxConcurrency())
|
.map(r -> JSON.parseObject(r.getConfiguration(), NodeDTO.class).getMaxConcurrency())
|
||||||
.collect(Collectors.toList());
|
.map(r -> r * 1.0 / totalThreadNum)
|
||||||
|
.map(r -> String.format("%.2f", r))
|
||||||
|
.toArray();
|
||||||
|
|
||||||
for (int i = 0, size = resourceList.size(); i < size; i++) {
|
for (int i = 0, size = resourceList.size(); i < size; i++) {
|
||||||
int ratio = resourceRatio.get(i);
|
runTest(resourceList.get(i), resourceRatios, i);
|
||||||
// double realThreadNum = ((double) ratio / totalThreadNum) * threadNum;
|
|
||||||
runTest(resourceList.get(i), ((double) ratio / totalThreadNum), i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runTest(TestResource resource, double ratio, int resourceIndex) {
|
private void runTest(TestResource resource, Object[] ratios, int resourceIndex) {
|
||||||
|
|
||||||
String configuration = resource.getConfiguration();
|
String configuration = resource.getConfiguration();
|
||||||
NodeDTO node = JSON.parseObject(configuration, NodeDTO.class);
|
NodeDTO node = JSON.parseObject(configuration, NodeDTO.class);
|
||||||
|
@ -84,7 +82,7 @@ public class DockerTestEngine extends AbstractEngine {
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, String> env = new HashMap<>();
|
Map<String, String> env = new HashMap<>();
|
||||||
env.put("RATIO", "" + ratio);
|
env.put("RATIO", StringUtils.join(ratios, ","));
|
||||||
env.put("RESOURCE_INDEX", "" + resourceIndex);
|
env.put("RESOURCE_INDEX", "" + resourceIndex);
|
||||||
env.put("METERSPHERE_URL", metersphereUrl);
|
env.put("METERSPHERE_URL", metersphereUrl);
|
||||||
env.put("START_TIME", "" + this.getStartTime());
|
env.put("START_TIME", "" + this.getStartTime());
|
||||||
|
|
|
@ -26,12 +26,10 @@ public class JmeterFileService {
|
||||||
@Resource
|
@Resource
|
||||||
private LoadTestMapper loadTestMapper;
|
private LoadTestMapper loadTestMapper;
|
||||||
|
|
||||||
public byte[] downloadZip(String testId, String resourceId, double ratio, long startTime, String reportId, int resourceIndex) {
|
public byte[] downloadZip(String testId, double[] ratios, long startTime, String reportId, int resourceIndex) {
|
||||||
try {
|
try {
|
||||||
LoadTestWithBLOBs loadTest = loadTestMapper.selectByPrimaryKey(testId);
|
LoadTestWithBLOBs loadTest = loadTestMapper.selectByPrimaryKey(testId);
|
||||||
// deep copy
|
EngineContext context = EngineFactory.createContext(loadTest, ratios, startTime, reportId, resourceIndex);
|
||||||
LoadTestWithBLOBs subTest = SerializationUtils.clone(loadTest);
|
|
||||||
EngineContext context = EngineFactory.createContext(subTest, resourceId, ratio, startTime, reportId, resourceIndex);
|
|
||||||
return zipFilesToByteArray(context);
|
return zipFilesToByteArray(context);
|
||||||
} catch (MSException e) {
|
} catch (MSException e) {
|
||||||
LogUtil.error(e.getMessage(), e);
|
LogUtil.error(e.getMessage(), e);
|
||||||
|
|
Loading…
Reference in New Issue