programing

장고 메모리 사용량을 줄입니다.낮게 매달린 과일?

cafebook 2023. 7. 22. 10:23
반응형

장고 메모리 사용량을 줄입니다.낮게 매달린 과일?

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

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

저는 큰 이득을 얻을 수 있는 몇 가지 간단한 단계가 있다는 느낌이 듭니다.'debug'가 'False'로 설정되었는지 확인하는 것은 명백한 큰 일입니다.

누가 다른 것을 제안할 수 있습니까?트래픽이 적은 사이트에서 캐싱을 얼마나 개선할 수 있습니까?

이 경우에는 Apache 2.x에서 mod_python을 사용하여 실행합니다.mod_wsgi가 좀 더 얇다고 들었습니다만, 이 단계에서 전환하는 것은 제가 상당한 이득을 얻을 것이라는 것을 알지 못하는 한 까다로울 것입니다.

편집: 지금까지 팁을 주셔서 감사합니다.메모리를 다 사용하는 방법을 찾을 수 있는 방법이 있습니까?Python 메모리 프로파일링에 대한 가이드가 있습니까?

또한 언급했듯이 mod_wsgi로 전환하는 것을 까다롭게 만드는 몇 가지가 있으므로 그 방향으로 나아가기 전에 기대할 수 있는 이점에 대해 알고 싶습니다.

편집: 칼은 여기에 읽을 가치가 있는 조금 더 자세한 답변을 게시했습니다.장고 배포: Apache의 오버헤드 잘라내기

편집: Graham Dumpleton의 기사는 제가 MPM과 mod_wsgi 관련 자료에서 찾은 것 중 최고입니다.앱 자체의 메모리 사용 디버깅에 대한 정보를 아무도 제공하지 못한 것이 오히려 실망스럽습니다.

최종 편집:저는 아파치를 다시 컴파일하는 데 도움이 될 수 있는지 알아보기 위해 웹팩션과 이 문제에 대해 논의해 왔습니다.

"저는 MPM Worker + mod_wsgi 설정으로 전환한다고 해서 많은 이점을 얻을 수 있을 것이라고 생각하지 않습니다.20MB 정도는 절약할 수 있을 것으로 예상되지만 그 이상은 아닐 것입니다."

그래서! 이것은 저를 원래의 질문으로 돌아가게 합니다 (아직도 저는 그것에 대해 전혀 알지 못합니다).문제가 어디에 있는지 어떻게 파악합니까?어디서 최적화해야 하는지 테스트하지 않고 최적화하지 않는 것은 잘 알려진 격언이지만 Python 메모리 사용을 측정하는 튜토리얼은 거의 없고 Django에만 국한된 것은 전혀 없습니다.

모두의 도움에 감사하지만 이 질문은 아직 열려 있는 것 같습니다!

또 다른 최종 편집 ;-)

저는 장고 사용자 목록에서 이것을 물었고 매우 도움이 되는 답변을 받았습니다.

솔직히 역대 마지막 업데이트!

이거 방금 공개됐어요.지금까지 최고의 솔루션이 될 수 있습니다: Pymmpler를 사용하여 Django 객체 크기메모리 사용량 프로파일링

데이터에 대한 글로벌 참조를 유지하지 않아야 합니다.이렇게 하면 파이썬 가비지 수집기가 메모리를 해제할 수 없습니다.

사용하지 mod_python아파치 내부에 인터프리터를 로드합니다.Apache를 사용해야 하는 경우 대신 를 사용합니다.전환하는 것은 까다롭지 않습니다.그것은 매우 쉬워요.mod_wsgi뇌사 상태보다 장고를 구성하는 것이 훨씬 쉽습니다.mod_python.

요구 사항에서 Apache를 제거할 수 있다면 메모리에 훨씬 더 좋을 것입니다. 이것이 파이썬 웹 애플리케이션을 실행하는 새로운 빠르고 확장 가능한 방법인 것 같습니다.

편집: mod_wsgi로 전환하는 것이 어떻게 "꼼꼼"할 수 있는지 모르겠습니다.그것은 매우 쉬운 일이 될 것입니다.스위치에 문제가 있는지 자세히 설명해 주세요.

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 및 메모리 사용량의 급격한 감소를 보여주는 몇 가지 차트를 게시했습니다.몇몇 장고 개발자들이 바뀌었습니다.진심으로, 그건 쉬운 일입니다 :)

제가 알고 있는 Python 메모리 프로파일러 솔루션은 다음과 같습니다(장고 관련 없음).

고지 사항:저는 후자의 지분을 가지고 있습니다.

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

다음은 몇 가지 유용한 조언을 제공하는 멋진 "전쟁 이야기"입니다.

또한 알려진 누출기를 사용하지 않는지 확인합니다.MySQLdb는 유니코드 처리 버그로 인해 장고로 엄청난 양의 메모리가 유출되는 것으로 알려져 있습니다.그 외에도 장고 디버그 도구 모음은 호그를 추적하는 데 도움이 될 수 있습니다.

대용량 데이터 개체에 대한 글로벌 참조를 유지하지 않을 뿐만 아니라 가능한 한 대용량 데이터셋을 메모리에 로드하지 않도록 하십시오.

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

웹파션은 실제로 장고 메모리 사용을 줄이는 몇 가지 팁을 가지고 있습니다.

주요 요점:

  • 디버그가 false로 설정되어 있는지 확인합니다(이미 알고 있음).
  • Apache 구성에서 "ServerLimit" 사용
  • 메모리에 큰 물체가 로드되지 않는지 점검합니다.
  • 정적 콘텐츠를 별도의 프로세스 또는 서버에서 제공하는 것을 고려합니다.
  • Apache 구성에서 "MaxRequestsPerChild" 사용
  • 사용 중인 메모리 용량 파악 및 이해

mod_wsgi에 대한 또 다른 플러스: set amaximum-requests매개 변수WSGIDaemonProcess디렉티브 및 mod_wsgi는 데몬 프로세스를 자주 다시 시작합니다.새로운 프로세스가 처음 실행될 때 느린 페이지 로드를 제외하고는 사용자에게 눈에 보이는 효과가 없어야 합니다. 이는 Django와 응용 프로그램 코드를 메모리에 로드하기 때문입니다.

그러나 메모리 누수가 있더라도 사용자에 대한 서비스를 중단할 필요 없이 프로세스 크기가 너무 커지는 것을 방지해야 합니다.

다음은 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()

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

Apache의 경우:

<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를 설정하는 데 도움이 되어 차이가 있는지 확인할 수 있기를 바랍니다.

캐시: 캐시가 플러시되는지 확인합니다.캐시에 무언가를 저장하는 것은 쉽지만 캐시 참조 때문에 GC가 될 수 없습니다.

Swig'd code: 메모리 관리가 올바르게 수행되고 있는지 확인합니다. 특히 타사 라이브러리에서 python에서 이러한 관리를 놓치기 쉽습니다.

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

우리는 큰 사이트 맵(10,000개 항목)이 있는 장고의 버그에 걸려 넘어졌습니다.장고가 사이트 맵을 생성할 때 메모리에 모두 로드하려고 하는 것 같습니다: http://code.djangoproject.com/ticket/11572 - 구글이 사이트를 방문할 때 아파치 프로세스를 효과적으로 종료합니다.

언급URL : https://stackoverflow.com/questions/487224/reducing-django-memory-usage-low-hanging-fruit

반응형