Apache Tomcat 在 300 次連接後阻塞
我們在 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)。