Điều gì gây ra không thể phân bổ bộ nhớ cho nhóm pool trong PHP?


133

Thỉnh thoảng tôi gặp phải giới hạn phân bổ bộ nhớ của máy chủ, đặc biệt là với một ứng dụng cồng kềnh như Wordpress, nhưng chưa bao giờ gặp phải "Không thể phân bổ bộ nhớ cho nhóm" và gặp khó khăn khi theo dõi bất kỳ thông tin nào.

Có ai biết điều này? Tôi đã cố gắng tăng memory_limitmà không thành công. Tôi cũng chưa thực hiện bất kỳ thay đổi đáng kể nào cho ứng dụng. Một ngày không có vấn đề gì, ngày hôm sau tôi gặp lỗi này.

Câu trả lời:


90

Có lẽ là liên quan đến APC.

Đối với những người gặp vấn đề này, vui lòng chỉ định cho bạn cài đặt .ini. Cụ thể là cài đặt apc.mmap_file_mask của bạn.

Đối với mmap được hỗ trợ tệp, nó nên được đặt thành một cái gì đó như:

apc.mmap_file_mask=/tmp/apc.XXXXXX

Để mmap trực tiếp từ / dev / zero, sử dụng:

apc.mmap_file_mask=/dev/zero

Đối với mmap được hỗ trợ bộ nhớ chia sẻ tuân thủ POSIX, hãy sử dụng:

apc.mmap_file_mask=/apc.shm.XXXXXX

Cảm ơn! Đó chính xác là liên kết mà tôi đang tìm kiếm. Đánh giá cao sự giúp đỡ!
jonathanatx

2
Tôi thấy rằng những thay đổi này không khắc phục được vấn đề, vì các nhận xét về chủ đề được liên kết cũng ghi lại ...
Ngày Jonathan

3
Thông tin thêm cho khung cảnh APC này: php.net/apc.configuration#ini.apc.mmap-file-mask
mikeytown2

2
Trong trường hợp của tôi, tôi đã phải thay đổi từ sao lưu tệp thành tuân thủ POSIX để thoát khỏi lỗi.
Attila Fulop

4
Tôi không thể hiểu được câu trả lời này giải quyết vấn đề như thế nào. Có lỗi xảy ra khi file_maskkhông phải là một trong những giá trị này? Nếu tôi có một trong những giá trị này và tôi đang gặp lỗi, tôi có cần chuyển nó sang một giá trị khác không? Cái nào?
Jeff

125

Sử dụng TTL bằng 0 có nghĩa là APC sẽ xóa tất cả bộ đệm khi hết bộ nhớ. Lỗi không xuất hiện nữa nhưng nó làm cho APC kém hiệu quả hơn nhiều. Đó là một rủi ro, không có rắc rối, quyết định "Tôi không muốn làm việc của mình". APC không có nghĩa là được sử dụng theo cách đó. Bạn nên chọn một TTL đủ cao để các trang được truy cập nhiều nhất sẽ không hết hạn. Cách tốt nhất là cung cấp đủ bộ nhớ để APC không cần xóa bộ đệm.

Chỉ cần đọc hướng dẫn để hiểu cách sử dụng ttl: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

Giải pháp là tăng bộ nhớ được phân bổ cho APC. Làm điều này bằng cách tăng apc.shm_size.

Nếu APC được biên dịch để sử dụng Bộ nhớ phân đoạn chung, bạn sẽ bị giới hạn bởi hệ điều hành. Nhập lệnh này để xem giới hạn hệ thống của bạn cho từng phân đoạn:

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

Để sắp xếp thêm bộ nhớ, bạn sẽ phải tăng số lượng phân đoạn với tham số apc.shm_segments.

Nếu APC đang sử dụng bộ nhớ mmap thì bạn không có giới hạn. Dung lượng bộ nhớ vẫn được xác định bởi cùng tùy chọn apc.shm_size.

Nếu không đủ bộ nhớ trên máy chủ, thì hãy sử dụng tùy chọn bộ lọc để ngăn các tệp php ít truy cập thường xuyên hơn được lưu vào bộ nhớ cache.

Nhưng không bao giờ sử dụng TTL bằng 0.

Như c33s đã nói, sử dụng apc.php để kiểm tra cấu hình của bạn. Sao chép tệp từ gói apc vào trình duyệt web và trỏ trình duyệt tới nó. Bạn sẽ thấy những gì thực sự được phân bổ và làm thế nào nó được sử dụng. Các biểu đồ phải duy trì ổn định sau nhiều giờ, nếu chúng thay đổi hoàn toàn ở mỗi lần làm mới, điều đó có nghĩa là thiết lập của bạn sai (APC đang xóa mọi thứ). Phân bổ ram nhiều hơn 20% so với những gì APC thực sự sử dụng làm giới hạn bảo mật và kiểm tra nó một cách thường xuyên.

Mặc định chỉ cho phép 32 MB là cực kỳ thấp. PHP được thiết kế khi các máy chủ có dung lượng 64 MB và hầu hết các tập lệnh đang sử dụng một tệp php trên mỗi trang. Ngày nay, các giải pháp như Magento yêu cầu hơn 10 nghìn tệp (~ 60Mb trong APC). Bạn nên cho phép đủ bộ nhớ để hầu hết các tệp php luôn được lưu trữ. Không có gì lãng phí, sẽ hiệu quả hơn khi giữ opcode trong ram thay vì có php thô tương ứng trong bộ đệm tệp. Ngày nay, chúng ta có thể tìm thấy các máy chủ chuyên dụng có bộ nhớ 24Gb với mức giá thấp nhất là $ 80 / tháng, vì vậy đừng ngần ngại cho phép vài GB cho APC. Tôi đặt 2GB trong số 24GB trên một máy chủ lưu trữ các cửa hàng 5Magento và ~ 40 trang web wordpress, APC sử dụng 1,2GB. Đếm 64MB cho cài đặt Magento, 40 MB cho Wordpress với một số plugin.

Ngoài ra, nếu bạn có các trang web phát triển trên cùng một máy chủ. Loại trừ chúng khỏi bộ nhớ cache.


2
Điều này! Tôi đang chạy Wordpress và 32M là không đủ. Lên đến 64M và bây giờ rõ ràng. Kiểm tra người apc.php!
Dave Drager

Câu trả lời tốt! +1 Cảm ơn.
Kostanos

Để tăng lên 64M, bạn cần thêm apc.shm_size = 64 chứ không phải apc.shm_size = 64M (hầu hết ví dụ tôi thấy có M ở cuối) Không hoạt động trên phiên bản apc của tôi (v3.1.3p1)
Patrick Quên

1
Bạn đang giả định rằng bạn sẽ có nhiều tệp được lưu trong bộ nhớ cache lâu hơn so với TTL. c33s có một điểm quan trọng. Nếu mọi thứ được truy cập gần đây (giả sử bạn có 70% bộ nhớ cache được truy cập mọi lúc như bạn muốn và có một đột biến lớn khi có rất nhiều tệp không thường xuyên được thêm vào cùng một lúc), bạn sẽ gặp lỗi ném trong vài giây. Bộ nhớ cache đã đầy và bạn nói với APC rằng nó không nên xóa các mục này để nó phàn nàn. Nếu bạn có TTL trong 5 giờ, bạn sẽ có các lỗi đáng giá trong 5 giờ chờ đợi các tệp không thường xuyên đó hết hạn.
Matthew Kolb

@MatthewKolb: Bạn không nên cho phép lưu trữ nhiều tệp hơn APC có thể giữ trong bộ nhớ của nó. Sử dụng các bộ lọc để ngăn chặn các tệp được truy cập không thường xuyên được lưu vào bộ đệm.
chuyến đi

36

giải pháp cho tôi:

  • apc.ttl = 0
  • apc.shm_size = bất cứ điều gì bạn muốn

chỉnh sửa bắt đầu

cảnh báo!

@bokan chỉ cho tôi rằng tôi nên thêm một cảnh báo ở đây.

nếu bạn có ttl bằng 0, điều này có nghĩa là mọi mục được lưu trong bộ nhớ cache có thể bị xóa ngay lập tức. vì vậy nếu bạn có kích thước bộ đệm nhỏ như 2mb và ttl bằng 0 thì điều này sẽ khiến apc trở nên vô dụng, vì dữ liệu trong bộ đệm luôn bị ghi đè.

giảm ttl có nghĩa là chỉ bộ đệm không thể đầy, chỉ với các mục không thể thay thế.

vì vậy bạn phải chọn một sự cân bằng tốt giữa kích thước ttl và bộ đệm.

trong trường hợp của tôi, tôi có kích thước bộ nhớ cache là 1gb, vì vậy nó là quá đủ cho tôi.

chỉnh sửa kết thúc

gặp vấn đề tương tự trên centos 5 với php 5.2.17 và nhận thấy rằng nếu kích thước bộ đệm nhỏ và tham số ttl là "cao" (như 7200) trong khi có rất nhiều tệp php để lưu vào bộ đệm, thì bộ đệm sẽ lấp đầy khá nhanh và apc không tìm thấy bất cứ thứ gì nó có thể xóa vì tất cả các tệp trong bộ đệm vẫn phù hợp với ttl.

tăng kích thước bộ nhớ chỉ là một giải pháp một phần, bạn vẫn chạy trong lỗi này nếu bộ đệm của bạn đầy lên và tất cả các tệp nằm trong ttl.

Vì vậy, giải pháp của tôi là đặt ttl thành 0, vì vậy apc sẽ lấp đầy bộ đệm và luôn có khả năng apc sẽ xóa một số bộ nhớ cho dữ liệu mới.

mong rằng sẽ giúp

chỉnh sửa: xem thêm: http://pecl.php.net/bugs/orms.php?id=16966

tải xuống http://pecl.php.net/get/APC giải nén và chạy apc.php, ở đó bạn có một sơ đồ đẹp về cách sử dụng bộ đệm của bạn trông như thế nào


2
Cảm ơn bạn, điều này đã giúp. Tôi đã nhận được khoảng một tá lỗi "Không thể phân bổ bộ nhớ" mỗi giây. Tôi đã tăng gấp đôi kích thước bộ nhớ cache của mình (32 đến 64 MB) và giảm ttl xuống 0. Điều đó đã loại bỏ hoàn toàn các lỗi này.
biệt danh

1
Đây là bản sửa lỗi trên máy chủ của chúng tôi.
Justin

1
Điều này dường như để khắc phục vấn đề cho tôi là tốt.
anisoptera

1
Sử dụng ZWAMP và điều này dường như cũng đã thực hiện thủ thuật này. Cảm ơn.
WernerCD

10
Đây không phải là một giải pháp! Lỗi không hoạt động nhưng APC sẽ gần như bị vô hiệu hóa. Nó sẽ xóa tất cả bộ nhớ cache mỗi khi bộ nhớ đầy. Chỉ cần đọc hướng dẫn của Brideau đã cho chúng tôi. php.net/manual/en/apc.configuration.php#ini.apc.ttl.
xe đẩy

7

Chạy tập lệnh apc.php là chìa khóa để hiểu vấn đề của bạn là gì, IMO. Điều này giúp chúng tôi kích thước bộ đệm của chúng tôi đúng cách và hiện tại, dường như đã giải quyết được vấn đề.


1
như c33s đã nói: tải xuống pecl.php.net/get/APC giải nén và chạy apc.php, ở đó bạn có một sơ đồ đẹp về cách sử dụng bộ đệm của bạn trông như thế nào
bokan

4

Đối với những người mới như tôi, những tài nguyên này đã giúp:

Tìm tệp apc.ini để thực hiện các thay đổi được đề xuất bởi các c33 ở trên và đặt số tiền được đề xuất: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

Hiểu apc.ttl là gì: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

Hiểu apc.shm_size là gì: http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size


Cảm ơn, bạn đã chỉ ra giải pháp đúng. Giảm TTL cũng giống như vô hiệu hóa APC.
xe đẩy

4

Như Bokan đã đề cập, bạn có thể tăng bộ nhớ nếu có, và anh ta nói đúng về cách cài đặt hiệu quả của bộ đếm đối với 0 thành 0.

NotE: Đây là cách tôi sửa lỗi này cho vấn đề cụ thể của mình. Đây là một vấn đề chung có thể được gây ra bởi sự phân bổ của mọi thứ, vì vậy chỉ làm theo những điều dưới đây nếu bạn gặp lỗi và bạn nghĩ rằng đó là do các tệp PHP trùng lặp được tải vào APC.

Vấn đề tôi gặp phải là khi tôi phát hành phiên bản mới của ứng dụng PHP. Tức là thay thế tất cả các tệp .php của tôi bằng các tệp mới APC sẽ tải cả hai phiên bản vào bộ đệm.

Bởi vì tôi không có đủ bộ nhớ cho hai phiên bản tệp php, APC sẽ hết bộ nhớ.

Có một tùy chọn được gọi là apc.stat để báo cho APC kiểm tra xem một tệp cụ thể đã thay đổi hay chưa và nếu thay thế nó, điều này thường được chấp nhận vì bạn liên tục thực hiện các thay đổi tuy nhiên khi sản xuất thường bị tắt như trong tôi trường hợp - http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

Bật apc.stat sẽ khắc phục vấn đề này nếu bạn ổn với hiệu suất.

Giải pháp tôi đưa ra cho vấn đề của mình là kiểm tra xem phiên bản dự án có thay đổi hay không và nếu trống thì bộ đệm và tải lại trang.

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

Điều này làm việc cho các chàng trai của chúng tôi (chạy một loạt các trang web Wordpress trên cùng một máy chủ).

Thay đổi cài đặt bộ nhớ trong tệp /etc/php.d/apc.ini. Nó được đặt thành 64M, vì vậy chúng tôi đã nhân đôi nó lên 128M.

apc.shm_size = 128M


1

Nhìn vào các internets có thể có nhiều nguyên nhân. Trong trường hợp của tôi để mọi thứ mặc định ngoại trừ ...

apc.shm_size = 64M

... Xóa vô số cảnh báo mà tôi đã nhận được trước đó.


1

Tôi đã nhận được lỗi "Không thể phân bổ bộ nhớ cho nhóm" sau khi di chuyển cài đặt OpenCart sang một máy chủ khác. Tôi cũng đã thử nâng cao bộ nhớ_limit.

Lỗi đã dừng sau khi tôi thay đổi quyền của tệp trong thông báo lỗi để người dùng có quyền truy cập ghi mà apache chạy dưới dạng (apache, www-data, v.v.). Thay vì trực tiếp sửa đổi / etc / nhóm (hoặc chmod-ing các tệp thành 0777), tôi đã sử dụng usermod:

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

Sau đó, tôi phải khởi động lại apache để thay đổi có hiệu lực:

apachectl restart

Hoặc là

sudo /etc/init.d/httpd restart

Hoặc bất cứ điều gì hệ thống của bạn sử dụng để khởi động lại apache.

Nếu trang web được lưu trữ chia sẻ, có lẽ bạn phải thay đổi quyền truy cập tệp bằng chương trình FTP hoặc liên hệ với nhà cung cấp dịch vụ lưu trữ?


1

Để giải quyết vấn đề này, đặt giá trị cho apc.shm_size dưới dạng số nguyên Xác định vị trí tệp apc.ini của bạn (Trong hệ thống tệp apc.ini của tôi vị trí /etc/php5/conf.d/apc.ini) và đặt: apc.shm_size = 1000


1

trên hệ thống của tôi, tôi đã phải chèn apc.shm_size = 64M vào /usr/local/etc/php.ini (FreeBSD 9.1) sau đó khi tôi xem apc.php (mà tôi đã sao chép từ / usr / local / share / doc / APC /apc.php đến / usr / local / www / apache24 / data) tôi thấy rằng kích thước bộ đệm đã tăng từ mặc định 32M lên 64M và tôi không còn nhận được số lượng bộ nhớ cache lớn nữa

tài liệu tham khảo: http://au1.php.net/manual/en/apc.configuration.php cũng đọc bình luận của Bokan, chúng rất hữu ích


0

Theo dõi Kích thước tệp được lưu trong bộ nhớ cache của bạn (bạn có thể sử dụng apc.php từ gói apc pecl) và tăng apc.shm_size theo nhu cầu của bạn.

Điều này giải quyết vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.