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
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ó? –
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. –
Nếu bạn không xóa nó thì nó vẫn đang được sử dụng! –