Tôi nên chỉ định bao nhiêu quy trình trong WSGIDaemonProcess trong khi chạy Django thông qua mod_wsgi?


23

Giả sử tôi có 2 trang web (Superuser và Serverfault) chạy từ máy chủ ảo Apache của riêng họ trên một hộp. Hai trang web được cung cấp bởi Django và đang chạy trên Apache với mod-wsgi. Một tệp cấu hình điển hình cho một trong các trang web sẽ trông như sau:

WSGIDaemonProcess serverfault.com user=www-data group=www-data processes=5

Máy chủ lưu trữ là một máy linux với 4GB RAM chạy Ubuntu. Bất cứ ai cũng có thể đề xuất số lượng quy trình tôi nên chỉ định ở trên cho 2 trang web của tôi? Giả sử họ có cùng lưu lượng truy cập với các trang web Superuser và Serverfault thực tế.

Câu trả lời:


22

Vâng, có bao nhiêu giao thông làm các Superuser và Serverfault trang web thực tế có? Giả thuyết không được sử dụng nhiều nếu họ không có đủ thông tin để làm cho câu trả lời dễ dàng hơn ...

Số lượng quy trình trong trường hợp xấu nhất của bạn phải là số lượng yêu cầu cao nhất trong một giây mà bạn muốn trang web có thể xử lý, chia cho số lượng yêu cầu mỗi giây mà một quy trình có thể xử lý nếu tất cả các yêu cầu đó được thực hiện cho hành động chậm nhất của bạn (vì vậy đối ứng của thời gian xử lý của hành động đó). Thêm bất kỳ yếu tố sai lệch nào bạn nghĩ là phù hợp, dựa trên khoảng tin cậy của các phép đo req / giây và thời gian của bạn.

Số lượng trường hợp trung bình là như nhau, nhưng bạn chia req / giây cho giá trị trung bình của các yêu cầu của bạn cho mỗi con số cho mỗi hành động (trọng số là tỷ lệ phần trăm của các yêu cầu bạn mong muốn thực hiện hành động cụ thể đó). Một lần nữa, các yếu tố fudge là hữu ích.

Giới hạn trên thực tế của số lượng quy trình bạn có thể chạy trên máy được quyết định bởi số lượng bộ nhớ trên mà mỗi quy trình thực hiện; tạo ra một quy trình, sau đó chạy nhiều hành động ngốn bộ nhớ (thường lấy và xử lý nhiều dữ liệu) với bộ dữ liệu thực tế (nếu bạn chỉ sử dụng bộ dữ liệu đồ chơi để kiểm tra, giả sử 50 hoặc 100 sau đó, nếu một trong những hành động của bạn truy xuất và thao tác mọi hàng trong bảng thì đó sẽ không phải là phép đo tốt khi bảng đó tăng lên 10.000 hàng) để xem bóng bay sử dụng bộ nhớ để làm gì. Bạn có thể hạn chế một cách giả tạo việc sử dụng bộ nhớ theo quy trình của mình bằng một tập lệnh gặt hái các nhân viên đạt đến ngưỡng sử dụng bộ nhớ nhất định, có nguy cơ gây ra các vấn đề khó chịu nếu bạn đặt ngưỡng đó quá thấp.

Khi bạn đã có con số sử dụng bộ nhớ, bạn khấu trừ một lượng bộ nhớ cho chi phí hệ thống (bản thân tôi thích 512MB), khấu trừ thêm một đống nếu bạn có các quy trình khác chạy trên cùng một máy (như cơ sở dữ liệu), sau đó một số chi tiết khác để đảm bảo bạn không dùng hết dung lượng bộ nhớ cache của đĩa (tùy thuộc vào kích thước bộ đĩa làm việc của bạn, nhưng một lần nữa tôi sẽ sử dụng không dưới 512MB). Đó là dung lượng bộ nhớ mà bạn chia cho mức sử dụng bộ nhớ theo quy trình để có được mức trần.

Nếu số lượng quy trình bạn cần để phục vụ tải tối đa của bạn lớn hơn số lượng quy trình bạn có thể đặt trên hộp, bạn cần nhiều máy hơn (hoặc để di chuyển cơ sở dữ liệu sang máy khác, trong trường hợp đơn giản nhất).

Có bạn, một vài năm kinh nghiệm mở rộng các trang web được chắt lọc thành một bài SF nhỏ và đơn giản.


Một yếu tố quan trọng khác đối với số lượng quy trình / luồng là thời gian xử lý các yêu cầu riêng lẻ và thời gian trải rộng trên tất cả các khoảng thời gian có thể được thực hiện. Nói cách khác, cần xử lý bao nhiêu yêu cầu tại một thời điểm, mất nhiều thời gian hơn thời gian phản hồi trung bình. Vì vậy, nó không đơn giản chỉ là các yêu cầu lý thuyết / giây vì tác động của các yêu cầu chạy dài hơn đó có thể là đáng kể và quá mức cho các tham số cấu hình tổng thể. FWIW mod_wsgi 3.0 sẽ bao gồm một số bộ sưu tập thống kê được tích hợp để thử và thu thập dữ liệu về điều này để hỗ trợ cấu hình.
Graham Dumpleton

@Graham: Đọc lại câu trả lời của tôi, tôi đã đề cập đến nó một cách chi tiết. Yêu cầu / giây chỉ là đối ứng của thời gian phản hồi và việc chia cho một số nguyên req / giây dễ dàng hơn so với nhân số thập phân.
womble

Mặc dù bạn không thể chỉ tập trung vào phản ứng trong trường hợp xấu nhất, cũng không chỉ là mức trung bình cho vấn đề đó. Nó cần phải được tính trọng số theo các cách dựa trên tỷ lệ phần trăm của các yêu cầu rơi vào các khoảng thời gian, nghĩa là, sự lan truyền trong tất cả các thời gian có thể được thực hiện. Nếu bạn thực sự mất thời gian phản hồi trường hợp xấu nhất của bạn thì bạn sẽ đưa ra những yêu cầu không thực tế. Vấn đề thực sự rất khó để biết nên sử dụng công thức nào. Đây là lý do tại sao trong mod_wsgi 3.0 sẽ có các tập hợp thống kê sẵn có, xem xét việc sử dụng luồng và bao nhiêu phần trăm theo số lượng và thời gian mà bất kỳ số lượng luồng nào được sử dụng tại một thời điểm.
Graham Dumpleton

3
Vấn đề có lẽ là bạn đang xem xét các quy trình chỉ khi tôi lo lắng về cách các luồng mà mỗi quy trình sử dụng yếu tố trong đó và điều đó không đơn giản. Nói cách khác, chỉ thị WSGIDaemonProcess chỉ ra 5 quy trình trong đó mỗi quy trình theo mặc định sử dụng 15 luồng. Nhiều như tôi đã đọc trong mô tả của bạn, nó giả sử các quy trình đơn luồng. Nếu không, hãy chỉ cho tôi cách mô hình của bạn phục vụ cho các luồng cộng với các vấn đề tranh chấp / mở rộng xung quanh GIL. Vì vậy, đủ điều kiện rằng mô tả của bạn chỉ hợp lệ cho các quy trình đơn luồng và tôi sẽ không tranh luận.
Graham Dumpleton

2
Không phải cách tiếp cận "đa luồng-Apache + đa xử lý-wsgi" là cách tốt nhất cho đến khi bạn chắc chắn 99% rằng mã Python của bạn và tất cả các phụ thuộc đều an toàn theo luồng?
Tomasz Zieliński

9

Câu trả lời của womble là tuyệt vời, mặc dù hơi khó hiểu và áp dụng cho những người chưa có kinh nghiệm. Tôi muốn đưa ra một số con số thực nghiệm và so sánh ứng dụng "nội dung đơn giản" so với "thương mại điện tử".

Không có nhiều tài liệu xung quanh việc thiết lập các trường hợp sử dụng khác nhau liên quan đến cấu hình mod_wsgi phù hợp của họ, vì vậy tôi hy vọng có thể sử dụng một chút văn xuôi ở đây.

A) Trang web & microsites CMS

Chúng tôi điều hành một số trang web của khách hàng, hầu hết trong số họ chủ yếu là các trang nội dung hoặc các trang web siêu nhỏ lưu trữ django CMS, một số biểu mẫu tùy chỉnh và đôi khi là Celery cho các tác vụ nền theo lịch trình. Các trang web này không đói tài nguyên, một số trong số chúng chạy song song trên một Intel Xeon 4 lõi với RAM 32 GB. Đây là cấu hình chúng tôi sử dụng cho từng loại trang web này:

WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100

Tôi đang nói về khoảng 40 trang web trên một máy chủ, hầu hết trong số đó có trang Staging của họ đang chạy ở chế độ chờ. Với 2 quy trình (theo mặc định có 15 luồng), các trang web khá giả, mặc dù bị hạn chế về khả năng phân bổ tài nguyên máy chủ. Tại sao thiết lập này là đủ có thể được biện minh với tính chất đơn giản của ứng dụng (CMS): Không có yêu cầu nào được mong đợi sẽ mất nhiều hơn một vài mili giây để hoàn thành. Apache sẽ luôn luôn thư giãn và do đó sẽ là tải CPU.

B) Trang web thương mại điện tử

Các trang web phức tạp hơn chúng tôi thực hiện được đặc trưng bởi các hoạt động địa phương không tính toán nhưng phụ thuộc bên ngoài (ví dụ: dịch vụ web cung cấp dữ liệu đặt phòng) rất tốn kém về thời gian giao dịch. Các hoạt động với các yêu cầu bên ngoài chiếm các luồng trong thời gian lâu hơn nhiều, vì vậy bạn cần nhiều luồng hơn để phục vụ cùng số lượng người dùng (so với một trang web CMS đơn giản ở trên). Thậm chí tệ hơn, các luồng đôi khi bị chặn khi một dịch vụ bên ngoài không thể trả lời yêu cầu ngay lập tức, đôi khi trong vài giây. Điều này có thể dẫn đến hiệu ứng phụ khó chịu khi các luồng đặt yêu cầu vào cùng một dịch vụ xếp hàng, cho đến khi tất cả các luồng mod_wsgi có sẵn được sử dụng hết và bị chờ chờ.

Đối với những kịch bản đó, chúng tôi đã cố gắng sử dụng 6các quy trình mà không thấy nhiều sự khác biệt và cuối cùng chúng tôi đã 12thấy sự gia tăng không thể so sánh về hiệu suất và sự ổn định trong vận hành:

WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100

Một số thử nghiệm tải đơn giản với 150 và 250 người dùng song song có thể dễ dàng xử lý bởi trang web vẫn đáp ứng tốt (trong khi với 2các quy trình, trang web không thể sử dụng song song phục vụ 50 người dùng). Intel Xeon 2 CPU 6 nhân với RAM 32 GB chạy tốt dưới 25% mức sử dụng CPU trong tải đó, mức sử dụng RAM gần như không đổi ở mức dưới 25%. Lưu ý rằng chúng tôi sử dụng một máy chuyên dụng chỉ cho một trang web duy nhất ở đây, vì vậy chúng tôi sẽ không lấy cắp tài nguyên mà các trang web khác có thể cần.

Phần kết luận

Sử dụng số lượng quy trình cao hơn là một sự đánh đổi giữa việc cho phép Apache sử dụng các tài nguyên hệ thống có sẵn hay không. Nếu bạn muốn giữ một hệ thống máy chủ ổn định (không phải trang web!) Trong điều kiện "tấn công", hãy giữ số lượng thấp. Nếu bạn muốn Apache giúp bạn sử dụng tài nguyên hệ thống (CPU, RAM) khi cần, hãy chọn số cao hơn. Làm thế nào cao bạn có thể đi tính toán phần nào như được nêu trong câu trả lời được chấp nhận ở trên, và cuối cùng bị hạn chế bởi sức mạnh CPU và RAM có sẵn.

(PS: Tôi giữ ConfigurationDirectives phần của wiki dự án modwsgi dưới gối của tôi cho Apache giống như đọc nền Ngoài ra hãy chắc chắn để hiểu và theo dõi của bạn. Kết nối mở máy chủ Apache .)


Bài đăng tuyệt vời, nhưng tại sao bạn không thiết lập số lượng chủ đề? Vì GIL của Python phủ nhận rất nhiều lợi thế của các luồng, tôi cho rằng bạn muốn có nhiều tiến trình hơn các luồng, nhưng có bất kỳ lợi thế nào để chỉ định số lượng luồng không?
Cerin

Số lượng mặc định threadslà 15 theo tài liệu . Tôi không nghĩ có một lợi thế để xác định rõ ràng điều đó. Trên thực tế, tôi nhớ rằng đã bỏ nó đi vì một lý do: Có một số bài đăng trên SO hoặc một phần của một số tài liệu được khuyến nghị bỏ qua giá trị để tránh tác dụng phụ (tôi biết, nghe có vẻ lạ). Thật không may, bây giờ tôi không tìm thấy nguồn đó. Đối với phần còn lại của câu hỏi của bạn (GIL) có lẽ bạn là chuyên gia nhiều hơn tôi, xin lỗi.
Peterino

Cảm ơn bạn cho cấu hình thực nghiệm này. Tuy nhiên, hãy nhớ rằng theo bài đăng này You should never use maximum-requests in a production system unless you understand the implications and have a specific temporary need.
raratiru 17/03/18
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.