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


133

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

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

답변:


90

아마도 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

감사! 바로 내가 찾던 링크입니다. 도움을 주셔서 감사합니다!
jonathanatx

2
링크 된 스레드에 대한 주석도 다음과 같이 문서화
Jonathan Day

3
이 APC 설정에 대한 추가 정보 : php.net/apc.configuration#ini.apc.mmap-file-mask
mikeytown2

2
필자의 경우 오류를 제거하기 위해 파일 백업에서 POSIX 호환으로 변경해야했습니다.
Attila Fulop

4
이 답변으로 문제를 해결하는 방법을 이해하지 못했습니다. file_mask이 값 중 하나가 아닌 경우 오류가 발생합니까 ? 이 값 중 하나가 있는데 오류가 발생하면 다른 값으로 전환해야합니까? 어느 것?
Jeff

125

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를 계산하십시오.

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


2
이! 나는 Wordpress를 실행 중이며 32M은 충분하지 않았습니다. 64M으로 올라 갔으며 이제는 분명해졌습니다. apc.php 사람들을 확인하십시오!
Dave Drager

좋은 대답입니다! +1 감사합니다.
Kostanos 2016 년

당신이 apc.shm_size = 64가 아니라 apc.shm_size 추가 할 필요가 64M에 높이려면 = 64M (내가 본 대부분의 예제는 마지막에 M 있었다) APC의 내 버전 (v3.1.3p1) 작업을하지나요
Patrick

1
캐시에 TTL보다 긴 캐시 파일이 많이 있다고 가정합니다. c33은 중요한 포인트를 가지고 있습니다. 모든 것이 최근에 액세스 된 경우 (원하는 것처럼 항상 액세스되는 캐시의 70 %가 있고 많은 수의 추가 파일이 한 번에 추가되는 큰 스파이크가 있다고 가정하면) 오류가 발생합니다. TTL 초 동안 발생합니다. 캐시가 가득 차서 APC에 이러한 항목을 지우지 말아야한다고 불평했습니다. 5 시간 동안 TTL이 있으면 드문 파일이 만료 될 때까지 5 시간 동안 오류가 발생합니다.
Matthew Kolb

@MatthewKolb : APC가 메모리에 보유 할 수있는 것보다 많은 파일을 캐싱 할 수 없습니다. 자주 액세스하지 않는 파일을 캐시하지 않으려면 필터를 사용하십시오.
bokan

36

나를위한 솔루션 :

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


2
감사합니다. 도움이되었습니다. 초당 약 12 ​​개의 "메모리를 할당 할 수 없습니다"오류가 발생했습니다. 캐시 크기 (32 ~ 64MB)를 두 배로 늘리고 ttl을 0으로 떨어 뜨 렸습니다.이 오류를 완전히 제거했습니다.
nicktacular

1
이것은 우리 서버의 수정이었습니다.
저스틴

1
이것은 나에게도 문제를 해결하는 것처럼 보였다.
anisoptera

1
ZWAMP를 사용하면 트릭을 수행 한 것 같습니다. 감사.
WernerCD

10
이것은 해결책이 아닙니다! 오류는 사라지지만 APC는 거의 비활성화됩니다. 메모리가 가득 찰 때마다 모든 캐시를 플러시합니다. Brideau가 우리에게 준 매뉴얼을 읽으십시오. php.net/manual/en/apc.configuration.php#ini.apc.ttl.
bokan

7

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


1
c33s가 말했듯이 : pecl.php.net/get/APC 추출을 다운로드하고 apc.php 를 실행하면 캐시 사용법을 보여주는 멋진 다이어그램이 있습니다.
bokan

4

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

위의 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


감사합니다. 올바른 솔루션을 지적했습니다. TTL을 낮추는 것은 APC를 비활성화하는 것과 같습니다.
bokan

4

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

2

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

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

apc.shm_size = 128M


1

인터넷을 보면 다양한 원인이있을 수 있습니다. 필자의 경우를 제외하고는 모든 것을 기본값으로 유지합니다 ...

apc.shm_size = 64M

... 내가 일찍오고 있다는 수많은 경고를 지 웠습니다.


1

OpenCart 설치를 다른 서버로 이동 한 후 "풀에 메모리를 할당 할 수 없습니다"라는 오류가 발생했습니다. 또한 memory_limit를 높이려고했습니다.

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

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

그런 다음 변경 사항을 적용하려면 아파치를 다시 시작해야했습니다.

apachectl restart

또는

sudo /etc/init.d/httpd restart

또는 시스템이 아파치를 다시 시작하는 데 사용하는 모든 것.

사이트가 공유 호스팅 인 경우 FTP 프로그램으로 파일 권한을 변경하거나 호스팅 제공 업체에 문의해야합니까?


1

이 문제를 해결하려면 apc.shm_size의 값을 정수로 설정 apc.ini 파일 (시스템 apc.ini 파일 위치 /etc/php5/conf.d/apc.ini)을 찾아서 설정하십시오. apc.shm_size = 1000


1

내 시스템에서 apc.shm_size = 64M을 /usr/local/etc/php.ini (FreeBSD 9.1)에 삽입 한 다음 apc.php를 보았을 때 (/ usr / local / share / doc / APC에서 복사했습니다. /apc.php to / usr / local / www / apache24 / data) 캐시 크기가 기본값 32M에서 64M으로 증가했으며 더 이상 큰 캐시 전체 수를 얻지 못했음을 발견했습니다.

참고 문헌 : http://au1.php.net/manual/en/apc.configuration.php 는 Bokan의 의견을 읽었으며 매우 도움이되었습니다.


0

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

이것은 문제를 해결합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.