मैं कुछ कम-संसाधन परीक्षण करना चाहता हूं और इसके लिए मुझे 90% मुफ्त मेमोरी पूर्ण होनी चाहिए।
मैं इसे एक *nix
सिस्टम पर कैसे कर सकता हूं ?
मैं कुछ कम-संसाधन परीक्षण करना चाहता हूं और इसके लिए मुझे 90% मुफ्त मेमोरी पूर्ण होनी चाहिए।
मैं इसे एक *nix
सिस्टम पर कैसे कर सकता हूं ?
जवाबों:
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)
stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.98;}' < /proc/meminfo)k --vm-keep -m 1
--vm 1 and --vm-keep
बहुत महत्वपूर्ण है। बस --vm-bytes
कुछ नहीं करता है और आपको यह सोचने में गुमराह किया जा सकता है कि आप उतनी मेमोरी आवंटित कर सकते हैं जितनी आपको आवश्यकता है / चाहते हैं। जब तक मैं अपने आप को 256G मेमोरी के आवंटन द्वारा स्वयं की जांच करने की कोशिश करता हूं, तब तक मुझे यह थोड़ा सा मिला। यह उत्तर में एक दोष नहीं है, यह सही झंडे प्रदान करता है, बस एक अतिरिक्त सावधानी।
-m 1
। स्ट्रेस मैनपेज के अनुसार, इसके -m N
लिए छोटा है --vm N
: N
malloc()/free()
आप malloc()
आवश्यक मेमोरी के लिए एक सी प्रोग्राम लिख सकते हैं और फिर mlock()
मेमोरी को स्वैप करने से रोकने के लिए उपयोग कर सकते हैं।
फिर बस प्रोग्राम को कीबोर्ड इनपुट की प्रतीक्षा करें, और मेमोरी अनलॉक करें, मेमोरी को फ्री करें और बाहर निकलें।
calloc
एक ही समस्या IIRC में चलेगा। सभी मेमोरी केवल एक ही रीड-ओनली शून्य पृष्ठ की ओर इंगित करेगी। यह तब तक आवंटित नहीं किया जाएगा जब तक आप इसे लिखने की कोशिश नहीं करते (जो तब तक काम नहीं करेगा जब तक यह केवल पढ़ने के लिए नहीं है)। वास्तव में यह सुनिश्चित करने का एकमात्र तरीका है कि मुझे पता है memset
कि पूरे बफ़र को करना है। अधिक जानकारी के लिए निम्नलिखित उत्तर देखें stackoverflow.com/a/2688522/713554
मैं सुझाव दूंगा कि सीमित मेमोरी के साथ एक वीएम चलाना और सॉफ्टवेयर का परीक्षण करना मेजबान मशीन पर मेमोरी को भरने की कोशिश करने की तुलना में अधिक कुशल परीक्षण होगा।
उस पद्धति का यह भी लाभ है कि यदि कम मेमोरी की स्थिति ओओएम त्रुटियों का कारण बनती है और पूरे ओएस को लटका देती है, तो आप केवल वीएम को लटकाते हैं जो आप अपनी मशीन में परीक्षण कर रहे हैं कि आपके पास अन्य उपयोगी प्रक्रियाएं चल सकती हैं।
इसके अलावा यदि आपका परीक्षण सीपीयू या आईओ गहन नहीं है, तो आप वीएम के परिवार पर विभिन्न प्रकार के कम स्मृति आकारों के परीक्षणों को समवर्ती रूप से चला सकते हैं।
इस 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
pv
स्थापित किया गया है, तो यह गिनती देखने में मदद करता है:dd if=/dev/zero bs=1024 |pv -b -B 1024 | dd of=/dev/shm/fill bs=1024
आप बुनियादी जीएनयू उपकरण है (यदि 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) बड़ा है (रिमाउंटिंग की जरूरत है); पांचवां नमूना कोड के बिना उपरोक्त में से कई को जोड़ती है; छठा महान उत्तर है, लेकिन मैंने खुद के दृष्टिकोण के साथ आने से पहले यह जवाब नहीं देखा, इसलिए मैंने सोचा कि मैं अपना खुद का जोड़ दूंगा, क्योंकि यह याद रखना या टाइप करने के लिए कम है कि क्या आप नहीं देखते हैं कि झिल्ली लाइन वास्तव में इस मामले की जड़ है; सातवें फिर से सवाल का जवाब नहीं देता (एक प्रक्रिया को सीमित करने के लिए अलमिट का उपयोग करता है); आठवें आपको अजगर स्थापित करने के लिए प्राप्त करने की कोशिश करता है; नौवें को लगता है कि हम सभी बहुत ही अनिश्चित हैं और आखिरकार दसवें ने अपना सी ++ प्रोग्राम लिखा, जो शीर्ष वोटिंग जवाब के समान मुद्दे का कारण बनता है।
set -e
, इसलिए मैंने अभी कुछ सीखा :)
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 मशीन पर। फिर भी, मुझे यह समाधान पसंद है। पहिया को क्यों मजबूत करें?
मैं अपने डॉटफाइल्स में कुछ ऐसा ही करने के लिए एक फंक्शन रखता हूं। 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
}
कैसे एक साधारण अजगर समाधान का सामना करना पड़ता है?
#!/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)
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
अगर यह मौजूद है तो रम्फ के बारे में कैसे? इसे माउंट करें और एक बड़ी फाइल पर कॉपी करें? अगर कोई नहीं /dev/shm
और कोई रामफ्स नहीं है - मुझे लगता है कि एक छोटे सी प्रोग्राम का अनुमान है जो कुछ इनपुट मूल्य के आधार पर एक बड़ा मॉलोक करता है? 32 मेमोरी सिस्टम पर एक बार में इसे कई बार चलाना पड़ सकता है।
यदि आप सीमित मेमोरी के साथ किसी विशेष प्रक्रिया का परीक्षण करना चाहते हैं तो आप ulimit
आवंटन योग्य मेमोरी की मात्रा को सीमित करने के लिए बेहतर उपयोग कर सकते हैं।
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.
मुझे लगता है कि यह गलत सवाल पूछने का मामला है और सबसे रचनात्मक जवाब के लिए प्रतिस्पर्धा कर रहे लोगों द्वारा पवित्रता को डुबोया जा रहा है। यदि आपको केवल OOM शर्तों का अनुकरण करने की आवश्यकता है, तो आपको मेमोरी भरने की आवश्यकता नहीं है। बस एक कस्टम आवंटनकर्ता का उपयोग करें और यह निश्चित संख्या में आवंटन के बाद विफल हो गया है। यह दृष्टिकोण SQLite के लिए पर्याप्त रूप से काम करता है ।
मैंने उसके लिए यह छोटा C ++ प्रोग्राम लिखा: https://github.com/rmetzger/dynamic-ballooner
इस कार्यान्वयन का लाभ यह है कि समय-समय पर जांच की जाती है कि क्या उसे मेमोरी को मुफ्त या फिर से आवंटित करना है।