如何在高CPU使用期间让Jetty返回503?

时间:2015-08-13 12:03:07

标签: configuration jetty

如何配置Jetty以便它只能接收前几百个请求并将5xx返回到超时请求。

我执行了https://wiki.eclipse.org/Jetty/Howto/High_Load#Thread_Pool

这是我的码头配置

<Configure id="Server" class="org.eclipse.jetty.server.Server">

<New id="ServerLog" class="java.io.PrintStream">
    <Arg>
        <New class="org.eclipse.jetty.util.RolloverFileOutputStream">
            <Arg><SystemProperty name="jetty.logs" default="./logs"/>/<SystemProperty name="jetty.appkey" default="jetty"/>.log.yyyy_mm_dd</Arg>
            <Arg type="boolean">true</Arg>
            <Arg type="int">10</Arg>
            <Arg><Call class="java.util.TimeZone" name="getTimeZone"><Arg>GMT+8</Arg></Call></Arg>
            <Arg type="string">yyyy-MM-dd</Arg>
            <Arg type="string"></Arg>
            <Get id="ServerLogName" name="datedFilename"/>
        </New>
    </Arg>
</New>
<Call class="org.eclipse.jetty.util.log.Log" name="info"><Arg>Redirecting stderr/stdout to <Ref id="ServerLogName"/></Arg></Call>
<Call class="java.lang.System" name="setErr"><Arg><Ref id="ServerLog"/></Arg></Call>
<Call class="java.lang.System" name="setOut"><Arg><Ref id="ServerLog"/></Arg></Call>

<Set name="ThreadPool">
    <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
        <!-- specify a bounded queue -->
        <Arg>
            <New class="java.util.concurrent.ArrayBlockingQueue">
                <Arg type="int">300</Arg>
            </New>
        </Arg>
        <Set name="minThreads">20</Set>
        <Set name="maxThreads">200</Set>
        <Set name="detailedDump">false</Set>
    </New>
</Set>

<Call name="addConnector">
    <Arg>
        <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
            <Set name="host"><SystemProperty name="jetty.host"/></Set>
            <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
            <Set name="acceptQueueSize">100</Set>
            <Set name="maxIdleTime">100</Set>
            <Set name="Acceptors">2</Set>
            <Set name="statsOn">false</Set>
            <!-- Set name="confidentialPort">8063</Set -->
            <Set name="lowResourcesConnections">100</Set>
            <Set name="lowResourcesMaxIdleTime">100</Set>
        </New>
    </Arg>
</Call>
然后我接受了压力测试

ab -c 10000 -n 20000 -l 

但结果是

Concurrency Level:      10000
Time taken for tests:   98.700 seconds
Complete requests:      20000
Failed requests:        16909
   (Connect: 0, Receive: 0, Length: 16909, Exceptions: 0)
Write errors:           0
Non-2xx responses:      1
Total transferred:      301105691 bytes
HTML transferred:       296709079 bytes
Requests per second:    202.63 [#/sec] (mean)
Time per request:       49349.994 [ms] (mean)
Time per request:       4.935 [ms] (mean, across all concurrent requests)
Transfer rate:          2979.22 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        2  314 301.8    355    1149
Processing:   313 40984 33341.1  36948   98109
Waiting:        0 40112 33522.7  35817   98107
Total:        720 41298 33360.0  37063   98615

Percentage of the requests served within a certain time (ms)
  50%  37063
  66%  59864
  75%  71831
  80%  78646
  90%  91082
  95%  95328
  98%  97180
  99%  97705
 100%  98615 (longest request)

我使用'-l'选项并且仍有很多失败的请求,所以我同时重试我打开另一个标签并卷曲网址,而不是在一段时间后返回503但是正确的响应。

我的配置有什么问题吗?

1 个答案:

答案 0 :(得分:0)

Jetty 7 and Jetty 8 are EOL (End of Life)考虑​​升级。

此外,当您这样做时,您可能希望研究Jetty 9.x LowResourceMonitor(检测连接器级别的行为)或DosFilter(检测特定URL模式级别的行为)的技术)并为您自己检测低资源和/或负载设置自定义解决方案,然后使用503状态代码进行响应。

此外,上限限制ThreadPools永远不是处理负载问题的好主意。它就像试图通过限制高速公路上的匝道数量来控制高速公路上的交通,它只是创造了一个巨大的积压,希望在高速公路上行驶。