Làm thế nào để gỡ lỗi thời gian chờ apache?


13

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:

Yêu cầu thời gian trả lời

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à AJAXyê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.

Yêu cầu thời gian đáp ứng với tải hệ thống / cpu

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: Thời gian đáp ứng yêu cầu được phóng to

Đố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ó?


1
Tôi muốn đăng với một số biểu đồ qua các yêu cầu, nhưng đại diện của tôi quá thấp.
Leon

Câu trả lời:


4

Điều đầu tiên tôi lưu ý, nhìn vào biểu đồ đầu tiên của bạn, dường như có sự chậm lại hàng giờ (xảy ra khoảng 40 phút trước giờ) có thể góp phần gây ra vấn đề. Bạn nên xem lịch trình tác vụ trên hệ điều hành / cơ sở dữ liệu.

Dựa trên dữ liệu bạn đã cung cấp, bước tiếp theo của tôi sẽ là xem xét tần suất thời gian phản hồi (số phản hồi trên trục Y so với thời lượng trên X) nhưng chỉ bao gồm các URL thể hiện thời gian chờ (hoặc tốt nhất là một URL tại một thời điểm ). Trên một hệ thống điển hình, điều này phải tuân theo phân phối bình thường hoặc phân tích - các yêu cầu hết thời gian có thể chỉ là một phần của đuôi - trong trường hợp đó bạn cần tập trung nỗ lực vào điều chỉnh chung. OTOH nếu phân phối là hai phương thức thì bạn cần tìm kiếm sự tranh chấp ở đâu đó trong mã của bạn.


Cám ơn phản hồi của bạn. Tôi đang xem xét những gì có thể gây ra sự chậm lại hàng giờ. Trong thời gian đó tôi đã thực hiện một biểu đồ tần số của dữ liệu tôi đã có. Đây chỉ là một trong những URL có vấn đề về thời gian chờ (nhưng các URL khác trông rất giống nhau): leela.kikora.no/apache_hist_show.png Lượng thời gian chờ rất nhỏ so với những thời gian chỉ mất chưa đến 10 giây, nhưng có vẻ Giống như nó có thể không phải là một phần của đuôi. Nhưng mặt khác, có thể chỉ là vì họ đại diện cho bất cứ điều gì sẽ mất hơn 50 giây, nên nó trông giống như thế này.
Leon

3

Tôi có một suy nghĩ khác về điều này, dựa trên thực tế là bạn nhận được một số lượng lớn yêu cầu mỗi ngày và dường như chỉ có thời gian chờ trong giờ cao điểm (từ những hình ảnh bạn đã đăng).

Có một bài đăng trên blog Server Fault,Per Second Measurements Don't Cut It ... có thể một số trong những yêu cầu này đang gặp vấn đề tương tự mà nhóm ServerFault gặp phải không?

Chúng tôi phát hiện ra rằng chúng tôi đã loại bỏ các gói khá thường xuyên trên các giao diện 1 Gbit / s với tốc độ chỉ 10-30 MBit / giây làm tổn hại đến hiệu suất của chúng tôi. Điều này là do tốc độ 10-30 MBit / s thực sự là số bit được truyền trong mỗi 5 phút được chuyển đổi thành tốc độ một giây. Khi chúng tôi tiến gần hơn với Wireshark và sử dụng đồ thị IO một mili giây, chúng tôi thấy chúng tôi sẽ thường xuyên phá vỡ tốc độ 1 Mbit mỗi mili giây của giao diện 1 Gbit / s.


Thú vị, tôi sẽ xem nó. Tôi đã kích hoạt mod numqtimeout và đặt nó thành tiêu đề RequestReadTimeout = 20-40, minrate = 500 và RequestReadTimeout body = 10, minrate = 500 và gần như tất cả thời gian chờ xảy ra lúc 10 giây. Tôi cho rằng điều đó có nghĩa là phần thân yêu cầu mất quá nhiều thời gian (phần thân không bao giờ nên nhiều hơn vài trăm byte) vì vậy một số người dùng của tôi có kết nối xấu hoặc như bạn nói có một số tắc nghẽn ở phía máy chủ của tôi.
Leon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.