2012-04-03 1 views
3

DB에서 일부 행에 대해 많은 처리를 수행하는 스크립트가 있습니다. 이 스크립트는 많은 객체와 내부 캐싱 메커니즘을 사용하고 있습니다.내 모든 기억이 PHP로 어떻게 옮겨 졌는지 어떻게 알 수 있습니까?

캐시 된 항목에 대해 사용 가능한 RAM을 모두 사용하지 않도록 모든 사용 된 캐시를 해제하지만 사용 된 메모리는 줄이지 ​​않습니다.

나는 스크립트가 얼마나 많은 RAM을 가지고 있는지를 결정하기 위해 memory_get_usage(true)을 사용했지만, 어떤 객체가 여전히 RAM에 있고 여전히 메모리를 먹고 있는지를 감지하는 방법이 없다.

간단한 해결책은 모든 개체를 거슬러 올라가서 변수가 아직 살아 있는지 확인하고 모든 내부 캐시가 실제로 free'd되어 있는지 테스트하고 다시 테스트하고 테스트하는 것입니다. 도구 나 함수 호출을 찾으십시오.이 스크립트에서 사용하는 개체의 모든 내부 구조를 알고 혼란스럽게하지 않고도 "Z 클래스의 변수 Y에 RAM의 90 %가 있음"이라고 알릴 수 있습니다.

+0

PHP의 가비지 컬렉터가 실행되지 않는 한 변수를 설정 해제하거나 null로 설정해도 메모리가 즉시 해제되지 않습니다. GC 실행은 비용이 많이 들고 PHP는 실행해야 할 때까지 실행하지 않습니다. 작업에 현재 사용 가능한 것보다 많은 메모리가 필요할 때 –

답변

2

왜 스크립트를 프로파일하지 않습니까?

프로파일 러를 켜고 xdebug를 사용하고 cachegrind 파일에서 진행중인 작업을 조사하십시오.

여기에 대한 자세한 내용보기 : http://www.xdebug.org/docs/profiler

업데이트 : 당신은 간단한 HTML에서의 메모리 사용량을 얻을 수 xdebug.trace_format 모두 설정 1과 함께 xdebug.show_mem_delta 매개 변수를 사용하여 더 많은 메모리와 관련된 정보를 얻을 수 있습니다.

몇 가지 아이디어를 얻으려면 http://xdebug.org/docs/execution_trace과이 http://derickrethans.nl/xdebug-and-tracing-memory-usage.html을 확인하십시오.

+0

kcachegrind의 메모리 정보가 보이지 않습니다 ... 어떤 ideea를 찾아야합니까? 모두 내가 보는 타이밍과 함수 호출의 수입니다 ... – Quamis

+0

@Quamis, 내 업데이트 된 답변 확인 – mobius

+0

아마도 "할 수있는"대답을 수락합니다. 비록 xdebug가 xdebug.trace_format을 무시하고 항상 0으로 설정된 버그를 가지고 있기 때문에 나는 그것을 테스트 할 수 없다. 그동안에 culprint를 발견하고 내 문제를 해결했지만, 나는 문제가 해결되지 않았기 때문에 dissapointed했다. 깨끗하고 간단한 도구 (kcachegrind는 당신이 원하는 것을 모르는 경우 귀를 먹을 것입니다) – Quamis

관련 문제