2013-10-22 16 views
5

Tôi có Apache + mod_wsgi + Django ứng dụng. mod_wsgi chạy ở chế độ daemon.Tại sao Python không giải phóng bộ nhớ (dưới mod_wsgi + Django)

Tôi có một chế độ xem tìm nạp tập hợp truy vấn quan trọng từ DB và phân bổ bổ sung mảng bằng cách tính toán kết quả của bộ truy vấn và sau đó trả về mảng này. Tôi không sử dụng lưu trữ cục bộ luồng, biến toàn cầu hoặc bất kỳ thứ gì giống nhau.

Vấn đề là rằng ứng dụng của tôi ăn bộ nhớ tương đối với số đề tôi đặt cho mod_wsgi.

Tôi đã thực hiện thử nghiệm nhỏ bằng cách đặt số lượng chủ đề khác nhau trong mod_wsgi và sau đó nhấn vào chế độ xem của tôi bằng cách kiểm tra cách quá trình wsgi có thể tăng tốc bộ nhớ.

Nó đi như thế này:

 
1 thread - 256Mb 
2 threads - 400Mb 
3 threads - 535Mb 
4 threads - 650Mb 

Vì vậy, mỗi thread thêm khoảng 120-140Mb để sử dụng bộ nhớ hàng đầu.

Tôi có vẻ như bộ nhớ ban đầu được phân bổ cho yêu cầu đầu tiên không bao giờ được giải phóng. Trong kịch bản một luồng, nó được tái sử dụng khi yêu cầu thứ hai (đến cùng một khung nhìn) được gửi đến. Với điều đó tôi có thể rời đi.

Nhưng khi tôi sử dụng nhiều luồng, khi yêu cầu được xử lý bởi chuỗi không bao giờ chạy yêu cầu này trước đó, chuỗi này "lưu" 140MB khác ở đâu đó cục bộ.

  • Làm cách nào để khắc phục sự cố này?
  • Có lẽ Django lưu một số dữ liệu trong TSL. Nếu đó là trường hợp, làm thế nào tôi có thể vô hiệu hóa nó?
  • Ngoài ra, để giải quyết sự cố, có phải là có thể ràng buộc yêu cầu thực hiện cho một chuỗi nhất định trong mod_wsgi không?

Cảm ơn.

PS. DEBUG được đặt thành False trong settings.py

+0

Bạn có a) chỉ tạo mảng khi tập dữ liệu đến và b) xóa nó khi bạn đã hoàn thành nó để bộ thu gom rác có thể truy cập vào nó? –

+0

a) - có; b) - Tôi không xóa nó một cách rõ ràng. Tôi chuyển nó thành JSON và trả về chuỗi JSON. –

+0

Nếu bạn không xóa nó thì nó vẫn đang được sử dụng! –

Trả lời

8

Trong trường hợp này, những gì bạn cần làm là phân vùng theo chiều dọc ứng dụng web của bạn để nó chạy trên nhiều nhóm quy trình daemon mod_wsgi. Bằng cách đó bạn có thể điều chỉnh cấu hình của các quy trình daemon mod_wsgi theo yêu cầu của các tập hợp con của các URL mà bạn ủy nhiệm cho mỗi. Do URLs giao diện quản trị của một ứng dụng Django thường có những yêu cầu sử dụng bộ nhớ thoáng qua cao, nhưng không được sử dụng rất thường xuyên, nó có thể được khuyến khích để làm:

WSGIScriptAlias//my/path/site/wsgi.py 
WSGIApplicationGroup %{GLOBAL} 

WSGIDaemonProcess main processes=3 threads=5 
WSGIProcessGroup main 

WSGIDaemonProcess admin threads=2 inactivity-timeout=60 
<Location /admin> 
WSGIProcessGroup admin 
</Location> 

Vì vậy, điều này không là tạo hai nhóm quy trình daemon. Theo mặc định, URL sẽ được xử lý trong nhóm quá trình daemon chính, nơi các quá trình liên tục. Tuy nhiên, đối với các URL cho giao diện quản trị, chúng sẽ được chuyển hướng đến nhóm xử lý daemon quản trị, có thể được thiết lập với một quy trình đơn lẻ với số lượng chuỗi giảm, cộng với thời gian chờ không hoạt động để quá trình này sẽ được khởi động lại tự động nếu giao diện quản trị không được sử dụng sau 60 giây, do đó khai hoang bất kỳ việc sử dụng bộ nhớ tạm thời quá mức nào.

Điều này có nghĩa là việc gửi yêu cầu tới giao diện quản trị có thể bị chậm lại một chút nếu các quá trình đã được tái chế kể từ lần cuối cùng, vì mọi thứ phải được tải lại, nhưng đó là giao diện quản trị chứ không phải URL công khai , điều này thường được chấp nhận.

+0

Cảm ơn bạn đã tiếp cận. Nó phải bản địa hoá vấn đề. Tuy nhiên tôi vẫn quan tâm lý do tại sao Django không phát hành các đối tượng lấy. Nhưng tôi sẽ hỏi trong một câu hỏi riêng –

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