it-swarm.dev

Apa yang menyebabkan "Tidak dapat mengalokasikan memori untuk kumpulan" di PHP?

Saya kadang-kadang berlari melawan batas alokasi memori server, terutama dengan aplikasi kembung seperti Wordpress, tetapi tidak pernah menemukan "Tidak dapat mengalokasikan memori untuk kumpulan" dan mengalami kesulitan melacak informasi apa pun.

Adakah yang tahu apa artinya ini? Saya sudah mencoba meningkatkan memory_limit tanpa hasil. Saya juga belum membuat perubahan signifikan pada aplikasi. Suatu hari tidak ada masalah, hari berikutnya saya menemukan kesalahan ini.

130
jonathanatx

Mungkin terkait APC.

Untuk orang-orang yang mengalami masalah ini, harap tentukan pengaturan .ini Anda. Khususnya pengaturan apc.mmap_file_mask Anda.

Untuk mmap yang didukung file, harus diatur ke sesuatu seperti:

apc.mmap_file_mask=/tmp/apc.XXXXXX

Untuk mmap langsung dari/dev/zero, gunakan:

apc.mmap_file_mask=/dev/zero

Untuk mmap yang didukung oleh POSIX yang didukung memori, gunakan:

apc.mmap_file_mask=/apc.shm.XXXXXX
89
Frankie

Menggunakan TTL dari 0 berarti APC akan mem-flush semua cache ketika kehabisan memori. Kesalahan tidak muncul lagi tetapi itu membuat APC jauh lebih efisien. Ini bukan risiko, tidak ada masalah, keputusan "Saya tidak ingin melakukan pekerjaan saya". APC tidak dimaksudkan untuk digunakan seperti itu. Anda harus memilih TTL cukup tinggi sehingga halaman yang paling banyak diakses tidak akan kedaluwarsa. Yang terbaik adalah memberikan memori yang cukup sehingga APC tidak perlu membersihkan cache.

Cukup baca manual untuk memahami bagaimana ttl digunakan: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

Solusinya adalah menambah memori yang dialokasikan untuk APC . Lakukan ini dengan meningkatkan apc.shm_size.

Jika APC dikompilasi untuk menggunakan Memori Segmen Bersama, Anda akan dibatasi oleh sistem operasi Anda. Ketik perintah ini untuk melihat batas sistem Anda untuk setiap segmen:

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

Untuk mengalokasikan lebih banyak memori, Anda harus menambah jumlah segmen dengan parameter apc.shm_segments.

Jika APC menggunakan memori mmap maka Anda tidak memiliki batas. Jumlah memori masih ditentukan oleh opsi apc.shm_size yang sama. 

Jika tidak ada cukup memori di server, maka gunakan opsi filter untuk mencegah cache file yang jarang diakses diakses.

Tapi jangan pernah menggunakan TTL dari 0.

Seperti c33s katakan, gunakan apc.php untuk memeriksa konfigurasi Anda. Salin file dari paket apc ke folder web dan arahkan browser ke sana. Anda akan melihat apa yang benar-benar dialokasikan dan bagaimana menggunakannya. Grafik harus tetap stabil setelah jam, jika mereka sepenuhnya berubah pada setiap refresh, maka itu berarti bahwa pengaturan Anda salah (APC menyiram semuanya). Alokasikan ram 20% lebih banyak dari apa yang benar-benar digunakan APC sebagai margin keamanan, dan periksa secara teratur.

Default hanya memungkinkan 32MB sangat rendah. PHP dirancang saat server 64MB dan sebagian besar skrip menggunakan satu file php per halaman. Saat ini solusi seperti Magento memerlukan lebih dari 10k file (~ 60Mb di APC). Anda harus mengizinkan memori yang cukup sehingga sebagian besar file php selalu di-cache. Ini bukan pemborosan, lebih efisien untuk menyimpan opcode di ram daripada memiliki php mentah yang sesuai dalam cache file . Saat ini kita dapat menemukan server khusus dengan memori 24Gb untuk $ 80/bulan, jadi jangan ragu untuk mengizinkan beberapa GB ke APC. Saya mengeluarkan 2GB dari 24GB di server yang menampung 5 toko Magento dan ~ 40 situs web wordpress, APC menggunakan 1.2GB. Hitung 64MB untuk instalasi Magento, 40MB untuk Wordpress dengan beberapa plugin.

Juga, jika Anda memiliki situs web development di server yang sama. Kecualikan dari cache.

123
bokan

solusi untuk saya:

  • apc.ttl = 0 
  • apc.shm_size = apa pun yang Anda inginkan

edit mulai

peringatan!

@bokan memberi tahu saya bahwa saya harus menambahkan peringatan di sini. 

jika Anda memiliki ttl 0 ini berarti setiap item yang di-cache dapat dibersihkan segera. jadi jika Anda memiliki ukuran cache yang kecil seperti 2mb dan ttl 0 ini akan membuat apc tidak berguna, karena data dalam cache selalu ditimpa.

menurunkan ttl berarti hanya bahwa cache tidak dapat menjadi penuh, hanya dengan item yang tidak dapat diganti.

jadi Anda harus memilih keseimbangan yang baik antara ttl dan ukuran cache.

dalam kasus saya, saya memiliki ukuran cache 1GB, jadi itu lebih dari cukup untuk saya.

edit akhir

memiliki masalah yang sama pada centos 5 dengan php 5.2.17 dan memperhatikan bahwa jika ukuran cache kecil dan parameter ttl adalah "tinggi" (seperti 7200) sementara .__ memiliki banyak file php untuk di-cache, maka cache terisi cukup cepat dan apc tidak menemukan apa pun yang dapat dihapus karena semua file dalam cache masih muat di ttl.

meningkatkan ukuran memori hanya merupakan bagian solusi, Anda masih menjalankan kesalahan ini jika Anda mengisi cache dan semua file berada dalam ttl.

jadi solusi saya adalah mengatur ttl ke 0, jadi apc mengisi cache ada kemungkinan untuk apc menghapus beberapa memori untuk newdata.

berharap itu bisa membantu

sunting: lihat juga: http://pecl.php.net/bugs/bug.php?id=16966

unduh http://pecl.php.net/get/APC ekstrak dan jalankan apc.php, di sana Anda memiliki diagram yang bagus bagaimana tampilan penggunaan cache

36
c33s

Menjalankan skrip apc.php adalah kunci untuk memahami apa masalah Anda, IMO. Ini membantu kami mengukur cache dengan benar dan untuk saat ini, tampaknya telah menyelesaikan masalah.

6
Brice D

Untuk pemula seperti saya, sumber daya ini membantu:

Menemukan file apc.ini untuk membuat perubahan yang direkomendasikan oleh c33s di atas, dan menetapkan jumlah yang disarankan: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

Memahami apa itu apc.ttl adalah: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

Memahami apa itu apc.shm_size adalah: http://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size

4
Brideau

Seperti yang disebutkan oleh Bokan, Anda dapat menaikkan memori jika tersedia, dan ia benar tentang bagaimana pengaturan kontra produktif TTL menjadi 0 adalah.

NotE: Ini adalah bagaimana saya memperbaiki kesalahan ini untuk masalah khusus saya. Ini masalah umum yang dapat disebabkan oleh banyak hal jadi ikuti saja di bawah ini jika Anda mendapatkan kesalahan dan Anda pikir itu disebabkan oleh duplikat PHP file yang sedang dimuat ke APC.

Masalah yang saya alami adalah ketika saya merilis versi baru aplikasi PHP saya. Yaitu mengganti semua file .php saya dengan yang baru APC akan memuat kedua versi ke dalam cache.

Karena saya tidak punya cukup memori untuk dua versi file php, APC akan kehabisan memori.

Ada opsi yang disebut apc.stat untuk memberitahu APC untuk memeriksa apakah file tertentu telah berubah dan jika begitu ganti itu, ini biasanya ok untuk pengembangan karena Anda terus membuat perubahan namun pada produksi biasanya dimatikan seperti pada saya case - http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

Mengaktifkan apc.stat akan memperbaiki masalah ini jika Anda setuju dengan hit kinerja.

Solusi yang saya temukan untuk masalah saya adalah memeriksa apakah versi proyek telah berubah dan jika demikian mengosongkan cache dan memuat kembali halaman. 

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);
}
4
Jase Whatson

Ini bekerja untuk orang-orang kami (menjalankan banyak situs Wordpress di server yang sama). 

Mengubah pengaturan memori dalam file /etc/php.d/apc.ini. Itu diatur ke 64M, jadi kami menggandakannya menjadi 128M.

apc.shm_size = 128M

2
Peter Drinnan

pada sistem saya, saya harus memasukkan apc.shm_size = 64M ke /usr/local/etc/php.ini( FreeBSD 9.1) kemudian ketika saya melihat apc.php (yang saya lihat disalin dari /usr/local/share/doc/APC/apc.php ke /usr/local/www/Apache24/data)i menemukan bahwa ukuran cache telah meningkat dari standar 32M ke 64M dan saya tidak lagi mendapatkan cache full count yang besar

referensi: http://au1.php.net/manual/en/apc.configuration.php Juga membaca komentar Bokan, mereka sangat membantu

1
andrew

Untuk mengatasi masalah ini tetapkan nilai untuk apc.shm_size sebagai integer.apc.shm_size = 1000

1
Bialy7

Melihat internet mungkin ada berbagai penyebab . Dalam kasus saya membiarkan semuanya default kecuali ...

apc.shm_size = 64M

... membersihkan peringatan yang tak terhitung jumlahnya yang saya dapatkan sebelumnya.

1
Leo

Saya menerima kesalahan "Tidak dapat mengalokasikan memori untuk kumpulan" setelah memindahkan instalasi OpenCart ke server yang berbeda. Saya juga mencoba menaikkan memory_limit.

Kesalahan berhenti setelah saya mengubah izin file dalam pesan kesalahan untuk memiliki akses tulis oleh pengguna yang dijalankan Apache (Apache, www-data, dll.). Alih-alih memodifikasi/etc/group secara langsung (atau chmod-ing file ke 0777), saya menggunakan usermod:

usermod -a -G vhost-user-group Apache-user

Kemudian saya harus me-restart Apache agar perubahan diterapkan:

apachectl restart

Atau

Sudo /etc/init.d/httpd restart

Atau apa pun yang digunakan sistem Anda untuk me-restart Apache.

Jika situs tersebut menggunakan hosting bersama, mungkin Anda harus mengubah izin file dengan program FTP, atau menghubungi penyedia hosting?

1
Brent Self

Pantau Ukuran File Cached Anda (Anda dapat menggunakan apc.php dari paket apc pecl) dan tingkatkan Apc.shm_size sesuai dengan kebutuhan Anda.

Ini menyelesaikan masalah.

0
lazcorp