আমি কিছু নিম্ন-সংস্থান পরীক্ষা করতে চাই এবং তার জন্য আমার ফ্রি মেমরির 90% পূর্ণ থাকতে হবে।
আমি কীভাবে এটি *nix
সিস্টেমে করতে পারি ?
আমি কিছু নিম্ন-সংস্থান পরীক্ষা করতে চাই এবং তার জন্য আমার ফ্রি মেমরির 90% পূর্ণ থাকতে হবে।
আমি কীভাবে এটি *nix
সিস্টেমে করতে পারি ?
উত্তর:
স্ট্রেস-এনজি হ'ল একটি কাজের চাপ জেনারেটর যা পসিক্স সিস্টেমে সিপিইউ / মেমি / আইও / এইচডিডি স্ট্রেস অনুকরণ করে। এই কলটির লিনাক্স <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
একই সমস্যা আইআইআরসি চালানো হবে। সমস্ত স্মৃতি কেবল একই পঠনযোগ্য শূন্য পৃষ্ঠায় নির্দেশ করবে। আপনি এটি লেখার চেষ্টা না করা পর্যন্ত এটি আসলে বরাদ্দ পাবে না (এটি কেবল পঠনযোগ্য হওয়ার কারণে এটি কাজ করবে না)। আমি জানি যে সত্যই নিশ্চিত হওয়ার একমাত্র উপায় হ'ল memset
সম্পূর্ণ বাফারটি করা। আরও তথ্যের জন্য নীচের উত্তরটি দেখুন stackoverflow.com/a/2688522/713554
আমি সীমিত মেমরির সাথে একটি ভিএম চালনা এবং হোস্ট মেশিনে মেমরি ভরাট করার চেষ্টা করার চেয়ে আরও কার্যকর পরীক্ষা হবে বলে সফটওয়্যারটি পরীক্ষা করার পরামর্শ দেব।
এই পদ্ধতিটিরও সুবিধা রয়েছে যে কম স্মৃতি পরিস্থিতি যদি অন্য কোথাও ওওএম ত্রুটিগুলির কারণ হয়ে থাকে এবং পুরো ওএস হ্যাং করে থাকে তবে আপনি কেবল নিজের মেশিনে পরীক্ষা না করে যে ভিএম পরীক্ষা করছেন সেটি আপনার অন্যান্য কার্যকর প্রক্রিয়া চলতে পারে hang
এছাড়াও যদি আপনার পরীক্ষাগুলি সিপিইউ বা আইও নিবিড় না হয়, আপনি একই সাথে বিভিন্ন কম মেমরির আকারের ভিএমএসের পরিবারে পরীক্ষার উদাহরণগুলি চালিয়ে যেতে পারেন।
এই এইচএন মন্তব্য থেকে: https://news.ycombinator.com/item?id=6695581
কেবল ডিডি বা অনুরূপ মাধ্যমে / ডিভ / এসএম পূরণ করুন।
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
এটি কাজ করে কারণ গ্রেপটি র্যামে সম্পূর্ণ লাইন ডেটা লোড করে দেয় (ডিস্কের চিত্রটি গ্রেপ করার সময় আমি এটি দুর্ভাগ্যজনক উপায়ে শিখেছি)। লাইন, দ্বারা উত্পন্ন yes
, প্রতিস্থাপন নতুন লাইন, অসীম দীর্ঘ হবে, কিন্তু দ্বারা সীমাবদ্ধ head
করতে $BYTES
বাইট, এইভাবে, grep মেমরি $ BYTES লোড করা হবে। গ্রেপ নিজেই আমার জন্য 100-200 কেবি ব্যবহার করে, আপনাকে আরও সুনির্দিষ্ট পরিমাণের জন্য এটি বিয়োগ করতে হতে পারে।
আপনি যদি কোনও সময়ের সীমাবদ্ধতা যোগ করতে চান তবে এটি 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 |
অংশটি সন্নিবেশ করাতে আপনি বর্তমান অবস্থা (থ্রুপুট এবং মোট, ডিফল্টরূপে দেখিয়ে দেবেন) আমি মনে করি - অন্যথায় লোকটি (ইউয়াল) পৃষ্ঠাটি দেখুন।
অন্য উত্তর কেন? গৃহীত উত্তরটি প্যাকেজ ইনস্টল করার পরামর্শ দেয় (আমি বাজি ধরছি যে প্রতিটি চিপসেটের জন্য প্যাকেজ পরিচালকের প্রয়োজন ছাড়াই একটি রিলিজ রয়েছে); শীর্ষে ভোট দেওয়া উত্তর একটি সি প্রোগ্রাম সংকলন করার পরামর্শ দেয় (আপনার লক্ষ্য প্ল্যাটফর্মের জন্য সংকলন করার জন্য আমার কাছে একটি সংকলক বা সরঞ্জামচেন ইনস্টল করা হয়নি); দ্বিতীয় শীর্ষ ভোটের উত্তরে একটি ভিএম-তে অ্যাপ্লিকেশন চালানোর পরামর্শ দেওয়া হয়েছে (হ্যাঁ আমাকে কেবল এই ফোনের অভ্যন্তরীণ এসডকার্ডটি ইউএসবি বা কোনও কিছুর উপর দিয়ে ডিডি করুন এবং একটি ভার্চুয়ালবক্স চিত্র তৈরি করুন); তৃতীয়টি বুট সিকোয়েন্সে এমন কিছু পরিবর্তন করার পরামর্শ দেয় যা র্যামটি পছন্দমতো পূরণ করে না; চতুর্থটি কেবলমাত্র এ পর্যন্ত কাজ করে যতক্ষণ / dev / shm মাউন্টপয়েন্ট (1) বিদ্যমান এবং (2) বৃহত্তর (পুনঃনির্মাণের মূল প্রয়োজন); পঞ্চম নমুনা কোড ছাড়াই উপরের অনেকগুলি একত্রিত করে; ষষ্ঠটি একটি দুর্দান্ত উত্তর তবে আমার নিজের পদ্ধতির সাথে আসার আগে আমি এই উত্তরটি দেখিনি, সুতরাং আমি ভেবেছিলাম যে আমি নিজের নিজস্ব যুক্ত করব, কারণ এটি মনে রাখার জন্য বা টাইপ করা সংক্ষিপ্ত কারণ যদি আপনি দেখতে না পান যে এই ঝিল্লির লাইনটি আসলে বিষয়টির কর্কট; সপ্তম আবার প্রশ্নের উত্তর দেয় না (পরিবর্তে একটি প্রক্রিয়া সীমাবদ্ধ করতে ulimit ব্যবহার করে); অষ্টমটি আপনাকে অজগরটি ইনস্টল করার চেষ্টা করে; নবম মনে করে আমরা সবাই খুব অবাস্তব এবং শেষ পর্যন্ত দশম নিজের সি ++ প্রোগ্রাম লিখেছিল যা শীর্ষ ভোটের উত্তরের মতো একই সমস্যার কারণ হয়ে দাঁড়ায়।
set -e
, তাই আমি সবেমাত্র কিছু শিখলাম :)
time yes | tr \\n x | head -c $((1024*1024*1024*10)) | grep n
(10 জিআইবি মেমরি ব্যবহার করুন) 1 মিনিট 46 সেকেন্ড সময় নেয়। 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
এবং সেট করতে পারে I আমি চেষ্টা করে দেখিনি, তবে ডকস বলেছে যে এভাবেই আপনি বদলের দ্রুততা নিয়ন্ত্রণ করেন ... আপনার হওয়া উচিত আপনার মেশিনে 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.
আমি মনে করি এটি সর্বাধিক সৃজনশীল উত্তরের জন্য প্রতিযোগিতায় লোকেরা ভুল প্রশ্ন জিজ্ঞাসা এবং বোকামি জিজ্ঞাসা করার ঘটনা। আপনার যদি কেবল ওওএম শর্তগুলি অনুকরণ করার প্রয়োজন হয় তবে আপনার স্মৃতি পূরণ করার দরকার নেই। কেবলমাত্র একটি কাস্টম বরাদ্দকারী ব্যবহার করুন এবং নির্দিষ্ট সংখ্যক বরাদ্দের পরে এটি ব্যর্থ হয়ে যান। এই পদ্ধতিটি এসকিউএলাইটের জন্য যথেষ্ট ভাল কাজ করে বলে মনে হচ্ছে ।
আমি এটির জন্য এই ছোট্ট সি ++ প্রোগ্রামটি লিখেছি: https://github.com/rmetzger/dynamic-ballooner
এই প্রয়োগের সুবিধা হ'ল মেমরিটি ফ্রি বা পুনরায় বরাদ্দ করার প্রয়োজন হয় কিনা তা পর্যায়ক্রমে পরীক্ষা করা হয়।