发布后单用户补丁时,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引发线程异常的主要内容,如果未能解决你的问题,请参考以下文章
WPF 引发异常解析 XAML,其中包括 Winforms 用户控件