【问题标题】:JSR223 Sampler OptimatizationJSR223 采样器优化
【发布时间】:2020-06-11 21:07:47
【问题描述】:

我有以下 JSR223 采样器,它读取图像会稍微改变它并发送 POST 多部分/表单数据请求。我发现与 HTTP 采样器相比,它广泛使用 CPU,但我不能使用 HTTP 采样器,因为它不支持在不保存到文件系统的情况下更改图像。

感谢任何人有任何意见来优化 JSR223 采样器中的脚本,因此它不会占用大量 CPU。

import org.apache.http.HttpHeaders
import org.apache.http.client.config.RequestConfig
import org.apache.http.client.methods.HttpUriRequest
import org.apache.http.client.methods.RequestBuilder
import org.apache.http.conn.ssl.NoopHostnameVerifier
import org.apache.http.conn.ssl.SSLConnectionSocketFactory
import org.apache.http.conn.ssl.TrustStrategy
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.HttpClients
import org.apache.http.ssl.SSLContextBuilder
import org.apache.http.util.EntityUtils
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.HttpMultipartMode;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.awt.Graphics;
import java.io.ByteArrayOutputStream;
import org.apache.http.entity.ContentType;

import java.security.cert.CertificateException
import java.security.cert.X509Certificate

List<String> sendRequest(String url, String method, String body) {


RequestConfig requestConfig = RequestConfig.custom()
        .setConnectTimeout(40000)
        .setSocketTimeout(50000)
        .build();

BufferedImage image = ImageIO.read(new File("/home/4567/loadtest/Bank.JPG"));
Graphics graphics = image.getGraphics();
graphics.setFont(graphics.getFont().deriveFont(16f));
graphics.drawString("User " + ctx.getThreadNum() + '-' + Math.random()  +"; iteration: " + ctx.getVariables().getIteration(), 50, 50);
graphics.dispose();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", bytes);

final MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
multipartEntity.setMode(HttpMultipartMode.STRICT);
multipartEntity.addBinaryBody("File", bytes.toByteArray(),ContentType.IMAGE_JPEG, "Bank.JPG");


HttpUriRequest request = RequestBuilder.create(method)
        .setConfig(requestConfig)
        .setUri(url)
        .setHeader("x-ibm-client-id","248a20f3-c39b-45d0-b26a-9019c26e9be8")
        .setHeader("X-Client-Id","2861D410-773B-4DD9-AE74-882116B08856")
        .setHeader("ResponseMinLatencyMs","45")
        .setHeader("ResponseMaxLatencyMs","55")
        .setEntity(multipartEntity.build())
        .build();

   // String req = "REQUEST:" + "User " + ctx.getThreadNum() + "; iteration: " + ctx.getVariables().getIteration() + " " + request.getRequestLine() + "\n";

def builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustStrategy() {
    @Override
    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        return true;
    }
});
def trustAllFactory = new SSLConnectionSocketFactory(builder.build(), new NoopHostnameVerifier());

HttpClients.custom().setSSLSocketFactory(trustAllFactory).build().withCloseable { httpClient ->

    httpClient.execute(request).withCloseable { response ->

       // String res = "RESPONSE:" + "User " + ctx.getThreadNum() + "; iteration: " + ctx.getVariables().getIteration() + " " + response.getStatusLine()  + (response.getEntity() != null ? EntityUtils.toString(response.getEntity()) : "") + "\n";

       // log.info(req + "\n" + res);

       // return Arrays.asList(req, res);
       response.close()
    }
    httpClient.close()
}
image.flush()
bytes.flush()
bytes.close()

}

sendRequest("https://test-server.com/upload", "POST", "");

【问题讨论】:

    标签: jmeter jsr223


    【解决方案1】:
    1. StackOverflow 是 not a code-writing service 并且要求某人优化您甚至没有编写的代码是您应该做的事情,即在像 Toptal 这样的网站上
    2. 我相信普通的HTTP Request 采样器在发送请求之前不会更改图像,这就是它不是 CPU 密集型的原因。
    3. 查看Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For! 文章,Java 似乎在性能和资源使用方面仍然是最佳选择,因此您可能希望在 Java 中重新实现代码并使用JUnitJava 请求采样器李>
    4. 如果您在 JMeter 机器上运行超过 85% 的 CPU,很可能您将无法获得准确的结果,因为 JMeter 无法足够快地发送请求,请考虑使用 Distributed Testing

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多