Apache-2.2

Apache Tomcat 在 300 次連接後阻塞

  • May 11, 2018

我們在 EC2 上託管的 Tomcat 前面有一個 apache 網路伺服器,實例類型超大,記憶體為 34GB。

我們的應用程序處理大量外部 Web 服務,並且我們有一個非常糟糕的外部 Web 服務,在高峰時段需要將近 300 秒來響應請求。

在高峰時段,伺服器在大約 300 個 httpd 程序中阻塞。ps -ef | grep httpd | wc -l =300

我用Google搜尋並找到了許多建議,但似乎沒有任何效果。以下是我所做的一些配置,這些配置直接取自線上資源。

我增加了 apache 和 tomcat 中最大連接數和最大客戶端數的限制。以下是配置詳細資訊:

//阿帕奇

  <IfModule prefork.c>
   StartServers 100
   MinSpareServers 10
   MaxSpareServers 10
   ServerLimit 50000
   MaxClients 50000
   MaxRequestsPerChild 2000
   </IfModule>

//tomcat

   <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
          connectionTimeout="600000"
          redirectPort="8443"
          enableLookups="false" maxThreads="1500"
          compressableMimeType="text/html,text/xml,text/plain,text/css,application/x-javascript,text/vnd.wap.wml,text/vnd.wap.wmlscript,application/xhtml+xml,application/xml-dtd,application/xslt+xml"
          compression="on"/>

//Sysctl.conf

net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
fs.file-max = 5049800
vm.min_free_kbytes = 204800
vm.page-cluster = 20
vm.swappiness = 90
net.ipv4.tcp_rfc1337=1
net.ipv4.tcp_max_orphans = 65536
net.ipv4.ip_local_port_range = 5000 65000
net.core.somaxconn = 1024

我一直在嘗試許多建議但徒勞無功..如何解決這個問題?我確定 m2xlarge 伺服器應該提供超過 300 個請求,我的配置可能有問題。

伺服器僅在高峰時段和有 300 個並發請求等待

$$ 300 second delayed $$網路服務來響應。 我只是在用 netstat 監控 tcp 連接

我在 TIME_WAIT 狀態下發現了大約 1000 個連接,不知道這對性能意味著什麼,我敢肯定它一定會增加問題。

TOP 輸出

8902  root      25   0 19.6g 3.0g  12m S  3.3  8.8  13:35.77 java
24907 membase   25   0  753m 634m 2528 S  2.7  1.8 285:18.88 beam.smp
24999 membase   15   0  266m 121m 3160 S  0.7  0.3  51:30.37 memcached
27578 apache    15   0  230m 6300 1536 S  0.7  0.0   0:00.03 httpd
28551 root      15   0 11124 1492  892 R  0.3  0.0   0:00.25 top


Output of free -m
total       used       free     shared    buffers    cached
35007       8470       26536    0          1         61
8407        26599
15999       15         15984

output of iostat
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
     26.21    0.00    0.48    0.13    0.02   73.15

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda1             14.36         4.77       329.37    9005402  622367592
sdb               0.00         0.00         0.00       1210         48

同樣在高峰時間有大約 10-15k tcp 連接到 membase 伺服器

$$ local $$ MODJK 日誌中的一些錯誤,我希望這能對這個問題有所了解..

[Wed Jul 11 14:39:10.853 2012] [8365:46912560456400] [error]         ajp_send_request::jk_ajp_common.c (1630): (tom2) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=110)
[Wed Jul 11 14:39:18.627 2012] [8322:46912560456400] [error] ajp_send_request::jk_ajp_common.c (1630): (tom2) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=110)
[Wed Jul 11 14:39:21.358 2012] [8351:46912560456400] [error] ajp_get_reply::jk_ajp_common.c (2118): (tom1) Tomcat is down or refused connection. No response has been sent to the client (yet)
[Wed Jul 11 14:39:22.640 2012] [8348:46912560456400] [error] ajp_get_reply::jk_ajp_common.c (2118): (tom1) Tomcat is down or refused connection. No response has been sent to the client (yet)

~

Worker.properties
workers.tomcat_home=/usr/local/tomcat/
worker.list=loadbalancer
worker.tom1.port=8009
worker.tom1.host=localhost
worker.tom1.type=ajp13
worker.tom1.socket_keepalive=True
worker.tom1.connection_pool_timeout=600
worker.tom2.port=8109
worker.tom2.host=localhost
worker.tom2.type=ajp13
worker.tom2.socket_keepalive=True
worker.tom2.connection_pool_timeout=600
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tom1,tom2
worker.loadbalancer.sticky_session=True
worker.tom1.lbfactor=1
worker.tom1.socket_timeout=600
worker.tom2.lbfactor=1
worker.tom2.socket_timeout=600

//解決了

謝謝大家的寶貴建議。我錯過了 AJP 1.3 連接器的 maxThreads 設置。現在一切似乎都在控制之中。

我也會開始研究像 nginx 這樣的基於伺服器的伺服器。

您是否在埠 8009 上增加了 AJP 1.3 連接器中的 maxThreads?

nginx考慮在 Apache 之類或lighttpd前面設置一個非同步代理 Web 伺服器。Apache 同步提供內容,因此在客戶端完整下載生成的內容之前,工作人員會被阻止(更多詳細資訊請點擊此處)。設置非同步(非阻塞)代理通常會顯著改善情況(我曾經使用nginx作為前端代理將同時執行的 Apache 工作人員的數量從 30 降低到 3-5)。

引用自:https://serverfault.com/questions/405893