Tôi chạy một ứng dụng web PHP trên máy chủ Apache 2.2 (Ubuntu Server 10.04, 8x2GHz, RAM 12Gb) bằng cách sử dụng prefork
. Mỗi ngày, Apache nhận được khoảng 100 nghìn đến 200 nghìn yêu cầu, trong số này khoảng 100-200 lần đạt đến giới hạn thời gian chờ (cứ sau khoảng một nghìn), thì hầu hết các yêu cầu khác đều được phục vụ dưới thời gian chờ.
Tôi có thể làm gì để tìm hiểu tại sao điều này xảy ra? Hoặc là bình thường để có một số phần nhỏ của tất cả các yêu cầu hết thời gian?
Đây là những gì tôi đã làm cho đến nay:
Có thể thấy có rất ít yêu cầu nằm giữa giới hạn thời gian chờ và yêu cầu hợp lý hơn. Hiện tại giới hạn thời gian chờ được đặt thành 50 giây, trước đây nó được đặt thành 300 và vẫn còn tình trạng tương tự với một số thời gian chờ và sau đó là một khoảng cách lớn so với các yêu cầu khác.
Tất cả các yêu cầu hết thời gian là AJAX
yêu cầu, nhưng sau đó phần lớn trong số chúng là, vì vậy có lẽ đó là một sự trùng hợp ngẫu nhiên. Mã trả về Apache là 200
, nhưng rõ ràng đã đạt đến giới hạn thời gian chờ. Họ đến từ một loạt các IP khác nhau.
Tôi đã xem xét các yêu cầu hết thời gian và không có gì đặc biệt về chúng, nếu tôi thực hiện các yêu cầu tương tự mà chúng trải qua trong chưa đầy một giây.
Tôi đã cố gắng xem xét các tài nguyên khác nhau để xem liệu tôi có thể tìm ra nguyên nhân nhưng không gặp may mắn. Luôn có nhiều bộ nhớ trống (tối thiểu là khoảng 3 GB miễn phí), tải đôi khi lên tới 1,4 và mức sử dụng CPU tới 40%, nhưng nhiều thời gian chờ xảy ra khi tải và sử dụng CPU thấp. Đĩa ghi / đọc là khá nhiều hằng số trong ngày. Không có mục nào trong nhật ký truy vấn chậm của MySQL (được đặt để ghi bất cứ điều gì trên 1 giây), không có yêu cầu nào sử dụng nhiều cơ sở dữ liệu ghi / đọc.
Màu xanh là mức sử dụng CPU, đạt cực đại ở mức 40%, maroon được tải với mức cao nhất là 1,4. Vì vậy, chúng ta có thể thấy chúng ta có thời gian chờ ngay cả khi sử dụng / tải CPU thấp (mười giây tăng tốc tương ứng với việc sử dụng CPU, nhưng đó là một vấn đề khác, tôi có hy vọng cao hơn để tìm ra những gì có thể gây ra những điều đó).
Không có lỗi trong nhật ký lỗi Apache và tôi chưa thấy nó đạt tới hơn 200 quy trình Apache đang hoạt động.
Cài đặt máy chủ:
Timeout 50
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
ServerLimit 350
StartServers 20
MinSpareServers 75
MaxSpareServers 150
MaxClients 320
MaxRequestsPerChild 5000
</IfModule>
Cập nhật:
Tôi đã cập nhật lên Ubuntu 12.04.1, chỉ trong trường hợp, không có thay đổi. Tôi đã thêm mod numqtimeout với cài đặt:
RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500
Bây giờ hầu như tất cả thời gian chờ xảy ra ở 10 giây, một hoặc hai ở 20 giây. Tôi nghĩ điều đó có nghĩa là hầu hết thời gian nó nhận được cơ quan yêu cầu có vấn đề để nhận? Phần thân yêu cầu không bao giờ được lớn hơn vài trăm byte. Tôi đã theo dõi lưu lượng truy cập mạng trên cơ sở 1 giây và nó không bao giờ cao hơn 1Mbit / giây và tôi không thấy bất kỳ rxerr hoặc rxdorps nào, vì cho rằng máy chủ nằm trên dòng 1Gbit / s, nó không giống như HoplessN00b được đăng về. Nó có thể chỉ là một trường hợp của một số kết nối người dùng xấu?
Đối với các đột biến mỗi giờ (chúng dường như trôi đi một chút, trong các biểu đồ phía trên chúng vào 33 phút trước giờ, bây giờ là 12 phút trước), tôi đã thử xem có thứ gì chạy định kỳ không ( crons vv) nhưng không tìm thấy gì. Bộ sưu tập rác PHP chạy hai lần mỗi giờ, nhưng không phải lúc tăng đột biến, tôi vẫn cố gắng vô hiệu hóa nó nhưng nó không có gì khác biệt.
Tôi đã sử dụng dstat với --top-cpu và top để xem xét các quy trình tại thời điểm tăng đột biến và tất cả những gì hiển thị là apache làm việc chăm chỉ trong vài giây nhưng không có quá trình nào khác sử dụng cpu đáng kể.
Tôi đã thực hiện phóng to biểu đồ của các gai:
Đối với tôi, có vẻ như apache dừng lại trong vài giây và sau đó làm việc chăm chỉ để xử lý các yêu cầu xuất hiện trong thời gian tạm dừng. Điều gì có thể gây ra sự dừng lại như vậy, hoặc tôi đang hiểu sai nó?