Meu uso de memória aumenta com o tempo e reiniciar o Django não é bom para os usuários.
Não tenho certeza de como fazer o perfil do uso da memória, mas algumas dicas sobre como começar a medir seriam úteis.
Sinto que existem alguns passos simples que podem produzir grandes ganhos. Garantir que 'debug' esteja definido como 'False' é um óbvio óbvio.
Alguém pode sugerir outros? Quanta melhoria o cache teria em sites de baixo tráfego?
Nesse caso, estou executando o Apache 2.x com mod_python. Ouvi dizer que mod_wsgi é um pouco mais enxuto, mas seria complicado mudar nesse estágio, a menos que eu saiba que os ganhos seriam significativos.
Edit: Obrigado pelas dicas até agora. Alguma sugestão de como descobrir o que está consumindo a memória? Existem guias para criação de perfil de memória Python?
Além disso, como mencionado, há algumas coisas que tornarão difícil mudar para mod_wsgi, então eu gostaria de ter uma idéia dos ganhos que eu poderia esperar antes de avançar nessa direção.
Edit: Carl postou aqui uma resposta um pouco mais detalhada que vale a pena ler: Django Deployment: Cutting Overhead of Apache
Edit: O artigo de Graham Dumpleton é o melhor que eu encontrei no MPM e no mod_wsgi. Estou um pouco decepcionado que ninguém possa fornecer informações sobre a depuração do uso de memória no próprio aplicativo.
Edição final: Bem, eu tenho discutido isso com o Webfaction para ver se eles poderiam ajudar na recompilação do Apache e esta é a palavra deles sobre o assunto:
"Realmente não acho que você obterá muitos benefícios mudando para uma configuração MPM Worker + mod_wsgi. Estimo que você poderá economizar cerca de 20 MB, mas provavelmente não muito mais que isso."
Assim! Isso me leva de volta à minha pergunta original (sobre a qual ainda não sou o mais sábio). Como se identifica onde estão os problemas? É uma máxima bem conhecida que você não otimiza sem testar para ver onde precisa otimizar, mas há muito pouco no caminho de tutoriais sobre como medir o uso de memória Python e nenhum específico sobre o Django.
Obrigado pela ajuda de todos, mas acho que essa pergunta ainda está aberta!
Outra edição final ;-)
Eu perguntei isso na lista django-users e recebi algumas respostas muito úteis
Honestamente, a última atualização de sempre!
Isso acabou de ser lançado. Pode ser a melhor solução até o momento: criação de perfil do tamanho do objeto Django e uso de memória com o Pympler
fonte
Se você estiver executando o mod_wsgi e provavelmente estiver gerando uma vez que é compatível com WSGI, poderá usar o Dozer para verificar o uso da memória.
Sob mod_wsgi, adicione isso na parte inferior do seu script WSGI:
Em seguida, aponte seu navegador para http: // domain / _dozer / index para ver uma lista de todas as suas alocações de memória.
Também adicionarei minha voz de suporte ao mod_wsgi. Faz muita diferença em termos de desempenho e uso de memória sobre o mod_python. O suporte de Graham Dumpleton ao mod_wsgi é excelente, tanto em termos de desenvolvimento ativo quanto em ajudar as pessoas na lista de discussão a otimizar suas instalações. David Cramer, do curse.com , publicou alguns gráficos (que infelizmente não consigo encontrar agora) mostrando a drástica redução no uso da CPU e da memória depois que eles mudaram para mod_wsgi naquele site de alto tráfego. Vários dos desenvolvedores do django mudaram. Sério, é um acéfalo :)
fonte
Estas são as soluções de perfilador de memória de Python que eu conheço (não relacionadas ao Django):
Validador de memória Python (comercial)Disclaimer: Eu tenho uma participação neste último.
A documentação do projeto individual deve fornecer uma idéia de como usar essas ferramentas para analisar o comportamento da memória dos aplicativos Python.
A seguir, uma boa "história de guerra" que também fornece algumas dicas úteis:
fonte
Além disso, verifique se você não usa nenhum dos vazamentos conhecidos. Sabe-se que o MySQLdb vaza enormes quantidades de memória com o Django devido a erros no manuseio unicode. Fora isso, a Django Debug Toolbar pode ajudá-lo a rastrear os porcos.
fonte
django-debug-toolbar
ajudar?Além de não manter referências globais a objetos de dados grandes, tente evitar carregar grandes conjuntos de dados na memória sempre que possível.
Alterne para mod_wsgi no modo daemon e use o mpm de trabalho do Apache em vez do prefork. Esta última etapa pode permitir que você atenda muito mais usuários simultâneos com muito menos sobrecarga de memória.
fonte
O Webfaction, na verdade, tem algumas dicas para manter baixo o uso de memória do django.
Os principais pontos:
fonte
Outra vantagem do mod_wsgi: defina um
maximum-requests
parâmetro em suaWSGIDaemonProcess
diretiva e o mod_wsgi reiniciará o processo daemon de vez em quando. Não deve haver efeito visível para o usuário, exceto o carregamento lento da página na primeira vez em que um novo processo é atingido, pois ele carregará o Django e o código do aplicativo na memória.Mas mesmo se você faz tem vazamentos de memória, que deve manter o tamanho do processo de ficar muito grande, sem a necessidade de serviço de interrupção para os usuários.
fonte
Aqui está o script que eu uso para o mod_wsgi (chamado wsgi.py e coloquei a raiz do meu projeto do django):
Ajuste myproject.settings e o caminho, conforme necessário. Eu redireciono toda a saída para / dev / null, pois mod_wsgi por padrão impede a impressão. Use o registro.
Para o apache:
Espero que isso ajude pelo menos a configurar o mod_wsgi para que você possa ver se faz alguma diferença.
fonte
Caches: verifique se estão sendo lavados. É fácil para algo pousar em um cache, mas nunca ser GC por causa da referência de cache.
Código swig'd: verifique se o gerenciamento de memória está sendo feito corretamente, é muito fácil perdê-los em python, especialmente com bibliotecas de terceiros
Monitoramento: se possível, obtenha dados sobre o uso da memória e ocorrências. Normalmente, você verá uma correlação entre um determinado tipo de solicitação e o uso de memória.
fonte
Nos deparamos com um bug no Django com grandes sitemaps (10.000 itens). Parece que o Django está tentando carregar todos eles na memória ao gerar o mapa do site: http://code.djangoproject.com/ticket/11572 - efetivamente mata o processo apache quando o Google faz uma visita ao site.
fonte