장고 메모리 사용량 감소. 낮게 매달린 과일?


136

시간이 지남에 따라 메모리 사용량이 증가하고 Django를 다시 시작하는 것은 사용자에게 친절하지 않습니다.

메모리 사용량을 프로파일 링하는 방법을 잘 모르겠지만 측정을 시작하는 방법에 대한 팁이 유용합니다.

큰 이득을 얻을 수있는 몇 가지 간단한 단계가 있다고 생각합니다. 'debug'가 'False'로 설정되어 있는지 확인하는 것은 분명 큰 문제입니다.

누구든지 다른 사람을 제안 할 수 있습니까? 트래픽이 적은 사이트에서 캐싱을 어느 정도 개선 할 수 있습니까?

이 경우 mod_python을 사용하여 Apache 2.x에서 실행 중입니다. 나는 mod_wsgi가 조금 더 낫다고 들었지만 이득이 중요하다는 것을 알지 못하면이 단계에서 전환하는 것이 까다로울 것입니다.

편집 : 지금까지 팁 주셔서 감사합니다. 메모리 사용량을 발견하는 방법에 대한 제안이 있으십니까? 파이썬 메모리 프로파일 링에 대한 가이드가 있습니까?

또한 언급했듯이 mod_wsgi로 전환하기가 까다로울 수있는 몇 가지 사항이 있으므로 그 방향으로 나아 가기 전에 기대할 수있는 이익에 대해 알고 싶습니다.

편집 : Carl은 읽을 가치가있는 약간 더 자세한 답변을 여기에 게시했습니다 .Django 배포 : Apache의 오버 헤드 절단

편집 : Graham Dumpleton의 기사 는 MPM 및 mod_wsgi 관련 항목에서 찾은 최고입니다. 오히려 아무도 앱 자체의 메모리 사용 디버깅에 대한 정보를 제공 할 수 없다는 것에 실망했습니다.

최종 편집 : 글쎄, Webfaction과 함께 아파치 재 컴파일을 도울 수 있는지 알아보기 위해이 문제를 논의했습니다.

"MPM Worker + mod_wsgi 설정으로 전환하면 많은 이점을 얻을 것이라고 생각하지 않습니다. 약 20MB를 절약 할 수있을 것으로 예상되지만 그 이상은 아닙니다."

그래서! 이것은 원래의 질문으로 돌아갑니다 (나는 여전히 더 현명한 사람이 아닙니다). 문제가 어디에 있는지 식별하는 방법은 무엇입니까? 테스트하지 않고 최적화 해야하는 곳을 확인하기 위해 최적화하지 않지만 파이썬 메모리 사용량을 측정하는 자습서는 거의 없으며 장고에만 적용되는 것은 거의 없습니다.

모두의 도움에 감사하지만이 질문은 아직 열려 있다고 생각합니다!

또 다른 최종 편집 ;-)

나는 django-users 목록에서 이것을 물었고 매우 유용한 답글을 얻었습니다.

솔직히 마지막 업데이트!

이것은 방금 릴리스되었습니다. 아직 최고의 솔루션이 될 수 : Pympler 프로파일 링 장고 개체의 크기와 메모리 사용

답변:


50

데이터에 대한 전역 참조를 유지하지 않아야합니다. 이것은 파이썬 가비지 수집기가 메모리를 해제하지 못하게합니다.

를 사용하지 마십시오 mod_python. 아파치 내부에 인터프리터를로드합니다. 아파치를 사용해야 할 경우 mod_wsgi대신 사용하십시오. 전환하기 까다 롭지 않습니다. 많이 쉽다. djangomod_wsgi구성하는 것이 brain-dead보다 쉽습니다 mod_python.

요구 사항에서 아파치를 제거 할 수 있다면 메모리에 훨씬 좋습니다. spawning파이썬 웹 응용 프로그램을 실행하는 새로운 빠른 확장 가능한 방법 인 것 같습니다.

편집 : mod_wsgi로 전환하는 것이 얼마나 까다로운 지 알 수 없습니다 . 매우 쉬운 작업이어야합니다. 스위치 관련 문제에 대해 자세히 설명하십시오.


4
@ 조쉬 : 아파치 전용 기능을 사용하지 않는다면 아파치의 팽창과 메모리 사용량은 어리 석다. 불필요한 층입니다.
nosklo

3
Django는 여전히 mod_wsgi가 상당히 새롭기 때문에 mod_python을지지하며 보수적이기를 원합니다. 그러나 Django 커뮤니티를 따르면 사람들이 mod_wsgi로 일괄 전환하는 것을 볼 수 있습니다. 권장 옵션이되기까지 오래 걸리지 않습니다.
Carl Meyer

1
@Tiago : 아파치와 함께 SSL을 사용하여 이미 많은 아파치 가상 호스트가있는 경우 아파치가 좋습니다.이 경우에는 mod_wsgi를 사용하십시오. 새로 시작하면 스폰을 사용하십시오. 절대 mod_python을 사용하지 마십시오.
nosklo

1
고마워, nosklo 스폰을 살펴보고 있습니다. 문서가 거의없는 것 같습니다. 블로그 게시물에서 찾은 몇 가지 지침을 따르고 얻을 수있는 곳을 찾아 볼 것입니다.
Tiago

1
흠, 누군가 장고를 사용하기 시작하면서 mod_wsgi를 사용해야한다는 것을 명심하겠습니다.
Powerlord

28

mod_wsgi에서 실행 중이고 WSGI와 호환되므로 아마도 생성되는 경우 Dozer 를 사용하여 메모리 사용량을 확인할 수 있습니다 .

mod_wsgi 아래에서 WSGI 스크립트의 맨 아래에 이것을 추가하십시오.

from dozer import Dozer
application = Dozer(application)

그런 다음 http : // domain / _dozer / index 에서 브라우저를 가리키면 모든 메모리 할당 목록이 표시됩니다.

또한 mod_wsgi에 대한 지원 목소리를 추가하겠습니다. mod_python에 비해 성능과 메모리 사용면에서 차이가 있습니다. Graham Dumpleton의 mod_wsgi에 대한 지원은 활발한 개발 및 메일 링리스트에있는 사람들이 설치를 최적화 할 수 있도록 도와줍니다. curse.com의 David Cramer는 트래픽이 많은 사이트에서 mod_wsgi로 전환 한 후 CPU 및 메모리 사용량의 급격한 감소를 보여주는 몇 가지 차트를 게시했습니다 (안타깝게도 지금은 찾을 수없는 것 같습니다). 장고 개발자 중 일부가 전환했습니다. 진심으로, 그것은 쉬운 일이 아닙니다 :)


어떤 경우에는 내가 곧 하나의 정적 파일에 액세스 장고 사용자를위한 쿠키 기반 인증을 취득하는 방법을 묻는 질문을 게시 할 것입니다 ...
앤디 베이커

15

다음은 내가 알고있는 Python 메모리 프로파일 러 솔루션입니다 (Django와 관련이 없음).

면책 조항 : 나는 후자에 지분이 있습니다.

개별 프로젝트 문서는 이러한 도구를 사용하여 Python 응용 프로그램의 메모리 동작을 분석하는 방법에 대한 아이디어를 제공해야합니다.

다음은 유용한 "전쟁 이야기"로 유용한 정보를 제공합니다.


5

또한 알려진 누출 장치를 사용하지 않는지 확인하십시오. MySQLdb는 유니 코드 처리의 버그로 인해 Django에서 엄청난 양의 메모리를 유출하는 것으로 알려져 있습니다. 그 외에 Django Debug Toolbar 는 호그를 추적하는 데 도움이 될 수 있습니다.


amix.dk/blog/viewEntry/19420 은 MySQLdb가 메모리 누수를 나타내는 데 사용되는 도저를 보여줍니다. MySQLdb 1.2.3c1 이상에서이 문제를 해결했습니다.
msanders 2016 년

어떻게 django-debug-toolbar도울 수 있습니까?
Wtower

4

큰 데이터 개체에 대한 전역 참조를 유지하지 않고 가능한 한 큰 데이터 집합을 메모리에로드하지 마십시오.

데몬 모드에서 mod_wsgi로 전환하고 prefork 대신 Apache의 worker mpm을 사용하십시오. 후자의 단계를 통해 훨씬 적은 메모리 오버 헤드로 더 많은 동시 사용자에게 서비스를 제공 할 수 있습니다.


또한 Carl의 답변을 참조하십시오 : stackoverflow.com/questions/488864/…
Andy Baker

또한-몇 개의 게시물에서 읽은 내용은 mod_wsgi를 사용하는 대신 실제 MPM으로 전환하는 것 같습니다.
Andy Baker

4

Webfaction에는 실제로 django 메모리 사용을 줄이는 이 있습니다.

주요 포인트 :

  • 디버그가 false로 설정되어 있는지 확인하십시오 (이미 알고 있음).
  • 아파치 설정에서 "ServerLimit"사용
  • 큰 객체가 메모리에로드되지 않았는지 확인
  • 별도의 프로세스 또는 서버에서 정적 컨텐츠를 제공하십시오.
  • 아파치 설정에서 "MaxRequestsPerChild"사용
  • 사용중인 메모리 양을 확인하고 이해하십시오

2
고마워, 나는 그것들을 이미 읽었다. 3과 6입니다. 좀 더 자세하게 기대하고있었습니다! ;-)
Andy Baker

3

mod_wsgi의 또 다른 장점 : 지시문에 maximum-requests매개 변수를 설정하면 WSGIDaemonProcessmod_wsgi가 너무 자주 데몬 프로세스를 다시 시작합니다. Django와 응용 프로그램 코드를 메모리에로드 할 때 새로운 프로세스가 처음 시작될 때 느린 페이지로드 이외에 사용자에게 눈에 띄는 효과가 없어야합니다.

하지만이 경우에도 사용자에게 인터럽트 서비스하지 않고, 너무 큰지고에서 프로세스 크기를 유지해야 메모리 누수를 보유하고 있습니다.


1
mail-archive.com/django-users@googlegroups.com/msg84698.html 비슷한 내용이 여기에 언급되어 있습니다. 최대 요청 대신 비활성 시간 초과를 사용했습니다.
Tomas Andrle

3

다음은 mod_wsgi에 사용하는 스크립트입니다 (wsgi.py라고하며 django 프로젝트의 루트에 넣습니다).

import os
import sys
import django.core.handlers.wsgi

from os import path

sys.stdout = open('/dev/null', 'a+')
sys.stderr = open('/dev/null', 'a+')

sys.path.append(path.join(path.dirname(__file__), '..'))

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
application = django.core.handlers.wsgi.WSGIHandler()

필요에 따라 myproject.settings 및 경로를 조정하십시오. mod_wsgi는 기본적으로 인쇄를 금지하므로 모든 출력을 / dev / null로 리디렉션합니다. 대신 로깅을 사용하십시오.

아파치의 경우 :

<VirtualHost *>
   ServerName myhost.com

   ErrorLog /var/log/apache2/error-myhost.log
   CustomLog /var/log/apache2/access-myhost.log common

   DocumentRoot "/var/www"

   WSGIScriptAlias / /path/to/my/wsgi.py

</VirtualHost>

바라건대 이것이 mod_wsgi를 설정하는 데 도움이되므로 차이가 있는지 확인할 수 있습니다.


1

캐시 : 플러시되고 있는지 확인하십시오. 캐시에 무언가가 들어가기는 쉽지만 캐시 참조로 인해 결코 GC되지 않습니다.

Swig'd code : 메모리 관리가 올바르게 수행되고 있는지 확인하십시오. 특히 타사 라이브러리에서 파이썬에서 이러한 기능을 놓치기 쉽습니다.

모니터링 : 가능하면 메모리 사용량 및 적중에 대한 데이터를 얻으십시오. 일반적으로 특정 유형의 요청과 메모리 사용량간에 상관 관계가 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.