Ley*_*rgo 5 java rest scala jmeter spray
我发送并发请求休息服务时遇到问题; 客户端(Apache JMeter)中的消息对于某些请求是"连接重置",具体取决于请求数量,例如,我发送100个请求并且服务器的响应是100%成功,但是如果我发送500个请求,则30 %的回复是错误的.
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:61)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
at org.apache.jmeter.protocol.http.sampler.MeasuringConnectionManager$MeasuredConnection.receiveResponseHeader(MeasuringConnectionManager.java:201)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:715)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:520)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:517)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:331)
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.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1135)
at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:434)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:261)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
我修改了"application.conf",内容是下一个:
spray.can {
server {
server-header = spray-can/${spray.version}
ssl-encryption = off
pipelining-limit = 16
idle-timeout = 60 s
request-timeout = 30 s
timeout-timeout = 2 s
timeout-handler = ""
reaping-cycle = 250 ms
stats-support = on
remote-address-header = off
raw-request-uri-header = off
transparent-head-requests = on
chunkless-streaming = off
verbose-error-messages = on
request-chunk-aggregation-limit = 1m
response-header-size-hint = 512
bind-timeout = infinite
unbind-timeout = 1s
registration-timeout = 1s
default-host-header = ""
automatic-back-pressure-handling = on
back-pressure {
noack-rate = 10
reading-low-watermark = infinite
}
parsing = ${spray.can.parsing}
}
client {
user-agent-header = spray-can/${spray.version}
idle-timeout = 60 s
request-timeout = 40 s
reaping-cycle = 250 ms
response-chunk-aggregation-limit = 1m
chunkless-streaming = off
request-header-size-hint = 256
max-encryption-chunk-size = 1m
connecting-timeout = 30s
proxy {
http = default
https = default
}
ssl-tracing = off
parsing = ${spray.can.parsing}
}
host-connector {
max-connections = 80
max-retries = 8
max-redirects = 0
pipelining = enabled
idle-timeout = 30 s
client = ${spray.can.client}
}
}
Run Code Online (Sandbox Code Playgroud)
JVM的设置是:
-Xms1024M
-Xmx2048M
-Xss1M
-XX:MaxPermSize=1024m
Run Code Online (Sandbox Code Playgroud)
重要提示:由于bussines逻辑,服务器支持并发事务是必要的; 少于5秒的500个单独连接(交易).
您的timeout
设置看起来不错,每秒处理 500 个请求绝对不是问题。
您的请求很可能需要太长时间才能处理,即超过request-timeout
+ timeout-timeout
= 32 秒。您需要检查您的架构并了解它在何处以及为何花费如此多的时间。对于常规 Web 服务来说,这非常不寻常,因为大多数请求在毫秒范围内完成。如果您需要进行一些繁重的处理,并且需要比超时时间更长的时间,您可以回复202 Accepted
并在后台进行处理。您可以返回一个 URI,客户端可以在其中检查请求的状态,或者使用客户端回调或任何其他机制来传达请求已完成的信息。
请记住不要阻止路由本身,否则您将有效地阻止所有其他请求,并且可能会收到超时错误。例如,请参阅此答案:Use a Dispatcher with Spray HttpService。要实现非阻塞请求处理,请参阅:spray.routing.HttpService 如何调度请求?。
故障排除的一些想法:1)测量处理单个请求所需的时间,并查看其扩展情况 - 您是否存在资源争用?2)检查您的网络和客户端是否导致超时 - 它们的超时应该高于服务器的超时。
归档时间: |
|
查看次数: |
777 次 |
最近记录: |