JSR223采样器优化

时间:2020-06-11 21:07:47

标签: jmeter jsr223

我有以下JSR223采样器,它读取图像会对其稍作更改,然后发送POST多部分/表单数据请求。我发现与HTTP Sampler相比,它广泛使用CPU,但是我不能使用HTTP Sampler,因为它不支持更改图像而不保存到文件系统。

了解是否有人可以优化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", "");

1 个答案:

答案 0 :(得分:0)

  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中重新实现代码并使用JUnit或{{3 }}请求采样器
  4. 如果您在JMeter机器上运行的CPU超过85%,则很可能由于JMeter无法足够快地发送请求而无法获得准确的结果,请考虑使用Java
相关问题