2009-01-28 26 views
9

Tôi có một máy chủ VPS nhỏ có đầu trước Nginx phục vụ các tệp phương tiện tĩnh và chuyển yêu cầu Django trở lại máy chủ MPM Apache 2.2 chạy mod_wsgi.Triển khai Django: Cắt chi phí của Apache

Với một (rất) trang web nhỏ được tải và hoạt động, hiện tại nó đang sử dụng 143MB RAM 256MB.

Sử dụng lệnh top Tôi có thể thấy rằng Apache đang sử dụng 52,9% RAM có sẵn, với memcache trong giây sử dụng 2,1%.

Xét rằng tôi đang lên kế hoạch đặt một số dự án Django trên máy chủ này, tôi tự hỏi liệu có bất kỳ điều gì tôi có thể làm để cắt giảm lượng RAM mà Apache đang sử dụng không?

Trả lời

8

Nếu bạn muốn gắn bó với Apache, một vài gợi ý, khoảng theo thứ tự khó khăn:

  • sử dụng người lao động MPM Apache thay vì prefork. Bộ nhớ thực được sử dụng cho mỗi kết nối máy khách sẽ thấp hơn, nhưng lưu ý rằng bộ nhớ ảo được cấp phát cho Apache trên Linux có thể xuất hiện rất cao, do 8MB Linux phân bổ cho mỗi ngăn xếp của luồng. Điều này không thực sự quan trọng, trừ khi VPS của bạn là bộ não chết và mũ ảo bộ nhớ chứ không phải là thực tế RSS (cư trú thiết lập kích thước) bộ nhớ. Trong trường hợp đó, bạn có thể tìm hiểu cách giảm kích thước ngăn xếp luồng here (trong phần VPS bị hạn chế về bộ nhớ).
  • chỉnh sửa tệp cấu hình Apache của bạn và giảm cài đặt StartServers, MaxClients, MinSpareThreads và MaxSpareThreads tương ứng. Các cấp độ thích hợp sẽ là sự cân bằng giữa mức sử dụng bộ nhớ bạn muốn và số lượng khách hàng đồng thời bạn cần để có thể phân phối.
  • chuyển sang mod_wsgi (ở chế độ daemon) thay vì mod_python.
+0

Cảm ơn bạn đã trả lời. Tôi hiện đang sử dụng MPM và mod_wsgi. Bạn có biết nơi nào có hướng dẫn tốt để cấu hình Apache về các thiết lập StartServers, MaxClients, MinSpareThreads và MaxSpareThreads không? Chúng hiện được đặt ở giá trị mặc định. –

+0

Không có một hướng dẫn tốt off-hand, nhưng chỉ cần nhìn lên những chỉ thị trong các tài liệu Apache, chúng khá hợp lý. Thông thường tôi chỉ cần quy mô chúng xuống từ các giá trị mặc định theo tỷ lệ, chủ yếu dựa trên thiết lập MaxClients với số lượng kết nối đồng thời mà tôi nghĩ rằng tôi sẽ cần phải phục vụ. –

3

Bạn có thể xem xét sử dụng Spawning để triển khai.

+0

Có vẻ thú vị. Mặc dù tôi có một câu hỏi: bạn sẽ phải chạy lệnh sinh sản cho mọi trang web một lần nữa, nếu máy chủ đã khởi động lại chưa? –

+0

@Ty: Tôi nghĩ bạn nên đặt sinh sản trong một init script, trong cùng một vị trí apache bây giờ. – nosklo

+0

Tôi đã thử chuyển đổi một ứng dụng Django từ Apache + mod_wsgi sang Spawning trên lưu trữ được chia sẻ của tôi tại Webfaction.Có lẽ tôi đã định cấu hình sai Spawning hoặc giải thích sai các kết quả, nhưng có vẻ như Spawning đã sử dụng nhiều bộ nhớ hơn Apache trên cùng một ứng dụng. – Headcrab

2

bạn có thể chạy Django trên FastCGI. nginx sau đó có thể lái nó trực tiếp thay vì đi qua Apache.

6

Để ghi lại, việc sử dụng thuật ngữ MPM của OP không mang tính nhạy cảm. MPM trong Apache không phải là một tùy chọn, bạn luôn sử dụng MPM khi sử dụng Apache. Sự lựa chọn là MPM bạn đang sử dụng. Trên UNIX, hai MPM chính hoặc Mô-đun đa xử lý, là prefork và worker. Trên Windows, MPM chiến thắng luôn được sử dụng. Thông tin chi tiết về các MPM khác nhau có thể được tìm thấy trong tài liệu Apache trên trang web Apache. Trong bối cảnh mod_wsgi tuy nhiên, bạn có thể được tốt hơn off đọc:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

Tóm lại mặc dù:

  • prefork MPM là đa quá trình/đơn ren.
  • công nhân MPM là đa quy trình/đa luồng.
  • MPM thắng trong một quy trình/đa luồng.
+0

Qustion của tôi đã được cập nhật với loại MPM mà tôi đang sử dụng vào thời điểm đó. –

Các vấn đề liên quan