Reducing Django Memory Usage. Low hanging fruit?
Solution 1:
Make sure you are not keeping global references to data. That prevents the python garbage collector from releasing the memory.
Don't use mod_python
. It loads an interpreter inside apache. If you need to use apache, use mod_wsgi
instead. It is not tricky to switch. It is very easy. mod_wsgi
is way easier to configure for django than brain-dead mod_python
.
If you can remove apache from your requirements, that would be even better to your memory. spawning
seems to be the new fast scalable way to run python web applications.
EDIT: I don't see how switching to mod_wsgi could be "tricky". It should be a very easy task. Please elaborate on the problem you are having with the switch.
Solution 2:
If you are running under mod_wsgi, and presumably spawning since it is WSGI compliant, you can use Dozer to look at your memory usage.
Under mod_wsgi just add this at the bottom of your WSGI script:
from dozer import Dozer
application = Dozer(application)
Then point your browser at http://domain/_dozer/index to see a list of all your memory allocations.
I'll also just add my voice of support for mod_wsgi. It makes a world of difference in terms of performance and memory usage over mod_python. Graham Dumpleton's support for mod_wsgi is outstanding, both in terms of active development and in helping people on the mailing list to optimize their installations. David Cramer at curse.com has posted some charts (which I can't seem to find now unfortunately) showing the drastic reduction in cpu and memory usage after they switched to mod_wsgi on that high traffic site. Several of the django devs have switched. Seriously, it's a no-brainer :)