90% फ्री मेमोरी कैसे भरें?


181

मैं कुछ कम-संसाधन परीक्षण करना चाहता हूं और इसके लिए मुझे 90% मुफ्त मेमोरी पूर्ण होनी चाहिए।

मैं इसे एक *nixसिस्टम पर कैसे कर सकता हूं ?


3
क्या यह वास्तव में किसी भी * निक्स प्रणाली पर काम करना है?
बजे एक CVn

31
मेमोरी को भरने के बजाय, क्या आप वीएम (डॉकटर, या आवारा या कुछ इसी तरह का उपयोग करके) बना सकते हैं जिसमें सीमित मात्रा में मेमोरी है?
abendigo

4
@abendigo एक क्यूए के लिए यहां प्रस्तुत कई समाधान उपयोगी हैं: एक सामान्य उद्देश्य के लिए ओएस एक विशिष्ट मंच के बिना वीएम या कर्नेल बूट पैरामीटर उपयोगी हो सकते हैं, लेकिन एक एम्बेडेड सिस्टम के लिए जहां आप लक्षित प्रणाली की मेमोरी विनिर्देश जानते हैं। मुफ्त मेमोरी भरने के लिए जाएं।
एडुआर्ड फ्लोरिनेसस्कु

2
मामले में किसी और को यहाँ स्कोर करने से थोड़ा धक्का लगा है: meta.unix.stackexchange.com/questions/1513/… ?
गोल्डीलॉक्स

इसे भी देखें: unix.stackexchange.com/a/1368/52956
Wilf

जवाबों:


156

stress-ng एक वर्कलोड जनरेटर है जो POSIX सिस्टम पर सीपीयू / मेम / io / hdd तनाव का अनुकरण करता है। यह कॉल लिनक्स <3.14 पर चाल करना चाहिए:

stress-ng --vm-bytes $(awk '/MemFree/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

लिनक्स> = 3.14 के लिए, आप MemAvailableस्वैपिंग के बिना नई प्रक्रियाओं के लिए उपलब्ध मेमोरी का अनुमान लगाने के बजाय उपयोग कर सकते हैं :

stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

/ / आदि के /proc/meminfoसाथ कॉल को अनुकूलित करें । अगर आपको इसकी आवश्यकता पोर्टेबल है।free(1)vm_stat(1)


3
तनाव --vm-बाइट्स $ (awk '/ MemFree / {printf "% d \ n", $ * * 0.097;}' </ proc / meminfo) k --vm-keep -m 10
रॉबर्ट

1
मेम्फ्री का ज्यादातर हिस्सा OS द्वारा रखा जाता है, इसलिए मैंने इसके बजाय MemAvailable का इस्तेमाल किया। इसने मुझे सेंट ओएस 7.stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.98;}' < /proc/meminfo)k --vm-keep -m 1
कुजि

पता करने के लिए अच्छा है, मेमवैलिड "स्वैपिंग के बिना नए एप्लिकेशन शुरू करने के लिए कितनी मेमोरी उपलब्ध है, इसका अनुमान" में जोड़ा गया था, देखें git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/ ... और git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/...
tkrennwa

1
एक अतिरिक्त नोट के रूप में, दोनों प्रदान करना --vm 1 and --vm-keepबहुत महत्वपूर्ण है। बस --vm-bytesकुछ नहीं करता है और आपको यह सोचने में गुमराह किया जा सकता है कि आप उतनी मेमोरी आवंटित कर सकते हैं जितनी आपको आवश्यकता है / चाहते हैं। जब तक मैं अपने आप को 256G मेमोरी के आवंटन द्वारा स्वयं की जांच करने की कोशिश करता हूं, तब तक मुझे यह थोड़ा सा मिला। यह उत्तर में एक दोष नहीं है, यह सही झंडे प्रदान करता है, बस एक अतिरिक्त सावधानी।
ffledgling

यही कारण है कि वहाँ है -m 1। स्ट्रेस मैनपेज के अनुसार, इसके -m Nलिए छोटा है --vm N: Nmalloc()/free()
स्पैन

92

आप malloc()आवश्यक मेमोरी के लिए एक सी प्रोग्राम लिख सकते हैं और फिर mlock()मेमोरी को स्वैप करने से रोकने के लिए उपयोग कर सकते हैं।

फिर बस प्रोग्राम को कीबोर्ड इनपुट की प्रतीक्षा करें, और मेमोरी अनलॉक करें, मेमोरी को फ्री करें और बाहर निकलें।


25
लंबे समय पहले मुझे इसी तरह के उपयोग के मामले का परीक्षण करना था। मैंने देखा कि जब तक आप उस मेमोरी में कुछ नहीं लिखेंगे, तब तक उसे वास्तव में आवंटित नहीं किया जाएगा (यानी जब तक पेज में गलती नहीं होगी)। मुझे यकीन नहीं है कि क्या झुंड () उस की देखभाल करते हैं।
पूर्णा

2
मैं @siri के साथ कंसर्ट करता हूं; हालाँकि, यह निर्भर करता है कि आप किस संस्करण का उपयोग कर रहे हैं।
एंथनी

2
कोड के लिए कुछ प्रेरणा । इसके अलावा, मुझे लगता है कि आपको मेमोरी को अनलॉक / फ्री करने की आवश्यकता नहीं है । OS आपके लिए ऐसा करने जा रहा है जब आपकी प्रक्रिया समाप्त हो गई है।
सेबस्टियन

9
आपको शायद वास्तव में मेमोरी में लिखना है, कर्नेल सिर्फ ओवरकैम कर सकता है यदि आप इसे केवल मॉलोक करते हैं। यदि इसे कॉन्फ़िगर किया गया है, जैसे कि लिनक्स वास्तव में मेमोरी फ्री होने के बिना मॉलॉक को सफलतापूर्वक वापस जाने देगा, और केवल तब मेमोरी आवंटित करेगा जब इसे लिखा जा रहा हो। Win.tue.nl/~aeb/linux/lk/lk-9.html
Freund-Hansen

7
@ सेबस्टियन: callocएक ही समस्या IIRC में चलेगा। सभी मेमोरी केवल एक ही रीड-ओनली शून्य पृष्ठ की ओर इंगित करेगी। यह तब तक आवंटित नहीं किया जाएगा जब तक आप इसे लिखने की कोशिश नहीं करते (जो तब तक काम नहीं करेगा जब तक यह केवल पढ़ने के लिए नहीं है)। वास्तव में यह सुनिश्चित करने का एकमात्र तरीका है कि मुझे पता है memsetकि पूरे बफ़र को करना है। अधिक जानकारी के लिए निम्नलिखित उत्तर देखें stackoverflow.com/a/2688522/713554
सिंह

45

मैं सुझाव दूंगा कि सीमित मेमोरी के साथ एक वीएम चलाना और सॉफ्टवेयर का परीक्षण करना मेजबान मशीन पर मेमोरी को भरने की कोशिश करने की तुलना में अधिक कुशल परीक्षण होगा।

उस पद्धति का यह भी लाभ है कि यदि कम मेमोरी की स्थिति ओओएम त्रुटियों का कारण बनती है और पूरे ओएस को लटका देती है, तो आप केवल वीएम को लटकाते हैं जो आप अपनी मशीन में परीक्षण कर रहे हैं कि आपके पास अन्य उपयोगी प्रक्रियाएं चल सकती हैं।

इसके अलावा यदि आपका परीक्षण सीपीयू या आईओ गहन नहीं है, तो आप वीएम के परिवार पर विभिन्न प्रकार के कम स्मृति आकारों के परीक्षणों को समवर्ती रूप से चला सकते हैं।


31

इस HN टिप्पणी से: https://news.ycombinator.com/item?id=6695581

बस dd या इसी तरह के माध्यम से / dev / shm भरें।

swapoff -a
dd if=/dev/zero of=/dev/shm/fill bs=1k count=1024k

8
सभी * निक्स के पास देव / शम नहीं है। कोई और अधिक पोर्टेबल विचार?
तदेउस्ज़ ए। कदलोबोस्की

यदि pvस्थापित किया गया है, तो यह गिनती देखने में मदद करता है:dd if=/dev/zero bs=1024 |pv -b -B 1024 | dd of=/dev/shm/fill bs=1024
ओथियस

1
यदि आप गति चाहते हैं, तो यह तरीका सही विकल्प है! क्योंकि यह कुछ ही सेकंड में RAM की वांछित मात्रा आवंटित करता है। / Dev / urandom पर रिले मत करो, यह 100% CPU का उपयोग करेगा और अगर आपकी RAM बड़ी है तो कई मिनट लगेंगे। YET, / dev / shm का आधुनिक उबंटू / डेबियन डिस्ट्रोस में एक सापेक्ष आकार है, इसका आकार ऐसा है जो 50% भौतिक रैम को डिफॉल्ट करता है। उम्मीद है कि आप रिमूव / देव / शम या शायद एक नया आरोह बिंदु बना सकते हैं। बस यह सुनिश्चित करें कि इसका वास्तविक आकार है जिसे आप आवंटित करना चाहते हैं।
develCuy

30
  1. linux चलाने;
  2. mem=nn[KMG]कर्नेल बूट पैरामीटर के साथ बूट करें

(विवरण के लिए लिनक्स / डॉक्यूमेंटेशन / कर्नेल-पैरामीटर.टेक्स्ट में देखें)।


24

आप बुनियादी जीएनयू उपकरण है (यदि sh, grep, yesऔर head) आप यह कर सकते हैं:

yes | tr \\n x | head -c $BYTES | grep n
# Protip: use `head -c $((1024*1024*2))` to calculate 2MB easily

यह इसलिए काम करता है क्योंकि grep RAM में डेटा की पूरी लाइन को लोड करता है (मैंने डिस्क डिस्क को ग्रिप करते समय इसे दुर्भाग्यपूर्ण तरीके से सीखा था)। लाइन, द्वारा उत्पन्न yesकी जगह नई-पंक्तियों, असीम लंबा होगा, लेकिन द्वारा सीमित है headके लिए $BYTESबाइट्स, इस प्रकार ग्रेप स्मृति में $ BYTES लोड होगा। ग्रीप स्वयं मेरे लिए 100-200KB की तरह उपयोग करता है, आपको अधिक सटीक राशि के लिए इसे घटाना पड़ सकता है।

यदि आप समय की कमी को भी जोड़ना चाहते हैं, तो यह काफी आसानी से किया जा सकता है bash(काम नहीं करेगा sh):

cat <(yes | tr \\n x | head -c $BYTES) <(sleep $NumberOfSeconds) | grep n

यह <(command)बात बहुत कम मालूम होती है, लेकिन अक्सर बहुत उपयोगी होती है, इसके बारे में अधिक जानकारी यहाँ: http://tldp.org/LDP/abs/html/process-sub.html

तब के उपयोग के लिए cat: catबाहर निकलने तक इनपुट के पूरा होने की प्रतीक्षा करेगा, और पाइपों में से एक को खुला रखने से यह जीआरईपी को जीवित रखेगा।

यदि आपके पास है pvऔर धीरे-धीरे रैम का उपयोग बढ़ाना चाहते हैं:

yes | tr \\n x | head -c $BYTES | pv -L $BYTESPERSEC | grep n

उदाहरण के लिए:

yes | tr \\n x | head -c $((1024*1024*1024)) | pv -L $((1024*1024)) | grep n

1 एमबी प्रति सेकंड की दर से एक गीगाबाइट तक का उपयोग करेगा। अतिरिक्त बोनस के रूप में, pvआपको उपयोग की वर्तमान दर और अब तक के कुल उपयोग को दिखाएगा। बेशक यह पिछले वेरिएंट के साथ भी किया जा सकता है:

yes | tr \\n x | head -c $BYTES | pv | grep n

बस | pv |हिस्सा डालने से आपको वर्तमान स्थिति (थ्रूपुट और कुल, डिफ़ॉल्ट रूप से दिखाई देगी, मुझे लगता है - अन्यथा आदमी को देखें (ual) पृष्ठ)।


दूसरा जवाब क्यों? स्वीकृत उत्तर पैकेज स्थापित करने की सिफारिश करता है (मुझे यकीन है कि पैकेज प्रबंधक की आवश्यकता के बिना हर चिपसेट के लिए एक रिलीज है); शीर्ष मतदान जवाब एक सी प्रोग्राम को संकलित करने की सिफारिश करता है (मेरे पास आपके लक्ष्य के लिए संकलन करने के लिए संकलक या टूलचैन स्थापित नहीं था); दूसरे शीर्ष मतदान जवाब में एक वीएम में एप्लिकेशन चलाने की सलाह दी जाती है (हाँ, मुझे इस फोन के आंतरिक एसडीकार्ड को usb या किसी चीज़ से जोड़ने और एक वर्चुअलबॉक्स छवि बनाने की सलाह देते हैं); तीसरा बूट अनुक्रम में कुछ को संशोधित करने का सुझाव देता है जो रैम को वांछित के रूप में नहीं भरता है; चौथा केवल इतनी दूर तक काम करता है जहां / dev / shm माउंटपॉइंट मौजूद है (1) मौजूद है और (2) बड़ा है (रिमाउंटिंग की जरूरत है); पांचवां नमूना कोड के बिना उपरोक्त में से कई को जोड़ती है; छठा महान उत्तर है, लेकिन मैंने खुद के दृष्टिकोण के साथ आने से पहले यह जवाब नहीं देखा, इसलिए मैंने सोचा कि मैं अपना खुद का जोड़ दूंगा, क्योंकि यह याद रखना या टाइप करने के लिए कम है कि क्या आप नहीं देखते हैं कि झिल्ली लाइन वास्तव में इस मामले की जड़ है; सातवें फिर से सवाल का जवाब नहीं देता (एक प्रक्रिया को सीमित करने के लिए अलमिट का उपयोग करता है); आठवें आपको अजगर स्थापित करने के लिए प्राप्त करने की कोशिश करता है; नौवें को लगता है कि हम सभी बहुत ही अनिश्चित हैं और आखिरकार दसवें ने अपना सी ++ प्रोग्राम लिखा, जो शीर्ष वोटिंग जवाब के समान मुद्दे का कारण बनता है।


प्यारा समाधान। केवल गड़बड़ यह है कि निर्माण का निकास कोड 1 है क्योंकि grep को एक मैच नहीं मिलता है। से समाधान में से कोई भी stackoverflow.com/questions/6550484/... इसे ठीक करने लगते हैं।
होल्गर ब्रांडल

@HolgerBrandl अच्छा बिंदु, मुझे नहीं पता कि इसे कैसे ठीक किया जाए। यह पहली बार है जब मैंने सुना है set -e, इसलिए मैंने अभी कुछ सीखा :)
ल्यूक

$ SECONDS एक अच्छा विकल्प नहीं लगता है क्योंकि यह एक चर में बनाया गया है जब शेल शुरू होने के समय को दर्शाता है। देख tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_02.html
होल्गर ब्रैंडिल

@HolgerBrandl अच्छा पकड़, मुझे नहीं पता था। वर्तमान में> 3 मिलियन सेकंड के लिए खुले एक टर्मिनल को खोजने के लिए किंडा शांत है: डी। मैंने पोस्ट अपडेट की।
ल्यूक

शांत तकनीक! time yes | tr \\n x | head -c $((1024*1024*1024*10)) | grep n(उपयोग 10 GiB मेमोरी) 1 मिनट 46 सेकंड लेता है। Julman99 के खाने के कार्यक्रम को github.com/julman99/eatmemory पर चलाने में 6 सेकंड लगते हैं। ... खैर, प्लस डाउनलोड और संकलन समय, लेकिन यह कोई समस्या नहीं के साथ संकलित ... और बहुत जल्दी ... मेरे RHEL6.4 मशीन पर। फिर भी, मुझे यह समाधान पसंद है। पहिया को क्यों मजबूत करें?
माइक एस

18

मैं अपने डॉटफाइल्स में कुछ ऐसा ही करने के लिए एक फंक्शन रखता हूं। https://github.com/sagotsky/.dotfiles/blob/master/.functions#L248

function malloc() {
  if [[ $# -eq 0 || $1 -eq '-h' || $1 -lt 0 ]] ; then
    echo -e "usage: malloc N\n\nAllocate N mb, wait, then release it."
  else 
    N=$(free -m | grep Mem: | awk '{print int($2/10)}')
    if [[ $N -gt $1 ]] ;then 
      N=$1
    fi
    sh -c "MEMBLOB=\$(dd if=/dev/urandom bs=1MB count=$N) ; sleep 1"
  fi
}

1
यह सबसे अच्छा समाधान IMHO है, क्योंकि यह अनिवार्य रूप से केवल dd को काम करने की आवश्यकता है, अन्य सभी सामान को किसी भी शेल में काम किया जा सकता है। ध्यान दें कि यह वास्तव में डेटा dd से कम से कम अस्थायी रूप से दो बार मेमोरी का दावा करता है। डेबियन 9 पर परीक्षण किया गया, डैश 0.5.8-2.4। यदि आप MEMBLOB भाग को चलाने के लिए बैश का उपयोग करते हैं, तो यह वास्तव में धीमा हो जाता है और dd द्वारा उत्पादित राशि का चार गुना उपयोग करता है।
पी।

16

कैसे एक साधारण अजगर समाधान का सामना करना पड़ता है?

#!/usr/bin/env python

import sys
import time

if len(sys.argv) != 2:
    print "usage: fillmem <number-of-megabytes>"
    sys.exit()

count = int(sys.argv[1])

megabyte = (0,) * (1024 * 1024 / 8)

data = megabyte * count

while True:
    time.sleep(1)

7
यह शायद जल्दी से बाहर निकाल दिया जाएगा, स्मृति दबाव पर बहुत कम वास्तविक प्रभाव (जब तक आप सभी स्वैप को भर नहीं देते हैं, जो कि थोड़ी देर लगेगी, आमतौर पर)
जोचिम सॉवर

1
रैम उपलब्ध होने पर यूनिक्स स्वैप क्यों करेगा? यह वास्तव में जरूरत पड़ने पर डिस्क कैश निकालने का एक प्रशंसनीय तरीका है।
अलेक्जेंडर शेकब्लिकिन

@AlexanderShcheblikin यह प्रश्न डिस्क कैश को निकालने के बारे में नहीं है (जो प्रदर्शन परीक्षण के लिए उपयोगी है, लेकिन कम संसाधन परीक्षण के लिए नहीं)।
गिल्स

1
इस समाधान ने मेरे परीक्षणों में एक टमटम या दो को कोबल करने का काम किया, हालांकि मैंने अपनी मेमोरी को तनाव देने की कोशिश नहीं की। लेकिन, @JoachimSauer, कोई सेट कर सकता है sysctl vm.swappiness=0और इसके बाद vm.min_free_kbytes को एक छोटी संख्या में सेट कर सकता है , हो सकता है 1024। मैंने इसे आज़माया नहीं है, लेकिन डॉक्स का कहना है कि इस तरह से आप स्वैपिंग की तेज़ी को नियंत्रित करते हैं ... आपको होना चाहिए आपकी मशीन पर OOM स्थिति पैदा करने के बिंदु तक यह वास्तव में काफी धीमी गति से बनाने में सक्षम है। देखें kernel.org/doc/Documentation/sysctl/vm.txt और kernel.org/doc/gorman/html/understand/understand005.html
माइक एस

1GB के लिए बस एक लाइनर: अजगर -c "x = (1 * 1024 * 1024 * 1024/8) * (0,), raw_input ()"
adrianlzt

10

अगर यह मौजूद है तो रम्फ के बारे में कैसे? इसे माउंट करें और एक बड़ी फाइल पर कॉपी करें? अगर कोई नहीं /dev/shmऔर कोई रामफ्स नहीं है - मुझे लगता है कि एक छोटे सी प्रोग्राम का अनुमान है जो कुछ इनपुट मूल्य के आधार पर एक बड़ा मॉलोक करता है? 32 मेमोरी सिस्टम पर एक बार में इसे कई बार चलाना पड़ सकता है।


8

यदि आप सीमित मेमोरी के साथ किसी विशेष प्रक्रिया का परीक्षण करना चाहते हैं तो आप ulimitआवंटन योग्य मेमोरी की मात्रा को सीमित करने के लिए बेहतर उपयोग कर सकते हैं।


2
वास्तव में यह linux पर काम नहीं करता है (अन्य * निक्स के बारे में पता नहीं)। man setrlimit:RLIMIT_RSS Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM). This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED.
पैट्रिक

4

मुझे लगता है कि यह गलत सवाल पूछने का मामला है और सबसे रचनात्मक जवाब के लिए प्रतिस्पर्धा कर रहे लोगों द्वारा पवित्रता को डुबोया जा रहा है। यदि आपको केवल OOM शर्तों का अनुकरण करने की आवश्यकता है, तो आपको मेमोरी भरने की आवश्यकता नहीं है। बस एक कस्टम आवंटनकर्ता का उपयोग करें और यह निश्चित संख्या में आवंटन के बाद विफल हो गया है। यह दृष्टिकोण SQLite के लिए पर्याप्त रूप से काम करता है ।


3

मैंने उसके लिए यह छोटा C ++ प्रोग्राम लिखा: https://github.com/rmetzger/dynamic-ballooner

इस कार्यान्वयन का लाभ यह है कि समय-समय पर जांच की जाती है कि क्या उसे मेमोरी को मुफ्त या फिर से आवंटित करना है।

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