Tôi có một tập lệnh đa luồng nhỏ chạy trong django và theo thời gian bắt đầu sử dụng bộ nhớ ngày càng nhiều. Để nó cả ngày ăn khoảng 6GB RAM và tôi bắt đầu trao đổi.Python: Gỡ lỗi rò bộ nhớ
Sau http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks Tôi coi đây là loại phổ biến nhất (với chỉ 800M bộ nhớ được sử dụng):
(Pdb) objgraph.show_most_common_types(limit=20)
dict 43065
tuple 28274
function 7335
list 6157
NavigableString 3479
instance 2454
cell 1256
weakref 974
wrapper_descriptor 836
builtin_function_or_method 766
type 742
getset_descriptor 562
module 423
method_descriptor 373
classobj 256
instancemethod 255
member_descriptor 218
property 185
Comment 183
__proxy__ 155
mà không hiển thị bất cứ điều gì lạ. Tôi nên làm gì bây giờ để giúp gỡ lỗi các vấn đề bộ nhớ?
Cập nhật: Thử một số thứ mà mọi người đang đề xuất. Tôi chạy chương trình qua đêm, và khi tôi làm việc, 50% * 8G == 4G RAM được sử dụng.
(Pdb) from pympler import muppy
(Pdb) muppy.print_summary()
types | # objects | total size
========================================== | =========== | ============
unicode | 210997 | 97.64 MB
list | 1547 | 88.29 MB
dict | 41630 | 13.21 MB
set | 50 | 8.02 MB
str | 109360 | 7.11 MB
tuple | 27898 | 2.29 MB
code | 6907 | 1.16 MB
type | 760 | 653.12 KB
weakref | 1014 | 87.14 KB
int | 3552 | 83.25 KB
function (__wrapper__) | 702 | 82.27 KB
wrapper_descriptor | 998 | 77.97 KB
cell | 1357 | 74.21 KB
<class 'pympler.asizeof.asizeof._Claskey | 1113 | 69.56 KB
function (__init__) | 574 | 67.27 KB
Điều đó không tính đến 4G và cũng không cung cấp cho tôi bất kỳ dữ liệu lớn nào được cấu trúc để khắc phục. Các unicode là từ một tập hợp() của "thực hiện" các nút, và danh sách của trông giống như chỉ ngẫu nhiên weakref
s.
Tôi đã không sử dụng guppy vì nó yêu cầu phần mở rộng C và tôi không có gốc nên sẽ rất khó xây dựng.
Không có đối tượng nào tôi đang sử dụng có phương thức __del__
và nhìn qua các thư viện, nó không giống như django hay python-mysqldb. Bất kỳ ý tưởng nào khác?
"đang chạy ở Django"? Bạn có nghĩa là bạn đang sử dụng máy chủ web Django để thực hiện xử lý nền không dịch vụ web bổ sung? Bạn có cân nhắc việc chia nhỏ nội dung không phân phát web này thành một quy trình riêng biệt không? –
Đó là một công việc cron nhập khẩu settango.py Django và sử dụng nhiều tính năng ORM Django. Vì vậy, nó không phải là sinh ra bởi một máy chủ web, nhưng vẫn sử dụng nhiều tính năng (có thể đã được thích hợp) –