programing

PHP에서 "Unable to allocate memory for pool"이 발생하는 원인은 무엇입니까?

yoursource 2022. 11. 22. 22:24
반응형

PHP에서 "Unable to allocate memory for pool"이 발생하는 원인은 무엇입니까?

특히 Wordpress와 같은 비대해진 어플리케이션에서는 서버의 메모리 할당 제한에 직면하는 경우가 종종 있지만 "풀에 메모리를 할당할 수 없습니다"라는 문제가 발생하여 정보를 추적하는 데 어려움을 겪지는 않았습니다.

게게 무슨 ?인 인? ???더 많이 하려고 했는데memory_limit크게 .어플리케이션도 크게 변경하지 않았습니다.어느 날 문제가 없었고 다음 날 이 오류가 발생했습니다.

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_module을 클릭합니다.

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

서버에 메모리가 부족하면 filters 옵션을 사용하여 액세스 빈도가 낮은 php 파일이 캐시되지 않도록 합니다.

단, TTL 0은 사용하지 마십시오.

c33s에서 설명한 바와 같이 apc.php를 사용하여 설정을 확인합니다.apc 패키지에서 웹 폴더로 파일을 복사하고 브라우저를 가리킵니다.무엇이 실제로 할당되어 있고 어떻게 사용되는지 알 수 있습니다.그래프는 시간 후에도 안정된 상태를 유지해야 합니다.새로고침 때마다 완전히 변경되면 설정이 잘못되었음을 의미합니다(APC가 모든 것을 플러시합니다).APC가 실제로 보안 마진으로 사용하는 것보다 20% 더 많은 RAM을 할당하고 정기적으로 확인합니다.

32MB만 허용하는 기본값은 터무니없이 낮습니다.PHP는 서버가 64MB이고 대부분의 스크립트가 페이지당 하나의 php 파일을 사용할 때 설계되었습니다.오늘날 Magento와 같은 솔루션에는 10,000개 이상의 파일(APC에서는 60Mb까지)이 필요합니다.대부분의 php 파일이 항상 캐시되도록 충분한 메모리를 확보해야 합니다.이것은 낭비가 아닙니다.파일 캐시에 대응하는 raw php를 두는 것보다 opcode를 ram에 유지하는 것이 더 효율적입니다.오늘날에는 24GB 메모리를 탑재한 전용 서버를 월 $80으로 구입할 수 있습니다.따라서 몇 GB의 메모리를 APC에 할당하는 것을 주저하지 마십시오.24GB 중 2GB를 5Magento 스토어와 40개까지의 워드프레스 웹사이트를 호스팅하는 서버에 저장하면 APC는 1.2를 사용합니다.GB. Magento 설치의 경우 64MB, 일부 플러그인이 있는 Wordpress의 경우 40MB를 카운트합니다.

또, 같은 서버에 개발 Web 사이트가 있는 경우.캐시에서 제외합니다.

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

솔루션:

  • apc.ttl=0
  • apc.shm_size=필요한 모든 것

편집 개시

경고!

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

ttl이 0인 경우 캐시된 모든 항목을 즉시 삭제할 수 있습니다.따라서 캐시 크기가 2mb, ttl이 0인 경우 캐시 내의 데이터는 항상 덮어쓰기되기 때문에 apc는 사용할 수 없습니다.

ttl을 낮춘다는 것은 캐시가 가득 찰 수 없고 교체할 수 없는 항목만 있다는 것을 의미합니다.

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

제 경우 캐시 사이즈가 1GB이기 때문에 충분했습니다.

편집 끝

centos 5에서 php 5.2.17과 같은 문제가 발생하여 캐시 크기가 작고 캐시해야 할 php 파일이 많을 때 ttl 파라미터가 "높음"(7200 등)인 경우 캐시가 매우 빠르게 채워지고 apc는 캐시 내의 모든 파일이 여전히 ttl에 맞기 때문에 삭제할 수 있는 파일을 찾을 수 없습니다.

increasing the memory size is only a part solution, you still run in this error if you cache fills up and all files are within the ttl.

so my solution was to set the ttl to 0, so apc fills up the cache an there is allways the possibility for apc to clear some memory for new data.

hope that helps

edit: see also: http://pecl.php.net/bugs/bug.php?id=16966

download http://pecl.php.net/get/APC extract and run the apc.php, there you have a nice diagram how your cache usage look like

Running the apc.php script is key to understanding what your problem is, IMO. This helped us size our cache properly and for the moment, seems to have resolved the problem.

For newbies like myself, these resources helped:

Finding the apc.ini file to make the changes recommended by c33s above, and setting recommended amounts: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

Understanding what apc.ttl is: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

Understanding what apc.shm_size is: http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size

As Bokan has mentioned, you can up the memory if available, and he is right on how counter productive setting TTL to 0 is.

NotE: This is how I fixed this error for my particular problem. Its a generic issue that can be caused by allot of things so only follow the below if you get the error and you think its caused by duplicate PHP files being loaded into APC.

The issue I was having was when I released a new version of my PHP application. Ie replaced all my .php files with new ones APC would load both versions into cache.

Because I didnt have enough memory for two versions of the php files APC would run out of memory.

There is a option called apc.stat to tell APC to check if a particular file has changed and if so replace it, this is typically ok for development because you are constantly making changes however on production its usually turned off as it was with in my case - 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으로 2배 증가했습니다.

apc.shm_size=128M

인터넷을 보면 여러 가지 원인이 있을 수 있습니다.내 경우엔 모든 게 디폴트인 채로...

apc.shm_size = 64M

아까 받았던 수많은 경고들을 지웠어요

OpenCart 설치를 다른 서버로 이동한 후 "Unable to allocate memory for pool" 오류가 발생했습니다.memory_limit도 올려봤어요.

apache, www-data 등 apache를 실행하는 사용자에 의한 쓰기 액세스 권한을 갖도록 오류 메시지에서 파일 권한을 변경한 후 오류가 중지되었습니다./etc/group을 직접 수정(또는 파일을 0777로 chmod-ing)하는 대신 usermod를 사용했습니다.

usermod -a -G vhost-user-group apache-user

변경 내용을 적용하려면 Apache를 다시 시작해야 했습니다.

apachectl restart

또는

sudo /etc/init.d/httpd restart

또는 시스템이 아파치를 재시작하기 위해 사용하는 모든 것.

사이트가 공유 호스팅에 있는 경우 FTP 프로그램으로 파일 권한을 변경하거나 호스팅 공급자에게 문의해야 합니다.

이 문제를 해결하려면 apc 값을 설정합니다.shm_size as integer apc.ini 파일을 찾습니다(내 시스템의 apc.ini 파일 위치 /etc/sq5/conf.d/apc.ini). apc.shm_size = 1000으로 설정합니다.

시스템에 apc를 삽입해야 했습니다.shm_size = /usr/local/etc/doc/apc.ini(FreeBSD 9.1)에 64M을 입력했을 때 (/usr/local/share/doc/APC/apc.php에서/usr/local/www/d4/data로 복사한) apc.ini 캐시 크기가 기본 32M으로 증가했음을 알 수 있습니다.

참고 자료: http://au1.php.net/manual/en/apc.configuration.php도 Bokan의 코멘트를 읽고 매우 도움이 되었습니다.

캐시된 파일 크기를 모니터링하고(apc pecl 패키지에서 apc.php를 사용할 수 있음) apc를 늘립니다.필요에 따라 shm_size를 선택합니다.

이것으로 문제가 해결됩니다.

언급URL : https://stackoverflow.com/questions/3723316/what-is-causing-unable-to-allocate-memory-for-pool-in-php

반응형