我必须构建一个相当自定义的负载测试工具,因此我不想使用 JMeter(让我们暂时假设自定义级别无法使用 jmeter 完成)。
此负载测试工具的一个导入部分是将 XML 发送到 API 尾注。
如何改进以下代码以使其快速/高效?
private boolean PostErrorToApi() throws IOException {
File xmlSample = new File("/path/to/file/sample.xml");
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://localhost:8090/some/api/method/get/");
httpPost.setEntity(new FileEntity(xmlSample, "text/xml, application/xml"));
CloseableHttpResponse response = httpClient.execute(httpPost);
String line = "";
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} finally {
response.close();
}
if (line.equals("200 OK"))
return true;
else
return false;
}
我的目标是达到每秒几千个请求(http延迟应该不是一个大问题,因为这将在专用网络中)。
我并不是想在这里获得现实世界的场景,目标是看看服务是否可以保持 48 小时,只是为了监控可能出现的任何问题等。
大多数情况下,它是IO绑定任务,而不是CPU。您可以尝试将文件缓存在内存中,而无需每次都从光盘读取文件。缓存 httpClient 的实例,使用相同的连接多次发送文件。在一个 JVM 中生成多个线程,每个线程将创建单独的连接。如果还不够,请创建多个进程,在不同的计算机上运行它并收集结果
此外,readLine
将阻止直到数据可用,因此您的任务将卡住,您将永远不知道是否有任何问题。设置读取响应的SO_TIMEOUT。