发布后单用户补丁时,jmeter引发线程异常

Posted

技术标签:

【中文标题】发布后单用户补丁时,jmeter引发线程异常【英文标题】:jmeter raises thread exception when single user patch after post 【发布时间】:2018-10-28 18:22:41 【问题描述】:

我正在针对单个 EC2 实例设置测试。在那个 EC2 中,它只有 Django 应用程序。它没有 S3/CloundFront 或 RDS 辅助它。一切都纯粹在 Docker 上运行,内存和 CPU 的基本设置。

我的目标是查看我的单个 EC2 的经验性能。它将帮助我对生产进行粗略的成本估算。

你可以跳过这个直接跳到我的问题: 这是我的生产设置 1 个负载均衡 使用 docker 镜像进行相同设置的 2 个节点 1 桶/云端 1发

软件: django==2.0.5 djangorestframework-jwt==1.11.0 djangorestframework==3.8.2

工具: JMeter 4.0 r1823414javac 10.0.1java 10.0.1 2018-04-17Java(TM) SE 运行时环境 18.3 (内部版本 10.0.1+10)Java HotSpot(TM) 64 位服务器 VM 18.3(内部版本 10.0.1+10,混合模式)

java 版本“1.8.0_171” Java(TM) SE 运行时环境 (build 1.8.0_171-b11) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.171-b11,混合模式) javac 1.8.0_171

参数:

线程组 - 线程数:10 - 加速期:1 - 循环计数:1

HTTP 标头管理器 - Content-Type, Application/json - Authorization: jwt $token

HTTP 请求 - http - localhost - 端口:8000 - POST - 路径:/api-token-auth/ - 正文数据:"username": "myname", "password": "mysecretpassword"

此时测试很好。全部都是绿色的,我可以从Django 回复token

问题:

org.apache.http.NoHttpResponseException: localhost:8000 failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:141)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:165)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl$5.doReceiveResponse(HTTPHC4Impl.java:401)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
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:842)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:581)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:67)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1231)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1220)
at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:622)
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:546)
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:486)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:253)
at java.lang.Thread.run(Thread.java:748)

附加参数 JSON 提取器 - Main sample only - 创建变量的名称:token - JSON 路径表达式:$.token - 匹配号(0 表示随机):1

HTTP 请求 - http - localhost - port: 8000 - PATCH - /api/branches/5/ - 身体数据:"name": "Bangkok"

我已经尝试过this 但我无法让它工作。这是我的导航栏

调试采样器: Jmeter的token是空的

JMeterVariables:
JMeterThread.last_sample_ok=false
JMeterThread.pack=org.apache.jmeter.threads.SamplePackage@79e6c86e
START.HMS=095906
START.MS=1526612346142
START.YMD=20180518
TESTSTART.MS=1526639371341
__jm__Users__idx=0
__jmeter.USER_TOKEN__=Users 1-1
token=
token_matchNr=0

问题: 如何让jmeter 抢到jwt 令牌并拍摄另一个端点?

更新1: 当我禁用Patch Branch。 Debug Sampler 确实显示了token

更新 2: 我被错误地称为变量。但是PATCH 问题仍然存在。现在我可以拨打token。这是我的request

PATCH http://localhost:8000/api/branches/5/

PATCH data:

    "name": "Bangkok"



[no cookies]

Request Headers:
Connection: keep-alive
Autorization: jwt eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxMCwidXNlcm5hbWUiOiJ0b255b2QiLCJleHAiOjE1MjY2NzIzOTMsImVtYWlsIjoidG9ueW9kQG1teC5jb20iLCJvcmlnX2lhdCI6MTUyNjY0MzU5M30.mjKJ2sRFx26pyChET1ORzLmv6umL7B1_Sy8wnNJO-iQ
Content-Type: Application/json
Content-Length: 26
Host: localhost:8000
User-Agent: Apache-HttpClient/4.5.5 (Java/10.0.1)

更新3: 问题似乎出在jmeter 方面,因为。当我打开后端日志时。 PATCH 永远不会到达后端

INFO|18/May/2018 11:52:04|"POST /api-token-auth/ HTTP/1.1" 200 224
INFO|18/May/2018 12:01:35|"POST /api-token-auth/ HTTP/1.1" 200 224

更新:4 找到了线索。可能是HTTPClient4的问题

更新:5 尝试模仿原来的java8环境。它提出了同样的问题 https://jmeter.apache.org/download_jmeter.cgi

http://www.jmeter-archive.org/org-apache-http-NoHttpResponseException-td5719349.html

【问题讨论】:

【参考方案1】:

因为当您取消选中“使用 KeepAlive”时它可以工作,这意味着连接变得陈旧很可能是因为 JMeter 默认值不适用于您的用例。

你需要调整:

httpclient4.idletimeout httpclient4.validate_after_inactivity :减少它 httpclient4.time_to_live

见:

https://jmeter.apache.org/usermanual/properties_reference.html

【讨论】:

非常感谢您的回答。调整参数对我来说是一个很好的起点。 Jmeter 是巨大的!【参考方案2】:

oleg 对我的问题做了answer。我必须取消选中Use KeepAlive

【讨论】:

以上是关于发布后单用户补丁时,jmeter引发线程异常的主要内容,如果未能解决你的问题,请参考以下文章

引发异常后 PL/SQL 继续

程序崩溃后如何挂起所有线程?

Jmeter缓存管理器使用情况

WPF 引发异常解析 XAML,其中包括 Winforms 用户控件

Visual Studio 2013 未引发用户未处理的异常

如何使用 Fluent Assertions 引发异常?