2012-08-01 18 views
27

सभी का आवंटन नहीं कर सकता: यहाँ 'free -m'redis bgsave विफल हो गया क्योंकि कांटा स्मृति

   total  used  free  shared buffers  cached 
Mem:   64433  49259  15174   0   3   31 
-/+ buffers/cache:  49224  15209 
Swap:   8197  184  8012 

मेरी redis-सर्वर 46g स्मृति का उपयोग किया गया है के साथ अपने सर्वर स्मृति जानकारी है, वहाँ लगभग 15 जी स्मृति मुक्त छोड़ दिया है

मेरे ज्ञान के रूप में, कांटा लिखने पर प्रतिलिपि है, 15 जी मुक्त स्मृति होने पर यह विफल नहीं होना चाहिए, जो आवश्यक कर्नेल संरचनाओं को मॉलोक करने के लिए पर्याप्त है।

इसके अलावा, जब रेडिस-सर्वर 42 जी मेमोरी का उपयोग करता है, तो bgsave ठीक है और कांटा भी ठीक है।

क्या कोई वीएम पैरामीटर है जो मैं कांटा वापसी सफलता बनाने के लिए ट्यून कर सकता हूं?

धन्यवाद।

+0

'डबल' प्राप्त करें 'अधिक स्मृति – surfer190

उत्तर

14
proc (5) से

:

/proc/sys/vm/overcommit_memory 
       This file contains the kernel virtual memory accounting mode. Values are: 
       0: heuristic overcommit (this is the default) 
       1: always overcommit, never check 
       2: always check, never overcommit 
       In mode 0, calls of mmap(2) with MAP_NORESERVE set are not checked, and the default check is very weak, leading to the risk of getting a process "OOM-killed". Under Linux 2.4 
       any non-zero value implies mode 1. In mode 2 (available since Linux 2.6), the total virtual address space on the system is limited to (SS + RAM*(r/100)), where SS is the size 
       of the swap space, and RAM is the size of the physical memory, and r is the contents of the file /proc/sys/vm/overcommit_ratio. 
46

अधिक विशेष रूप से, से Redis FAQ

Redis पृष्ठभूमि बचत स्कीमा पर निर्भर करता है कॉपी-ऑन-लिखना आधुनिक ऑपरेटिंग सिस्टम में कांटा का अर्थ: Redis कांटे (एक बाल प्रक्रिया बनाता है) जो माता-पिता की एक सटीक प्रति है। बाल प्रक्रिया डीबी को डिस्क पर डंप करती है और अंततः बाहर निकलती है। सिद्धांत रूप में बच्चे को माता-पिता की प्रतिलिपि के रूप में ज्यादा स्मृति का उपयोग करना चाहिए, लेकिन वास्तव में अधिकांश आधुनिक ऑपरेटिंग सिस्टम द्वारा कार्यान्वित प्रति-लेखन-लेखन अर्थशास्त्र के लिए धन्यवाद माता-पिता और बाल प्रक्रिया सामान्य स्मृति पृष्ठों को साझा करेगी। एक पृष्ठ केवल तभी डुप्लीकेट किया जाएगा जब यह बच्चे में या माता-पिता में बदलता है। चूंकि सिद्धांत में बच्चे की प्रक्रिया सहेजने के दौरान सभी पेज बदल सकते हैं, लिनक्स पहले से नहीं बता सकता कि बच्चा कितना मेमोरी लेगा, इसलिए यदि ओवरकॉमिट_मेमरी सेटिंग शून्य फोर्क पर सेट की गई है तो असफल हो जाएगी जब तक कि बहुत ज्यादा रैम न हो वास्तव में सभी अभिभावक स्मृति पृष्ठों को डुप्लिकेट करने की आवश्यकता है, जिसके परिणामस्वरूप यदि आपके पास 3 जीबी का रेडिस डेटासेट है और केवल 2 जीबी की मुफ्त मेमोरी है तो यह असफल हो जाएगी।

ओवरकमिट_मेमरी 1 को सेट करना कहता है कि लिनक्स आराम करने और अधिक आशावादी आवंटन फैशन में कांटा करने के लिए कहता है, और यह वास्तव में रेडिस के लिए आप चाहते हैं।

रेडिस को उतनी मेमोरी की आवश्यकता नहीं है क्योंकि ओएस सोचता है कि यह डिस्क पर लिखने के लिए करता है, इसलिए पहले से ही कांटा विफल हो सकता है।

29

संशोधित /etc/sysctl.conf और जोड़ने

vm.overcommit_memory=1 

फिर

FreeBSD पर से sysctl पुनः आरंभ: $ sudo /etc/rc.d/sysctl को फिर से लोड

पर लिनक्स: $ sudo sysctl -p /etc/sysctl.conf

संबंधित मुद्दे