PHP में "पूल के लिए मेमोरी आवंटित करने में असमर्थ" क्या कारण है?


133

मैं कभी-कभी किसी सर्वर की मेमोरी आवंटन सीमा के खिलाफ चला जाता हूं, विशेष रूप से Wordpress जैसे ब्लोटेड एप्लिकेशन के साथ, लेकिन कभी भी "पूल के लिए मेमोरी आवंटित करने में असमर्थ" और किसी भी जानकारी को ट्रैक करने में परेशानी नहीं हुई।

क्या किसी को पता है कि इसका क्या मतलब है? मैं memory_limitसफलता के बिना बढ़ाने की कोशिश की है । मैंने भी आवेदन में कोई महत्वपूर्ण बदलाव नहीं किया है। एक दिन कोई समस्या नहीं थी, अगले दिन मैंने यह त्रुटि की।

जवाबों:


90

संभवतः एपीसी संबंधित है।

इस समस्या वाले लोगों के लिए, आपको .ini सेटिंग निर्दिष्ट करें। विशेष रूप से आपके apc.mmap_file_mask सेटिंग।

फ़ाइल-समर्थित mmap के लिए, इसे कुछ इस तरह सेट किया जाना चाहिए:

apc.mmap_file_mask=/tmp/apc.XXXXXX

Mmap को सीधे / dev / शून्य से उपयोग करने के लिए:

apc.mmap_file_mask=/dev/zero

POSIX- संगत साझा-मेमोरी-समर्थित mmap के लिए, उपयोग करें:

apc.mmap_file_mask=/apc.shm.XXXXXX

धन्यवाद! ठीक वही लिंक है जिसकी मुझे तलाश थी। मदद की सराहना!
जोनाथनटैक्स

2
मैंने पाया है कि ये परिवर्तन इस समस्या को ठीक नहीं करते हैं, क्योंकि जुड़े हुए धागे पर टिप्पणी भी दस्तावेज़ ...
जोनाथन डे

3
इस एपीसी सेटिंग के लिए अधिक जानकारी: php.net/apc.configuration#ini.apc.mmap-file-mask
mikeytown2

2
मेरे मामले में मुझे त्रुटि से छुटकारा पाने के लिए फ़ाइल-समर्थित से POSIX- अनुरूप में बदलना पड़ा।
अत्तिला फुलॉप

4
मैं यह समझने की कोशिश में हूं कि यह समस्या कैसे हल करती है। क्या त्रुटि तब होती है जब file_maskइन मूल्यों में से एक नहीं है? अगर मेरे पास इनमें से एक मान है और मुझे त्रुटि मिल रही है, तो क्या मुझे इसे अलग स्विच करने की आवश्यकता है? कौनसा?
जेफ

125

0 की TTL का उपयोग करने का अर्थ है कि APC मेमोरी से बाहर निकलने पर सभी कैश को फ्लश कर देगा । त्रुटि अब दिखाई नहीं देती है लेकिन यह APC को कम कुशल बनाती है। यह कोई जोखिम नहीं है, कोई परेशानी नहीं है, "मैं अपना काम नहीं करना चाहता" निर्णय। एपीसी का उपयोग उस तरह से करने के लिए नहीं है। आपको एक टीटीएल पर्याप्त रूप से चुनना चाहिए ताकि सबसे अधिक एक्सेस किए गए पृष्ठ समाप्त न हों। सबसे अच्छा है पर्याप्त मेमोरी देना ताकि APC को कैश फ्लश करने की जरूरत न पड़े।

बस यह समझने के लिए मैनुअल पढ़ें कि ttl का उपयोग कैसे किया जाता है: http://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

इसका उपाय एपीसी को आवंटित मेमोरी को बढ़ाना है। इसे apc.shm_size बढ़ाकर करें।

यदि एपीसी को साझा सेगमेंट मेमोरी का उपयोग करने के लिए संकलित किया जाता है तो आप अपने ऑपरेटिंग सिस्टम द्वारा सीमित होंगे। प्रत्येक सेगमेंट के लिए अपनी सिस्टम सीमा देखने के लिए यह कमांड टाइप करें:

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

अधिक मेमोरी को अलग करने के लिए आपको पैरामीटर apc.shm_seolutions से सेगमेंट की संख्या बढ़ानी होगी।

यदि APC mmap मेमोरी का उपयोग कर रहा है तो आपकी कोई सीमा नहीं है। स्मृति की मात्रा को अभी भी उसी विकल्प apc.shm_size द्वारा परिभाषित किया गया है।

यदि सर्वर पर पर्याप्त मेमोरी नहीं है, तो कम अक्सर एक्सेस की गई php फ़ाइलों को कैश होने से रोकने के लिए फ़िल्टर विकल्प का उपयोग करें।

लेकिन कभी भी 0 के टीटीएल का उपयोग न करें।

जैसा कि c33s ने कहा, अपने कॉन्फिग को चेक करने के लिए apc.php का उपयोग करें। एप पैकेज से वेब फोल्डर और प्वाइंट ब्राउजर में फाइल कॉपी करें। आप देखेंगे कि वास्तव में क्या आवंटित किया गया है और इसका उपयोग कैसे किया जाता है। ग्राफ़ घंटों के बाद स्थिर रहना चाहिए, यदि वे प्रत्येक ताज़ा पर पूरी तरह से बदल रहे हैं, तो इसका मतलब है कि आपका सेटअप गलत है (एपीसी सब कुछ फ्लश कर रहा है)। एपीसी वास्तव में एक सुरक्षा मार्जिन के रूप में उपयोग करने की तुलना में 20% अधिक राम आवंटित करें, और इसे नियमित आधार पर जांचें।

केवल 32 एमबी की अनुमति देने का डिफ़ॉल्ट हास्यास्पद रूप से कम है। PHP तब डिज़ाइन किया गया था जब सर्वर 64MB थे और अधिकांश स्क्रिप्ट प्रति पृष्ठ एक php फ़ाइल का उपयोग कर रहे थे। आजकल Magento जैसे समाधान के लिए 10k से अधिक फ़ाइलों (APC में ~ 60Mb) की आवश्यकता होती है। आपको पर्याप्त मेमोरी की अनुमति देनी चाहिए ताकि ज्यादातर php फाइलें हमेशा कैश रहें। यह बेकार नहीं है, फ़ाइल कैश में संबंधित कच्ची php होने के बजाय ram में opcode रखना अधिक कुशल है। आजकल हम 24 जीबी मेमोरी के साथ समर्पित सर्वर को $ 80 / माह तक कम पा सकते हैं, इसलिए एपीसी को कई जीबी की अनुमति देने में संकोच न करें। मैंने 5Magento स्टोर और ~ 40 वर्डप्रेस वेबसाइट की मेजबानी करने वाले सर्वर पर 24GB में से 2GB डाल दिया, APC 1.2GB का उपयोग करता है। Magento स्थापना के लिए 64MB की गणना करें, कुछ प्लगइन्स के साथ एक Wordpress के लिए 40MB।

इसके अलावा, यदि आपके पास उसी सर्वर पर डेवलपमेंट वेबसाइट्स हैं। उन्हें कैश से बाहर निकालें।


2
यह! मैं Wordpress चला रहा हूँ और 32M पर्याप्त नहीं था। 64M तक और अब स्पष्ट में। Apc.php लोगों की जाँच करें!
डेव डॉगर

अच्छा उत्तर! +1 धन्यवाद।
कोस्टानोस

64M तक बढ़ाने के लिए आपको apc.shm_size = 64 जोड़ने की आवश्यकता है और apc.shm_size = 64M (सबसे अधिक उदाहरण जो मैंने एम को सबसे अंत में देखा है) apc के मेरे संस्करण पर काम नहीं किया (v3.1.31.1)
पैट्रिक

1
आप यह मान रहे हैं कि आपके पास बहुत सारी कैश की गई फाइलें होंगी जो TTL से अधिक कैश में हैं। c33s का एक महत्वपूर्ण बिंदु है। यदि सब कुछ हाल ही में एक्सेस किया गया था (मान लें कि आपके पास 70% कैश है जो हर समय आपके पास पहुंच जाता है, जैसे कि आप चाहते हैं और एक बड़ी स्पाइक है जहां बहुत सारी अतिरिक्त असंगत फ़ाइलों को एक साथ जोड़ा जाता है), तो आपको त्रुटियां होने वाली हैं TTL सेकंड के लिए फेंक दिया। कैश भरा हुआ है, और आपने एपीसी को बताया कि यह इन प्रविष्टियों को साफ नहीं करना चाहिए ताकि यह शिकायत करे। यदि आपके पास 5 घंटे के लिए टीटीएल है, तो आप 5 घंटे की त्रुटियों के साथ समाप्त हो जाते हैं, जो कि उन अपूर्ण फाइलों के समाप्त होने की प्रतीक्षा कर रहे हैं।
मैथ्यू कोल्ब

@MatthewKolb: आपको एपीसी से अधिक फाइलों को कैशिंग करने की अनुमति नहीं देनी चाहिए जो इसकी मेमोरी में हो। कैश्ड होने के लिए अपूर्ण रूप से एक्सेस की गई फ़ाइलों को रोकने के लिए फ़िल्टर का उपयोग करें।
बोकाँ

36

मेरे लिए समाधान:

  • apc.ttl = 0
  • apc.shm_size = कुछ भी आप चाहते हैं

प्रारंभ संपादित करें

चेतावनी!

@ बोकन ने मुझे संकेत दिया कि मुझे यहां एक चेतावनी जोड़नी चाहिए।

यदि आपके पास 0 का ttl है तो इसका अर्थ है कि प्रत्येक कैश्ड वस्तु को तुरंत शुद्ध किया जा सकता है। इसलिए यदि आपके पास छोटे कैश का आकार 2mb और 0 का ttl है तो यह एप को बेकार कर देगा, क्योंकि कैश में डेटा हमेशा ओवरराइट हो जाता है।

ttl को कम करने का मतलब केवल इतना है कि कैश पूर्ण नहीं बन सकता, केवल उन वस्तुओं के साथ जिन्हें बदला नहीं जा सकता है।

इसलिए आपको ttl और cache size के बीच एक अच्छा संतुलन चुनना होगा।

मेरे मामले में मेरे पास 1gb का कैश आकार था, इसलिए यह मेरे लिए पर्याप्त से अधिक था।

अंत संपादित करें

सेन्टर्स 5 पर php 5.2.17 के साथ एक ही मुद्दा था और ध्यान दिया कि यदि कैश का आकार छोटा है और ttl पैरामीटर कैश के लिए बहुत सी php फाइल होने के दौरान "उच्च" (7200 की तरह) है, तो कैश बहुत तेजी से भरता है और एपीसी को कुछ भी नहीं मिलता है जिसे वह हटा सकता है क्योंकि कैश की सभी फाइलें अभी भी टीटीएल में फिट होती हैं।

मेमोरी का आकार बढ़ाना केवल एक हिस्सा समाधान है, आप अभी भी इस त्रुटि में चलते हैं यदि आप कैश भरते हैं और सभी फाइलें ttl के भीतर हैं।

इसलिए मेरा समाधान 0 से ttl को सेट करना था, इसलिए apc कैश को भरता है नए डेटा के लिए कुछ मेमोरी को साफ़ करने के लिए apc के लिए संभावना है।

उम्मीद है की वो मदद करदे

संपादित करें: यह भी देखें: http://pecl.php.net/bugs/bug.php?id=16966

http://pecl.php.net/get/APC अर्क डाउनलोड करें और एपीपीएफपी को चलाएं, वहां आपके पास एक अच्छा आरेख है कि आपका कैश उपयोग कैसा दिखता है


2
धन्यवाद, इससे मदद मिली। मुझे प्रति सेकंड एक दर्जन "मेमोरी आवंटित करने में असमर्थ" त्रुटियां मिल रही थीं। मैंने अपने कैश आकार (32 से 64 एमबी) को दोगुना कर दिया और ttl को 0. पर गिरा दिया। इन त्रुटियों को पूरी तरह से हटा दिया।
23'11

1
यह हमारे सर्वर पर फिक्स था।
जस्टिन

1
यह मेरे लिए भी समस्या को ठीक करने के लिए लग रहा था।
anisoptera

1
ZWAMP का उपयोग करना और ऐसा लगता है कि चाल भी किया है। धन्यवाद।
वर्नरसीडी

10
यह कोई हल नहीं है! त्रुटि समाप्त हो जाती है लेकिन APC लगभग अक्षम हो जाएगा। हर बार मेमोरी फुल होने पर यह सभी कैश को फ्लश कर देगा। बस मैनुअल Brideau पढ़ें हमें दिया है। php.net/manual/en/apc.configuration.php#ini.apc.ttl।
बोकेन

7

Apc.php स्क्रिप्ट को चलाने से यह समझने में महत्वपूर्ण है कि आपकी समस्या क्या है, IMO। इससे हमें अपने कैश को ठीक से आकार देने में मदद मिली और फिलहाल, समस्या का समाधान हो गया है।


1
के रूप में c33s ने कहा: pecl.php.net/get/APC निकालने को डाउनलोड करें और apc.php को चलाएं, आपके पास एक अच्छा आरेख है कि आपका कैश उपयोग कैसा दिखता है
bokan

4

खुद की तरह newbies के लिए, इन संसाधनों में मदद की:

ऊपर दिए गए c33 द्वारा अनुशंसित परिवर्तन करने के लिए apc.ini फ़ाइल ढूंढना, और अनुशंसित मात्राएँ सेट करना: http://www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

समझना कि एपर्टल क्या है: 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 को अक्षम करने जैसा है।
बोकेन

4

जैसा कि बोकन ने उल्लेख किया है, यदि आप उपलब्ध हो तो मेमोरी को बढ़ा सकते हैं, और वह सही है कि टीटीएल 0 से उत्पादक सेटिंग कैसे काउंटर है।

नोट: यह है कि मैंने अपनी विशेष समस्या के लिए यह त्रुटि कैसे तय की। इसका एक सामान्य मुद्दा है जो चीजों के आवंटन के कारण हो सकता है इसलिए केवल नीचे का अनुसरण करें यदि आपको त्रुटि मिलती है और आपको लगता है कि इसका कारण डुप्लिकेट PHP फ़ाइलों को एपीसी में लोड किया जा रहा है।

जब मैं अपने PHP आवेदन का एक नया संस्करण जारी किया था, तब मैं यह कर रहा था। यानी मेरे सभी .php फाइलों को नए लोगों के साथ बदल दिया है APC दोनों संस्करणों को कैश में लोड करेगा।

क्योंकि मैं php फ़ाइलों के दो संस्करणों के लिए पर्याप्त मेमोरी नहीं है APC स्मृति से बाहर चला जाएगा।

एपीसी को बताने के लिए एपीसीस्टैट नामक एक विकल्प है, यह जांचने के लिए कि क्या कोई विशेष फ़ाइल बदल गई है और यदि इसे प्रतिस्थापित किया जाता है, तो यह आम तौर पर विकास के लिए ठीक है क्योंकि आप उत्पादन में लगातार बदलाव कर रहे हैं लेकिन आमतौर पर उत्पादन बंद हो जाता है क्योंकि यह मेरे साथ था मामला - http://www.php.net/manual/en/apc.configuration.php#ini.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 (या फ़ाइलों को ०,,, पर chmod-ing), मैंने usermod का उपयोग किया:

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

फिर मुझे परिवर्तन को प्रभावी करने के लिए अपाचे को फिर से शुरू करना पड़ा:

apachectl restart

या

sudo /etc/init.d/httpd restart

या अपाचे को पुनरारंभ करने के लिए आपका सिस्टम जो भी उपयोग करता है।

यदि साइट साझा होस्टिंग पर है, तो शायद आपको एफ़टीपी प्रोग्राम के साथ फ़ाइल अनुमतियों को बदलना होगा, या होस्टिंग प्रदाता से संपर्क करना होगा?


1

इस समस्या को हल करने के लिए apc.shm_size के लिए मान सेट करें पूर्णांक के रूप में अपनी apc.ini फ़ाइल का पता लगाएँ (मेरे सिस्टम में apc.ini फ़ाइल स्थान /etc/php5/conf.d/apc.ini) और सेट करें: apshsh_size = 1000


1

मेरे सिस्टम पर मुझे apc.shm_size = 64M को /usr/local/etc/php.ini (FreeBSD 9.1) में डालना था, तब जब मैंने apc.php को देखा (जिसे मैंने / usr / लोकल / शेयर / doc / APC से कॉपी किया था) /apc.php to / usr / local / www / apache24 / data) मैंने पाया कि कैश का आकार 32M के डिफ़ॉल्ट से 64M तक बढ़ गया था और मुझे अब बड़ी कैश पूरी गिनती नहीं मिल रही थी

संदर्भ: http://au1.php.net/manual/en/apc.configuration.php ने भी बोकन की टिप्पणियों को पढ़ा, वे बहुत सहायक थे


0

अपने कैश्ड फ़ाइल साइज़ की निगरानी करें (आप एपीसी पीईसीएल पैकेज से एपीआरईएफपी का उपयोग कर सकते हैं) और अपनी आवश्यकताओं के अनुसार apc.shm_size बढ़ाएं।

इससे समस्या हल हो जाती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.