【问题标题】:Large File Upload Fails with JMeter使用 JMeter 上传大文件失败
【发布时间】:2016-08-16 14:24:46
【问题描述】:

我正在尝试使用 Apache JMeter 在文件上传场景中测试服务器的性能。具体来说,我正在使用 HTTP Test Script Recorder 创建一个测试计划来实现这个 curl 命令:

$ curl -k -x localhost:8888 -XPOST -d @filename.json -H "Content-Type: application/json" "https://hostname:port"

在 filename.json 只有几十行长之前,我已经成功使用此方法,但是现在当我想测试大约 72,000 行的 json(约 5.1M 文件)时,我收到以下错误:

java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)
at sun.security.ssl.OutputRecord.write(OutputRecord.java:417)
at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:876)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:847)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
at org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:181)
at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:115)
at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:122)
at org.apache.http.entity.StringEntity.writeTo(StringEntity.java:169)
at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:96)
at org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:112)
at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:117)
at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:265)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.sendRequestEntity(ManagedClientConnectionImpl.java:216)
at org.apache.jmeter.protocol.http.sampler.MeasuringConnectionManager$MeasuredConnection.sendRequestEntity(MeasuringConnectionManager.java:207)
at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:237)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:122)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:686)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:488)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:884)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:619)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:379)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1146)
at org.apache.jmeter.protocol.http.proxy.Proxy.run(Proxy.java:240)

确实,我相信这个问题出在 JMeter 上,因为不涉及 JMeter 的原始 curl 命令

curl -XPOST -d @filename.json -H "Content-Type: application/json" "https://hostname:port"

顺利上传文件。

有人遇到过这个问题吗?任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: curl file-upload jmeter httprequest


    【解决方案1】:

    首先检查您的文件是否在 jmeter/bin 文件夹中

    然后检查您是否在使用 JMeter 最佳实践?

    并在您的问题中提供有关您的测试计划和测试方法的更多详细信息

    【讨论】:

      【解决方案2】:

      您是使用多个用户还是单个线程运行此测试?

      检查分配给 JMeter 的内存并尝试增加内存,以防您与多个用户一起运行它。 确保正在选择文件。理想情况下,要上传的文件应位于 bin 文件夹下。还要检查您在上传文件时发送的标题。

      还要检查是否有任何授权 id 需要与文件一起传递。 其中之一应该有助于解决您的问题。

      【讨论】:

      • 感谢您的回答。只需在测试脚本记录器运行时输入此 curl 命令,就会出现此错误。我相信这与将整个 72k 行文件加载到正文数据选项卡中有关,这会使内存过载。你知道如何解决这个问题吗?
      • 我没看懂 curl 命令部分?你能解释一下你是如何录制的吗?您可以使用 http 采样器将 json 文件作为附件发送。