কীভাবে কোনও প্রক্রিয়া এবং এর শিশুদের মোট সংস্থান (মেমরি) সীমাবদ্ধ করা যায়


16

একটি একক প্রক্রিয়ার রিসোর্সকে সীমাবদ্ধ করা সম্পর্কে প্রচুর প্রশ্নোত্তর রয়েছে, যেমন RLIMIT_AS এমন একটি প্রক্রিয়া দ্বারা বরাদ্দ করা সর্বাধিক স্মৃতি সীমাবদ্ধ করতে ব্যবহার করা যেতে পারে যা পছন্দ মতো ভিআরটি হিসাবে দেখা যায় top। বিষয়টিতে আরও উদাহরণস্বরূপ , ইউনিক্সে কোনও বিশেষ প্রক্রিয়া ব্যবহার করতে পারে এমন মেমোরির পরিমাণ সীমিত করার কোনও উপায় কি?

setrlimit(2) ডকুমেন্টেশন বলে:

কাঁটাচামচ (2) এর মাধ্যমে তৈরি একটি শিশু প্রক্রিয়া তার পিতামাতার সম্পদের সীমা উত্তরাধিকার সূত্রে পায়। সম্পদ সীমা নির্বাহ (2) জুড়ে সংরক্ষণ করা হয়।

এটি নিম্নলিখিত উপায়ে বোঝা উচিত:

যদি কোনও প্রক্রিয়াতে যেমন 2 গিগাবাইটের একটি RLIMIT_AS থাকে, তবে এটি 2GB এর চেয়ে বেশি মেমরি বরাদ্দ করতে পারে না। এটি যখন কোনও শিশুকে প্রসারণ করে, 2 জিবি ঠিকানার স্থানের সীমাটি সন্তানের কাছে চলে যায় তবে গণনা 0 থেকে শুরু হয় The 2 টি প্রক্রিয়া একসাথে 4 গিগাবাইট পর্যন্ত মেমরি নিতে পারে।

তবে প্রক্রিয়াগুলির একটি সম্পূর্ণ গাছ দ্বারা বরাদ্দকৃত মোট মেমরির সীমাবদ্ধ করার কার্যকর উপায় কী হবে?



7
আমি সিগ্রুপগুলিতে একবার দেখে নিই ।
slm

@ এসএমএল ধন্যবাদ! সিগ্রুপের মতো শব্দগুলি চেষ্টা করার মতো কিছু। এখন অবধি একমাত্র কার্যক্ষম সমাধান (পিএস ব্যবহার করে মেমরি সংক্ষিপ্ত করার এবং পিতামাতার প্রক্রিয়া সীমা ছাড়িয়ে গেলে হত্যার কুৎসিত উপায় ছাড়াও) কাজ করতে পারে এমন কোনও ধারক (এলএক্সসি বা পছন্দগুলি) ব্যবহার করতে পারে।
जेপি

হ্যাঁ - যে সরঞ্জামগুলি সম্পর্কে আমি সচেতন সেগুলি একটি গোষ্ঠী না করে, কেবল একক প্রক্রিয়া না করে, তবে সিএক্স গ্রুপগুলি কীভাবে এলএক্সসি এবং ডকারের মতো ভিএম প্রযুক্তির জন্য কাজ করে তা আমি আপনাকে যা করতে চাই তা আশা করি।
slm

1
যদি এটি লিনাক্স প্যারেন্ট পিআইডিকে তার নিজের নামস্থানে রাখে এবং এটি এবং তার সমস্ত শিশুদের সেইভাবে নিয়ন্ত্রণ করে। এখানে এই ধারণার একটি প্রারম্ভিক উত্তর: unix.stackexchange.com/a/124194/52934
মাইকজারভ

উত্তর:


8

এটি আপনার প্রশ্নের উত্তর দেয় কিনা তা আমি নিশ্চিত নই, তবে আমি এই পার্ল স্ক্রিপ্টটি পেয়েছি যা আপনি যা খুঁজছেন ঠিক তা করার দাবি করে। প্রক্রিয়া এবং তার বাচ্চাদের সংস্থান ব্যবহার এবং জাগ্রত করে সীমাবদ্ধতা প্রয়োগের জন্য স্ক্রিপ্টটি নিজস্ব সিস্টেম প্রয়োগ করে। এটি ভাল নথিভুক্ত এবং ব্যাখ্যা করা হয়েছে বলে মনে হয়, এবং সম্প্রতি আপডেট করা হয়েছে।

যেমনটি এসএমএল তার মন্তব্যে বলেছেন, এর জন্য সিগ্রুপগুলিও ব্যবহার করা যেতে পারে। সিগ্রুপ পরিচালনা করার জন্য আপনাকে ইউটিলিটিগুলি ইনস্টল করতে হতে পারে, ধরে নেওয়া উচিত যে আপনি লিনাক্সে রয়েছেন যা আপনার সন্ধান করা উচিত libcgroups

sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup

$USERআপনার ব্যবহারকারী নিশ্চিত হন ।

আপনার ব্যবহারকারীটির তখন সিগ্রুপ মেমরি সেটিংসে অ্যাক্সেস থাকা উচিত /sys/fs/cgroup/memory/myGroup

তারপরে আপনি সীমাটি সেট করতে পারেন, এটি করে 500 এমবি বলুন:

echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes

এখন Vim চালাতে দিন:

cgexec -g memory:myGroup vim

ভিএম প্রক্রিয়া এবং এর সমস্ত শিশুদের এখন 500 এমবি র‌্যাম ব্যবহারের মধ্যে সীমাবদ্ধ করা উচিত। তবে আমি মনে করি এই সীমাটি কেবল র‌্যামের ক্ষেত্রেই প্রযোজ্য এবং অদলবদল নয়। প্রক্রিয়াগুলি সীমাতে পৌঁছে গেলে তারা অদলবদল শুরু করবে। আপনি নিশ্চিত হয়ে উঠতে পারেন কিনা তা আমি নিশ্চিত নই, সিগ্রুপগুলি ব্যবহার করে অদলবদলের ব্যবহার সীমাবদ্ধ করার কোনও উপায় আমি খুঁজে পাচ্ছি না।


প্রস্তাবিত সমাধান প্রক্রিয়াগুলির একটি গাছের আবাসিক সেট আকারকে সীমাবদ্ধ করা সম্ভব করে তোলে। আচরণটি RLIMIT_AS থেকে পৃথক বলে মনে হচ্ছে: সীমা ছাড়াই বেশি মেমরি ম্যালোক করা সম্ভব, তবে সম্ভবত এটি বেশি ব্যবহার করা সম্ভব হবে বলে মনে হয় না।
jpe

ডিফল্টরূপে, সিগ্রুপ মেমরি সীমাটি কেবলমাত্র (প্রায়) দৈহিক র‌্যাম ব্যবহারের ক্ষেত্রে প্রযোজ্য। অদলবদ অ্যাকাউন্টিং সক্ষম করার জন্য একটি কার্নেল বিকল্প রয়েছে (CONFIG_MEMCG_SWAP); দেখতে কার্নেল ডক্স বিস্তারিত জানার জন্য।
সেরেন ল্যাভবার্গ

1
ফেডোরাতে,sudo yum install libcgroup-tools
জোজকিয়্যাক্ক

2

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা এটি করে, উগুন্টুতে সিজিম্যানারে ব্যবহার করে। একটি সুবিধা হ'ল এর জন্য রুট অ্যাক্সেসের প্রয়োজন হয় না। নোট করুন যে সিগ্রুপ পরিচালনাটি কিছুটা ডিস্ট্রো নির্দিষ্ট, সুতরাং আমি জানি না যে এটি সিস্টেস্ট সিগ্রুপ ব্যবস্থাপনার ব্যবহারকারী ডিস্ট্রোগুলিতে কাজ করে কিনা।

#!/bin/sh

set -eu

if [ "$#" -lt 2 ]
then
    echo Usage: `basename $0` "<limit> <command>..."
    exit 1
fi

limit="$1"
shift
cgname="limitmem_$$"
echo "limiting memory to $limit (cgroup $cgname) for command $@"

cgm create memory "$cgname" >/dev/null
cgm setvalue memory "$cgname" memory.limit_in_bytes "$limit" >/dev/null
# try also limiting swap usage, but this fails if the system has no swap
cgm setvalue memory "$cgname" memsw.limit_in_bytes "$limit" >/dev/null 2>&1 || true

# spawn subshell to run in the cgroup
set +e
(
set -e
cgm movepid memory "$cgname" `sh -c 'echo $PPID'` > /dev/null
exec "$@"
)
# grab exit code
exitcode=`echo $?`

set -e

echo -n "peak memory used: "
cgm getvalue memory "$cgname" memory.max_usage_in_bytes | tail -1 | cut -f2 -d\"

cgm remove memory "$cgname" >/dev/null
exit $exitcode

ব্যবহার: limitmemআপনার পথের মতো সংরক্ষণ করুন এবং এটি সম্পাদনযোগ্য করুন। তারপর যেমন চালানো limitmem 1G command...। এটি আসলে ব্যবহৃত স্মৃতি সীমাবদ্ধ করে limit যদি এটি পৌঁছে যায় তবে ওওএম হত্যাকারী প্রক্রিয়াটি বা এর একটি বাচ্চাকে মেরে ফেলবে, তবে এলোমেলো কিছু নয় যার এই আদেশের সাথে কোনও সম্পর্ক নেই।


সংক্ষিপ্ত cgmগাইডের জন্য ধন্যবাদ , এটি কার্যকর ছিল
ভিটালি ইসাইভ

1

/unix//a/536046/4319 :

যে কোনও সিস্টেমে ভিত্তিক ডিস্ট্রোতে আপনি সিস্টেমড-রানের মাধ্যমেও পরোক্ষভাবে সিগ্রুপগুলি ব্যবহার করতে পারেন। যেমন আপনার pdftoppm500M র্যাম সীমিত করার ক্ষেত্রে , ব্যবহার করুন:

systemd-run --scope -p MemoryLimit=500M pdftoppm

...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.