2012-11-22 6 views
0

cherrypy로 메모리 문제를 감지하려고 잠시 동안 노력했습니다. 함수에 대한 모든 웹 호출은 다음 명령을 실행할 때 메모리를 사용합니다.cherrypy/apache 서버가 함수 호출이 끝난 후 메모리를 해제하지 않습니다.

ps -u djotjog -o pid,rss,command | awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}' 

은 영구적으로 남아있는 것처럼 보입니다. 나가기 전에 함수의 모든 객체를 'del'하려고했습니다. 효과가 없습니다. 많은 데이터를 저장하는 클래스 인스턴스가 문제가 될지 궁금합니다. 나는 아직도 내가 웹 호출을 실행할 때마다 사용 3백50메가바이트를 참조 결국

class Data: 
    pass 
ref_data = Data() 

... do stuff... make a stories_dict ... 

ref_data.stories = stories_dict #dictionary 'id':'story' pairs 
del stories_dict 

, 그것은이 500MB에 도달하면, 다른 cherrypy 예를 생성하는 것 : 나는 같은 것을 사용! LATER

PID RSS COMMAND 
10492 960 ps -u globamh1 -o pid,rss,command 
10493 784 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"} 
29833 1708 -bash 
Total 3.37109 MB 

... 나중에 여전히

PID RSS COMMAND 
12811 1164 /bin/sh cherryd.fcgi 
12817 293788 /home4/globamh1/python-2.7.2/bin/python2.7  /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app 
13195 984 ps -u globamh1 -o pid,rss,command 
13196 16 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"} 
29833 1708 -bash 
Total 308 MB 

... 그래서

PID RSS COMMAND 
4053 5216 /home/globamh1/python-2.7.2/bin/python /home/globamh1/python- 2.7.2/ngo_prompter_2.py 
4091 988 ps -u globamh1 -o pid,rss,command 
4092 784 awk {print $0}{sum+=$2} END {print "Total", sum/1024, "MB"} 
12817 1111616 /home4/globamh1/python-2.7.2/bin/python2.7 /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app 
29833 1716 -bash 
32413 1168 /bin/sh cherryd.fcgi 
32414 576792 /home4/globamh1/python-2.7.2/bin/python2.7 /home4/globamh1/.local/bin/cherryd -P modules -c cherryd.conf -f -i app 
Total 1658.48 MB 

일부 특정 질문에이 위로 감싸는 :

  • 얼마나 빨리해야 파이썬의 가비지 수집기가 작동합니까?
  • cherrypy 또는 apache가 데이터를 영구 보존하기 위해 이상한 일을합니까?
  • 메모리가 너무 많은 경우 cherrypy가 여러 요청에 응답하도록 어떻게 신뢰할 수 있습니까? 이미 일부 요청을 무시하는 것으로 나타났습니다.
  • 이것은 서버 구성에 문제가 있습니까?

동일한 문제입니까? Memory not released by python cherrypy application on linux

그렇다면 공유 솔루션 사이트를 어떻게 구성해야합니까?

답변

1

표시되는 샘플 코드에서 수집 할 수있는 것이 거의 없습니다. 특히 :

ref_data.stories = stories_dict 

즉 ref_data.stories 모두 같은 큰 데이터 세트를 참조 stories_dict한다. ref_data.stories 여전히 같은 딕셔너리에 대한 참조이기 때문에 당신이 stories_dict을 삭제하는 경우에도, 그것은 가비지 수집 ref_data.stories 때까지 삭제 (또는 ref_data 삭제)되지 않습니다 :

del ref_data.stories # remove the attribute 
del ref_data # delete the instance and all of its attributes 

을 그렇지 않으면, 유일한 stories_dict가 삭제 될 때 가비지 수집되도록 남겨진 것은 그 사전 (아마 몇 바이트 만)에 대한 포인터입니다.

얼마나 빨리 파이썬의 가비지 수집기가 작동해야합니까?

확실한 것은 아니지만 제 경험상 가비지 수집기는 어떤 객체가 del이되었거나 함수가 종료되면 즉시 실행됩니다.

cherrypy 또는 apache는 데이터를 영구 보존하기 위해 이상한 일을합니까?

나는 의심 스럽다. 인터프리터에서 직접 같은 루틴을 실행하면이 동작을 볼 수 없습니까?

너무 많은 메모리를 사용하는 경우 cherrypy가 여러 요청에 응답하도록 어떻게 신뢰할 수 있습니까? 이미 일부 요청을 무시하는 것으로 나타났습니다. 이 서버 구성에 문제가 있습니까? 응용 프로그램이 기본적으로 요청을 병렬로 처리되는 경우 시스템을 사용할 수 있습니다보다 더 많은 메모리를 사용하는 경우

, 당신은 요청에서 응답을 동기화 할 수있는 방법을 찾아야합니다. 또 다른 옵션은 한 번에 하나의 요청 만 제공하도록 apache/cherrypy를 구성하는 것입니다. WSGI 구성 (할당 할 프로세스/스레드 수)의 일부라고 생각합니다. 프로세스/스레드 수를 1로 제한하면 CherryPy는 한 번에 하나의 요청 만 처리합니다.

+0

서버 bash 명령 줄에서 - python [filename] .py를 실행할 때 아무 것도 지속되지 않습니다 ... ref_data를 삭제하면 영구 메모리 사용에 아무런 영향을 미치지 않습니다. –

+0

나는 메모리 문제를 mysqldb와 관련이있는 것으로 축소했다. 여기에 좀 더 간결한 설명을 게시했다. http://stackoverflow.com/questions/13612050/mysqldb-usage-in-cherrpy-app-leads-to-massive- 영구 메모리 사용 - 서버 –

+0

영구 데이터 사용 소스를 라우팅 할 수 있도록 프로그램 종료시 메모리에있는 모든 데이터 개체 목록과 크기를 체계적으로 볼 수 있습니까? cherrypy가 메모리에 남아 있기 때문에 뭔가가 메모리에 남아 있습니다. –

관련 문제