Chúng tôi có một máy chủ web apache trước Tomcat được lưu trữ trên EC2, loại cá thể cực lớn với bộ nhớ 34GB.
Ứng dụng của chúng tôi xử lý nhiều dịch vụ web bên ngoài và chúng tôi có một dịch vụ web bên ngoài rất tệ hại, mất gần 300 giây để đáp ứng các yêu cầu trong giờ cao điểm.
Trong giờ cao điểm, máy chủ bị sặc ở khoảng 300 quy trình httpd. ps -ef | grep httpd | wc -l = 300
Tôi đã googled và tìm thấy nhiều đề xuất nhưng dường như không có gì hoạt động .. sau đây là một số cấu hình tôi đã thực hiện được lấy trực tiếp từ các tài nguyên trực tuyến.
Tôi đã tăng giới hạn kết nối tối đa và khách hàng tối đa trong cả apache và tomcat. Dưới đây là chi tiết cấu hình:
// apache
<IfModule prefork.c>
StartServers 100
MinSpareServers 10
MaxSpareServers 10
ServerLimit 50000
MaxClients 50000
MaxRequestsPerChild 2000
</IfModule>
// mèo
<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
Tôi đã cố gắng rất nhiều đề xuất nhưng vô ích .. làm thế nào để khắc phục điều này? Tôi chắc chắn máy chủ m2xlarge sẽ phục vụ nhiều yêu cầu hơn 300, có lẽ tôi có thể gặp trục trặc với cấu hình của mình ..
Máy chủ chỉ bị nghẹt trong giờ cao điểm và khi có 300 yêu cầu đồng thời chờ dịch vụ web [300 giây bị trì hoãn] phản hồi.
Tôi chỉ theo dõi các kết nối tcp với netstat
Tôi đã tìm thấy khoảng 1000 kết nối ở trạng thái TIME_WAIT, không biết điều đó có nghĩa gì về mặt hiệu suất, tôi chắc chắn rằng nó phải được thêm vào vấn đề.
Đầu ra của 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
Ngoài ra vào thời gian cao điểm, có khoảng 10-15k tcp kết nối đến máy chủ membase [cục bộ]
MỘT SỐ LRI TRONG ĐĂNG KÝ MODJK, tôi hy vọng điều này sẽ làm sáng tỏ vấn đề này ..
[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
// Đã giải quyết
tất cả các đề xuất có giá trị của bạn .. tôi đã bỏ lỡ các cài đặt maxThreads cho trình kết nối AJP 1.3 .. Bây giờ mọi thứ dường như được kiểm soát.
Tôi cũng sẽ bắt đầu nhìn vào các máy chủ thậm chí dựa trên nginx.
top
trông như thế nào trong thời gian này? Thế còn free -m
? Và cuối cùng iostat
?