[php] PHP에서 “풀에 메모리를 할당 할 수 없습니다”는 무엇입니까?

가끔 서버의 메모리 할당 제한, 특히 WordPress와 같은 부풀어 오른 응용 프로그램에서 실행되었지만 “풀에 메모리를 할당 할 수 없습니다”가 발생하지 않았으며 정보를 추적하는 데 문제가 없었습니다.

누구나 이것이 무엇을 의미하는지 알고 있습니까? 나는 memory_limit성공없이 증가하려고 노력했다 . 또한 응용 프로그램을 크게 변경하지 않았습니다. 어느 날 문제가 없었고 다음날 나는이 오류에 부딪쳤다.



답변

아마도 APC와 관련이 있습니다.

이 문제가있는 사람들은 .ini 설정을 지정하십시오. 특히 apc.mmap_file_mask 설정입니다.

파일 백업 mmap의 경우 다음과 같이 설정해야합니다.

apc.mmap_file_mask=/tmp/apc.XXXXXX

/ dev / zero에서 직접 mmap하려면 다음을 사용하십시오.

apc.mmap_file_mask=/dev/zero

POSIX 호환 공유 메모리 백업 mmap의 경우 다음을 사용하십시오.

apc.mmap_file_mask=/apc.shm.XXXXXX


답변

TTL 0을 사용하면 APC 에 메모리가 부족할 때 모든 캐시 가 플러시 됩니다. 오류가 더 이상 나타나지 않지만 APC의 효율성이 훨씬 떨어집니다. “내 일을하고 싶지 않다”는 결정은 위험이없고 문제가되지 않습니다. APC는 그런 식으로 사용되지 않습니다. 가장 많이 액세스 한 페이지가 만료되지 않도록 충분히 높은 TTL을 선택해야합니다. 가장 좋은 방법은 충분한 메모리를 제공하여 APC가 캐시를 플러시 할 필요가 없다는 것입니다.

매뉴얼을 읽고 ttl이 어떻게 사용되는지 이해 하십시오 : http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

해결책은 APC에 할당 된 메모리를 늘리는 것입니다. apc.shm_size를 늘려서이를 수행하십시오.

APC가 공유 세그먼트 메모리를 사용하도록 컴파일 된 경우 운영 체제에 따라 제한됩니다. 각 세그먼트의 시스템 한계를 보려면이 명령을 입력하십시오.

sysctl -a | grep -E "shmall|shmmax"

더 많은 메모리를 할당하려면 apc.shm_segments 매개 변수를 사용하여 세그먼트 수를 늘려야합니다.

APC가 mmap 메모리를 사용하는 경우 제한이 없습니다. 메모리 양은 여전히 ​​동일한 옵션 apc.shm_size에 의해 정의됩니다.

서버에 메모리가 충분하지 않으면 필터 옵션을 사용하여 자주 액세스하지 않는 PHP 파일이 캐시되지 않도록하십시오.

그러나 TTL 0을 사용하지 마십시오.

c33s가 말했듯이 apc.php를 사용하여 구성을 확인하십시오. 파일을 apc 패키지에서 웹 폴더로 복사하고 브라우저를 가리 킵니다. 실제로 할당 된 내용과 사용 방법을 확인할 수 있습니다. 그래프는 매번 새로 고칠 때마다 완전히 변경되면 몇 시간 후에도 안정적으로 유지되어야합니다. 설정이 잘못되었음을 의미합니다 (APC가 모든 내용을 플러시하고 있음). APC가 실제로 보안 마진으로 사용하는 것보다 20 % 더 많은 램을 할당하고 정기적으로 확인하십시오.

32MB 만 허용하는 기본값은 엄청나게 낮습니다. PHP는 서버가 64MB이고 대부분의 스크립트가 페이지 당 하나의 PHP 파일을 사용했을 때 설계되었습니다. 오늘날 Magento와 같은 솔루션에는 10k 개 이상의 파일 (APC에서 ~ 60Mb)이 필요합니다. 대부분의 PHP 파일이 항상 캐시되도록 충분한 메모리를 허용해야합니다. 그것은 낭비가 아니며 파일 캐시에 해당 원시 PHP를 두지 않고 opcode를 램에 유지하는 것이 더 효율적입니다. 오늘날 우리는 24Gb의 메모리를 가진 전용 서버를 월 $ 80만큼 저렴한 가격에 구입할 수 있으므로 주저하지 말고 몇 GB의 APC를 허용하십시오. 5Magento 상점과 ~ 40 워드 프레스 웹 사이트를 호스팅하는 서버에 24GB 중 2GB를 넣었습니다 .APC는 1.2GB를 사용합니다. Magento 설치의 경우 64MB, 일부 플러그인의 경우 WordPress의 경우 40MB를 계산하십시오.

또한 동일한 서버에서 웹 사이트를 개발 한 경우. 캐시에서 제외하십시오.


답변

나를위한 솔루션 :

  • apc.ttl = 0
  • apc.shm_size = 원하는 것

편집 시작

경고!

@bokan은 여기에 경고를 추가해야한다고 표시했습니다.

ttl이 0이면 모든 캐시 된 항목을 즉시 제거 할 수 있습니다. 따라서 2mb와 같은 작은 캐시 크기와 0의 ttl을 사용하면 캐시의 데이터가 항상 덮어 쓰므로 apc를 쓸모 없게 만듭니다.

ttl을 낮추면 캐시를 가득 채울 수없고 교체 할 수없는 항목 만 있음을 의미합니다.

따라서 ttl과 캐시 크기간에 적절한 균형을 선택해야합니다.

내 경우에는 1GB의 캐시 크기가 있었으므로 충분했습니다.

끝 편집

php 5.2.17과 centos 5에서 동일한 문제가 있었고 캐시 크기가 작고 ttl 매개 변수가 “높은”(예 : 7200)이면 많은 php 파일을 캐시하면 캐시가 매우 빨리 채워집니다. apc는 캐시의 모든 파일이 여전히 ttl에 적합하기 때문에 제거 할 수있는 것을 찾지 못했습니다.

메모리 크기를 늘리는 것은 부분 해결책 일 뿐이며, 캐시가 가득 차고 모든 파일이 ttl 내에 있으면이 오류가 계속 발생합니다.

그래서 내 솔루션은 ttl을 0으로 설정하는 것이 었습니다. 따라서 apc는 캐시를 채우고 apc가 새로운 데이터를 위해 일부 메모리를 지울 가능성이 있습니다.

그것이 도움이 되길 바란다

편집 : 참조 : http://pecl.php.net/bugs/bug.php?id=16966

http://pecl.php.net/get/APC 추출을 다운로드 하고 apc.php를 실행하면 캐시 사용법이 어떻게 멋진 지 알 수 있습니다.


답변

apc.php 스크립트를 실행하는 것은 문제가 무엇인지 이해하는 데 중요합니다. IMO. 이는 캐시 크기를 적절하게 조정하는 데 도움이되었으며 현재로서는 문제를 해결 한 것으로 보입니다.


답변

나와 같은 초보자에게는 다음 리소스가 도움이되었습니다.

위의 c33에서 권장하는 변경을 수행하기 위해 apc.ini 파일을 찾고 권장량을 설정 하십시오 .
http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

apc.ttl이 무엇인지 이해 :
http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

apc.shm_size의 이해 :
http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size


답변

Bokan이 언급했듯이 사용 가능한 경우 메모리를 늘릴 수 있으며 TTL을 0으로 설정하는 카운터 생산 방식이 옳습니다.

참고 : 특정 문제에 대해이 오류를 해결 한 방법입니다. 그것은 많은 것들로 인해 발생할 수있는 일반적인 문제이므로 오류가 발생하고 APC에 중복 PHP 파일이로드 된 것으로 생각되는 경우에만 다음을 따르십시오.

내가 가진 문제는 새로운 버전의 PHP 응용 프로그램을 출시했을 때 발생했습니다. 즉, 모든 .php 파일을 새 파일로 교체했습니다. APC는 두 버전을 캐시에로드합니다.

두 가지 버전의 PHP 파일에 대한 메모리가 충분하지 않기 때문에 APC에 메모리가 부족합니다.

apc.stat라는 옵션이 있습니다. APC에게 특정 파일이 변경되었는지 확인하고 교체하는 경우에는 대체로 괜찮습니다. 프로덕션 환경에서는 항상 변경 사항이 있기 때문에 일반적으로 개발이 중단되어 있기 때문에 개발에 좋습니다. 사례-http: //www.php.net/manual/en/apc.configuration.php#ini.apc.stat

성능 저하에 문제가 없으면 apc.stat를 켜면이 문제가 해결됩니다.

내 문제에 대한 해결책은 프로젝트 버전이 변경되었는지 확인하고 캐시를 비우고 페이지를 다시로드하는 것입니다.

define('PROJECT_VERSION', '0.28');

if(apc_exists('MY_APP_VERSION') ){

    if(apc_fetch('MY_APP_VERSION') != PROJECT_VERSION){
        apc_clear_cache();
        apc_store ('MY_APP_VERSION', PROJECT_VERSION);
        header('Location: ' . 'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);
        exit;
    }

}else{
    apc_store ('MY_APP_VERSION', PROJECT_VERSION);
}


답변

이것은 우리 서버 (동일한 서버에서 많은 WordPress 사이트를 실행)를 위해 일했습니다.

/etc/php.d/apc.ini 파일에서 메모리 설정이 변경되었습니다. 64M으로 설정되어 128M으로 두 배가되었습니다.

apc.shm_size = 128M