development

PHP에서 "풀에 메모리를 할당 할 수 없습니다"는 무엇입니까?

big-blog 2020. 6. 30. 08:02
반응형

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를 실행하면 캐시 사용법이 어떻게 멋진 지 알 수 있습니다.


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

Turning apc.stat on would fix this issue if you are ok with the performance hit.

The solution I came up with for my problem is check if the the project version has changed and if so empty the cache and reload the page.

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);
}

This worked for our guys (running a slew of Wordpress sites on the same server).

Changed memory settings in the /etc/php.d/apc.ini file. It was set to 64M, so we doubled it to 128M.

apc.shm_size=128M


Looking at the internets there can be various of causes. In my case leaving everything default except...

apc.shm_size = 64M

...cleared the countless warnings that I was getting earlier.


I received the error "Unable to allocate memory for pool" after moving an OpenCart installation to a different server. I also tried raising the memory_limit.

The error stopped after I changed the permissions of the file in the error message to have write access by the user that apache runs as (apache, www-data, etc.). Instead of modifying /etc/group directly (or chmod-ing the files to 0777), I used usermod:

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

Then I had to restart apache for the change to take effect:

apachectl restart

Or

sudo /etc/init.d/httpd restart

Or whatever your system uses to restart apache.

If the site is on shared hosting, maybe you must change the file permissions with an FTP program, or contact the hosting provider?


To resolve this problem set value for apc.shm_size as integer Locate your apc.ini file (In my system apc.ini file location /etc/php5/conf.d/apc.ini) and set: apc.shm_size = 1000


on my system i had to insert apc.shm_size = 64M into /usr/local/etc/php.ini (FreeBSD 9.1) then when i looked at apc.php (which i copied from /usr/local/share/doc/APC/apc.php to /usr/local/www/apache24/data) i found that the cache size had increased from the default of 32M to 64M and i was no longer getting a large cache full count

references: http://au1.php.net/manual/en/apc.configuration.php also read Bokan's comments, they were very helpful


Monitor your Cached Files Size (you can use apc.php from apc pecl package) and increase apc.shm_size according to your needs.

This solves the problem.

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

반응형