2012-02-25 4 views
2

일부 PHP 메모리 벤치 마크를 수행 중이며 메모리 소비를 줄이기 위해 가비지 컬렉터를 최적화하는 방법이 있는지 궁금합니다 (JAVA와 같은 다른 언어에서도 가능함).).PHP 가비지 수집 및 메모리 최적화

php.ini에서 GC와 관련된 사용자 정의 가능한 매개 변수가 세 개인 경우 만 있습니다 : session.gc_probability, session.gc_divisorsession.gc_maxlifetime입니다. 이 세션에 대해서만 나는 벤치마킹 아니에요.

가능한 최적화 순환 참조를 피하고 gc_collect_cycles() (이 기사 덕분에 http://www.alexatnet.com/comment/86 덕분에)을 호출하여 가비지 수집주기를 강제 실행하는 것과 같이 지금까지는 코드와 관련되어 있음을 알고 있습니다.

PHP 메모리 관리에 대한 구성 요령이나 좋은 습관을 아는 사람이 있습니까?

+0

구성 지시문을 통해 수행 할 수있는 일은 많지 않습니다. 메모리 사용을 줄이는 방식으로 코드를 작성해야합니다. 그 자체로는 대부분의 "프로그래머"를위한 신비입니다. –

+0

실제로 타격을주지 않는 한 메모리 소비 및/또는 GC 문제로 인한 성능 문제는 대부분의 경우에 대해 걱정하지 않으려 고합니다. [태그 : 마이크로 최적화] – GordonM

답변

4

내가 알고있는 한, gc_collect_cycles()으로 콜렉션을 강요하는 것은 시간 t에서 메모리 사용을 최소화 할 수있는 가장 가깝습니다.

GC는 물론 시간 제한 연산이며 응용 프로그램은 거의 메모리 바인딩에 거의 영향을 미치지 않으므로 프로그램 실행 중 GC 실행을 불필요하게 트리거하는 옵션을 제공하는 것이 실제로 의미가 없습니다. 이 축을 따라 PHP 에서 시간에 맞게 코드를 최적화 할 수 있도록 필요에 따라 사이클 수집기를 켜고 끌 수있는 기능 (예 : gc_enable(), gc_disable())을 제공합니다 (물론 GC 시작에 걸리는 오버 헤드를 피할 수 있음). 물론 이것이 어떻게 유용 할 수 있는지 쉽게 알 수 있습니다.

일반적으로 철학에 의한 PHP는 메모리 관리 및 GC와 같은 주제를 피하며, 벤치 마크는 현실 세계 전망을 위해이를 고려해야합니다.

희망이 도움이됩니다.

+0

사실 저는 그 종류의 gc micro- 최적화. 그러나, obvioulsy PHP 가비지 컬렉터는 조정할 수 없습니다. 나는 확신하고 싶었다. 감사. –

0

변수를 더 이상 필요로하지 않을 때 unset() 메서드를 사용하여 변수를 지 웁니다.

0

일반 PHPs 메모리 관리에서 (또한, 마이크로 최적화를 인용 @ GordonM의 코멘트. 고개를 끄덕)는 모든 당신이 선언 변수와 사용을 위해 상자 밖으로 작동합니다. 개념 refcounting을 사용하면 PHP는 변수가 더 이상 사용되지 않는 것을 확인한 후 자동으로 정리합니다.

가비지 수집기는 객체에 순환 참조가있는 경우에만 유용합니다. A는 B를 가리키고 B는 A를 다시 가리 킵니다.이 경우 refcounting이 작동하지 않습니다.

잠재적으로 더 이상 사용되지 않는 가능성이있는 PHP 메모리에 정확히 10.000 개의 객체가있는 경우 PHP 가비지 수집기는 기본적으로 활성화되어 있으면 트리거합니다. 런타임에 gc_enable()gc_disable()을 사용하거나 사용하지 않도록 설정할 수 있습니다.

gc_collect_cycles()으로 전화하여 이러한 개체를 수동으로 정리할 수도 있습니다.

하지만 필요한 경우이 프로세스를 최적화하는 방법은 무엇입니까? 주기 수집기를 실행하는 것이 효율적이거나 유용 할 필요는 없습니다. 10.000 잠재적 객체 중에서 많은 객체가 여전히 사용 중이므로 정리할 수 없습니다. 이 경우 CPU주기를 낭비하여 모든 객체를 검사하고 객체를 지우지 않기로 결정합니다. 이렇게하면 메모리가 줄어들지 않습니다.

일반적으로 GC는 장시간 실행되는 스크립트에서만 트리거되며 너무 많은 개체를 만들면 짧은 웹 요청에서 가끔 발생합니다.일반적으로 기본값에 대한 유즈 케이스의 99 %가 작동하기 때문에 이것에 대해서는 너무 많이 생각하지 않아야합니다.

"garbage_stats"PHP 확장을 사용하면 GC가 얼마나 효율적이고 빠르게 실행되었는지, 얼마나 많은 메모리를 줄일 수 있었는지에 대한 통계와 통계에 액세스 할 수 있습니다. (후크는 그 이후에만 사용할 수 있기 때문에)는 7 + PHP에서 작동 : https://github.com/tideways/php_garbage_stats 당신이 확장 기능을 설치 한 경우, 당신이 그들을 호출하여 CLI 스크립트에 대한 가비지 컬렉션 통계를 볼 수 있습니다

: A로부터

$ php -dgc_stats.enable=1 -dgc_stats.show_report=1 test.php 

Found 7 garbage collection runs in current script. 

Collected | Efficency% | Duration | Memory Before | Memory After | Reduction% | Function 
----------|------------|----------|---------------|--------------|------------|--------- 
     0 |  0.00 % | 0.01 ms |  365824 |  366320 | -0.14 % | gc_collect_cycles 
    10000 | 100.00 % | 2.75 ms |  4651320 |  491816 | 89.43 % | foo 
    10000 | 100.00 % | 3.54 ms |  4652784 |  493280 | 89.40 % | foo 
    10000 | 100.00 % | 2.11 ms |  4654248 |  494744 | 89.37 % | foo 
    10000 | 100.00 % | 3.26 ms |  4656168 |  496664 | 89.33 % | Test::foo 
    9000 | 90.00 % | 1.51 ms |  4694680 |  951176 | 79.74 % | Test::foo 
    10000 | 100.00 % | 3.11 ms |  5112272 |  952768 | 81.36 % | Test::foo 

을 웹 (예 : Apache 또는 FPM) 요청의 경우, $runs = gc_stats(); 기능을 사용하여이 정보에 액세스하여 로그 파일에 기록 할 수 있습니다.

이 정보를 바탕으로 다음과 같은 유일한 결정을 내릴 수 있습니다. 스크립트가 실행되는 효율성에 따라 스크립트에서 GC를 사용하거나 사용하지 않도록 설정합니다.