2016-04-07 19 views
5

Aynı anda dinlenecek hizmetlerin gönderilmesiyle ilgili bir sorunum var; İstemcideki mesajlar (Apache JMeter), bazı talepler için, istek numarasına bağlı olarak "Bağlantı sıfırlama" dır, örneğin 100 istek gönderirim ve sunucunun yanıtı% 100 başarılı olur, ancak 500 istek gönderirsek, 30 Yanıtların% 'si hata. Hangi JVM ayarlarıBağlantı sıfırlama tüketimi REST hizmeti (scala/spray)

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} 
    } 
} 

:

-Xms1024M 
-Xmx2048M 
-Xss1M 
-XX:MaxPermSize=1024m 

ÖNEMLİ: Bussines mantık Çünkü necesary ise

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) 

ben içerik yanında, "dosyasına koyarak" modifiye sunucu aynı anda işlemleri destekliyor; 5 saniyede daha az 500 bireysel bağlantı (işlemler).

cevap

2

timeout ayarlarınız düzgün görünüyor ve saniyede 500 istek işleniyorsa kesinlikle sorun değil.

Muhtemelen isteğiniz işlenmesi çok uzun sürüyor, yani request-timeout + timeout-timeout = 32 saniye. Mimarinizi kontrol etmeli ve nerede ve neden bu kadar zaman harcadığını görmelisiniz. Bu, isteklerin çoğunun milisaniye aralığında tamamlandığı düzenli web servisleri için oldukça sıra dışı olacaktır. Yapmanız gereken bazı ağır işlemleriniz varsa, bu zaman aşımından daha uzun sürer, 202 Accepted ile yanıt verebilir ve arka planda işlem yapabilirsiniz. İstemcinin, isteğin durumunu kontrol edebileceği veya istemciye veya isteğin yapıldığını bildiren başka herhangi bir mekanizmaya geri çağrıda bulunabileceği bir URI'ye dönebilirsiniz.

Yolun kendisini engellememeyi unutmayın, aksi halde tüm diğer istekleri etkin bir şekilde engellersiniz ve zaman aşımı hatalarıyla karşılaşırsınız. Örneğin bu cevaba bakın: Use a Dispatcher with Spray HttpService. Engellenmeyen istek işleme uygulamak için şunu görün: How does spray.routing.HttpService dispatch requests?.

Sorun giderme için bazı fikirler: 1) tek bir isteği işlemek için ne kadar zaman gerektiğini ölçün ve nasıl ölçeklendiğini görün - kaynak çekişme var mı? 2) ağınızın ve istemcinizin zaman aşımına neden olmadığını kontrol edin - zaman aşımı sunucudan daha yüksek olmalıdır.

1

İşbirliğiniz ve zamanınız için teşekkür ederiz. Aleksey Izmailov.

Spray Documentation Danışma, ben sunucu yapılması isteğinin yanıtı kabul için 500s vardır bu yapılandırmayla, parametreyi spray.can.servertimeout-timeout = 500s belirlemek zorunda. Yeniden satılamazsa, sunucu isteği tamamlamak için bir hata mesajı gönderir.

Bunu yapmanın amacı, yanıtı almak için sunucuya zaman aşımı yapmaktır, bu nedenle uygulamanın bekleme süresini tamamladınız (benim durumumda request-timeout = 30 s). Bu süre (timeout-timeout) tatmin ederse ve kesinlikle yanıt vermiyorsa, sunucu isteği sonlandırır.

spray.can { 
    server { 
    ... 
    timeout-timeout = 500 s 
    ... 
    } 
    } 
İlgili konular