jmeter - JMeter javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭连接负载测试
问题描述
我正在尝试使用 Jmeter 负载测试来测试我的 API,每当我尝试在 20 秒或更长时间内测试 10 个或更多并发请求时都会遇到此错误:
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384)
at org.apache.jmeter.protocol.http.sampler.hc.LazyLayeredConnectionSocketFactory.connectSocket(LazyLayeredConnectionSocketFactory.java:92)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl$JMeterDefaultHttpClientConnectionOperator.connect(HTTPHC4Impl.java:326)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:850)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:561)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:67)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1282)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1271)
at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:627)
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:551)
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:490)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(Unknown Source)
... 27 more
10 个并发用户 10 秒成功,但是当我进行测试时,一些请求回复了上述错误,并且一些请求在测试期间成功。我认为这不再是代码问题。在这方面,我可以知道这是什么问题吗?我正在尝试从我的工作站(Windows)测试我的 API 到 API 所在的 Linux 开发服务器,我很好奇为什么只有一些请求回复了这个错误,而一些请求成功了,因为我的 API URL 使用 HTTPS。
解决方案
如果您SSL peer shut down incorrectly
仅在负载下收到此错误,则很可能意味着您的被测系统过载并且无法正确响应/优雅地结束连接。
- 检查您的系统在测试日志中是否有任何可疑条目
- 确保被测系统在 CPU、RAM、网络等方面有足够的空间运行,可以使用JMeter PerfMon 插件来完成
从 JMeter 方面,您可以:
确保遵循JMeter 最佳实践
与被测系统相同 - 确保 JMeter 不缺少底层操作系统资源,如果有的话 - 考虑在分布式模式下运行 JMeter
您还可以在system.properties
javax.net.debug=all
文件中添加行,这样您将获得有关标准输出中底层连接问题的更多信息此外,您可以将下一行添加到log4j2.xml文件中,这样您将在jmeter.log 文件中看到有关网络连接级别的更多详细信息
<Logger name="org.apache.http" level="debug" /> <Logger name="org.apache.http.wire" level="debug"/>
推荐阅读
- coq - 为什么基于微积分的语言如此多地使用 Setoid?
- mysql - 如何在 MySQL 中找到不同组的列的聚合总和的差异?
- python - 装饰器函数来包装一个函数?
- android - 如何使用 RxAndroidBle 调用多个 setupIndication
- vue.js - NuxtJS中如何为publicPath、outputDir、indexPath配置不同的路径
- ios - SwiftUI - 输入文本时防止 TextField 扩展
- c++ - 将 char** 转换为 int C++
- rust - 变量的所有权如何在迭代之间起作用?
- php - 限制机器中的索引文件
- typescript - 如何在 Nestjs 的 service.spec 文件中模拟 gmail 以及如何测试它?