আমি কীভাবে কোনও প্রক্রিয়াতে উপলব্ধ মেমরির পরিমাণ সীমাবদ্ধ করতে পারি?


11

আমি যেতে একটি প্রোগ্রাম বিকাশ করছি; এটি মাঝে মাঝে খুব বড় পরিমাণে মেমরির বরাদ্দ শেষ করে (>> 8 জি শারীরিক স্মৃতিযুক্ত একটি মেশিনে 10 জি), যাতে সিস্টেমটি প্রতিক্রিয়াহীন হয়ে যায়। প্রক্রিয়াটি যে পরিমাণ মেমরি বরাদ্দ করতে পারে তা সীমাবদ্ধ করতে চাই। আমি এটি করার স্বাভাবিক উপায় হ'ল:

ulimit -m 4000000 ; ./myprogram

... এটি যদি 4GB এর বেশি মেমরি ব্যবহার করার চেষ্টা করে তবে আমার প্রোগ্রামটিকে হত্যা করা উচিত kill

ওএস এক্স এল ক্যাপিটনে এটির কোনও প্রভাব নেই বলে মনে হয়; এমনকি ulimit -m 1(সমস্ত প্রোগ্রামকে কেবল 1 কেবি মেমরির মধ্যে সীমাবদ্ধ করা) অকার্যকর।

একটি বিশেষ প্রক্রিয়াতে উপলব্ধ মেমরিটিতে আমি কীভাবে একটি উপরের সীমাটি সেট করতে পারি?


আপনি যখন বলেন যে আমি যখন স্বাভাবিকভাবে এটি করি তখন আপনার অর্থ কী? আরও নির্দিষ্টভাবে, আপনি সাধারণত কখন এটি করেন? এবং আপনি যখন এটি করেন, আপনি কি ম্যাক ওএস এক্স এল ক্যাপিটেনের মধ্যে বা অন্য কোনও পরিবেশে বোঝাচ্ছেন? আপনি কখন এটি সফলভাবে ব্যবহার করেছেন তার উদাহরণ দিতে পারেন? মূলত, আমি কেবল পরিষ্কার করার চেষ্টা করছি যে এই প্রক্রিয়াটি আপনার পক্ষে সাধারণত কাজ করে কিনা, তবে কেবল এই বিশেষ প্রোগ্রামের জন্য কাজ করছে না? বা এটি কি আপনার পক্ষে কাজ করছে না তবে আপনি মনে করেন এটি করা উচিত?
মনোমিথ

1
"সাধারণভাবে আমি এটি করব", এর অর্থ আমি যেভাবে ইউনিক্সের অন্যান্য স্বাদে এটি করব this আমি নোট করেছি যে আমি সবেমাত্র আবিষ্কার করেছি যে ulimit -mলিনাক্সে (> 2.4.30) আর কাজ করে না, যদিও ulimit -vএখনও প্রত্যাশার মতো কাজ করে না। (যেমন ulimit -m, ulimit -vওএস
এক্সেও এর

এটি আপনার মনে হচ্ছে যে আপনি যে প্রোগ্রামটি লিখছেন তাতে স্মৃতি ফাঁস হয়ে গেছে এবং আরও ভাল আবর্জনা সংগ্রহের প্রয়োজন need আপনি কি যেতে যেতে মেমরি পরিচালনা সম্পর্কে পড়তে পেরেছেন?
টড ড্যাবনি

1
না, কোনও মেমরি ফাঁস নয় — সম্ভাব্য খুব বড় রাষ্ট্রীয় জায়গার কেবল একটি গ্রাফ অনুসন্ধান। বিভিন্ন অভ্যন্তরীণ কাঠামো খুব বেশি বড় হয়ে গেলে আমি অনুসন্ধানটি বাতিল করতে কোড যুক্ত করতে পারি, তবে আমি শেল ওয়ান-লাইনার দিয়ে একই জিনিসটি (মেশিনকে বড় ইনপুটগুলি আটকাতে আটকাতে) করতে সক্ষম হবেন বলে আশা করছিলাম।
cpcallen

উত্তর:


1

আপনার মেমরির ব্যবহারকে সীমাবদ্ধ করার জন্য দুটি পন্থা রয়েছে: প্রাক্তন পোস্ট ফ্যাক্টো এবং প্রাক-প্রতিরোধী। এর অর্থ হল, আপনি আপনার প্রোগ্রামটি খুব বেশি বড় হয়ে যাওয়ার পরে হত্যা করার চেষ্টা করতে পারেন, বা আপনি এটির প্রোগ্রামটি প্রথমদিকে খুব বড় না হওয়ার জন্য করতে পারেন।

আপনি যদি প্রাক্তন পোস্টের ফ্যাক্টো পদ্ধতির উপর জোর দিয়ে থাকেন তবে আপনি নীচের বাশ স্ক্রিপ্টটি ব্যবহার করতে পারেন। এই স্ক্রিপ্টটি প্রথমে মেমরির পরিমাণ ("রেসিডেন্ট সেট আকার" দ্বারা নির্ধারিত হিসাবে) প্রসেসিড পিড ব্যবহার করে প্রক্রিয়াটি ব্যবহার করে, গ্রেপ ব্যবহার করে সমস্ত অ-সংখ্যাসূচক ডেটা ফিল্টার করে এবং পরিমাণটিকে পরিবর্তনশীল এন হিসাবে সংরক্ষণ করে। স্ক্রিপ্টটি তখন পরীক্ষা করে দেখুন যে এন আপনার নির্দিষ্ট x এর চেয়ে বড় কিনা। যদি তা হয় তবে প্রসেসিড পিড সহ প্রক্রিয়াটি মারা যায়।

দয়া করে নোট করুন:

  1. আপনাকে অবশ্যই <pid>আপনার প্রোগ্রামটির প্রসেস আইডি দিয়ে প্রতিস্থাপন করতে হবে ।
  2. আপনাকে অবশ্যই <x>আরএসএস = "আবাসিক সেট আকার" (অর্থাত্ রিয়েল মেমরি আকার) দিয়ে প্রতিস্থাপন করতে হবে যা আপনি চান না যে প্রোগ্রামটি অতিক্রম করবে।

n=$(ps -<pid> -o rss | grep '[0-9]') if [ $n -gt <x> ]; then kill -9 <pid>; fi

আপনি যদি প্রতি y সেকেন্ডে এটি চালাতে চান তবে এটি কেবল একটি লুপে আবদ্ধ করুন এবং প্রতিটি পুনরাবৃত্তির পরে y সেকেন্ডের জন্য অপেক্ষা করতে বলুন। আপনি একই জাতীয় কমান্ড ব্যবহার করে লিখতে পারেন top। আপনার সূচনা পয়েন্ট হবে top -l 1|grep "<pid>"|awk '{print $10}'

@ কেনরবের উত্তর আমাকে আমার স্ক্রিপ্টে সহায়তা করেছিল


যদিও আমি বিশ্বাস করি যে প্রশ্নের উত্তর, দীর্ঘমেয়াদে আমি বিশ্বাস করি ম্যানুয়াল মেমোরি বরাদ্দ ব্যবহার করে একটি প্রাকটিক পদ্ধতি গ্রহণ করা আরও ভাল প্রোগ্রামিং ডিজাইন।

প্রথমত, আপনি কি নিশ্চিত যে মেমরির ব্যবহার সত্যিই একটি সমস্যা? গো ডকুমেন্টেশনে বলা হয়েছে:

গো মেমরির বরাদ্দকারী বরাদ্দ দেওয়ার ক্ষেত্র হিসাবে ভার্চুয়াল মেমরির একটি বৃহত অঞ্চল সংরক্ষণ করে। এই ভার্চুয়াল মেমরিটি নির্দিষ্ট গো প্রক্রিয়াতে স্থানীয়; সংরক্ষণ মেমরির অন্যান্য প্রক্রিয়া বঞ্চিত করে না।

আপনি যদি এখনও মনে করেন যে আপনার কোনও সমস্যা আছে, তবে আমি আপনাকে সি ম্যাসেজিং ভাষা হিসাবে মেমোরি নিজে ম্যানেজ করতে উত্সাহিত করি। যেহেতু গো সি তে লিখিত হয়েছে, আমি সন্দেহ করেছি যে সি মেমরি পরিচালনা / বরাদ্দে প্রবেশের উপায় থাকবে এবং প্রকৃতপক্ষে রয়েছে। এই গিথুব সংগ্রহস্থলটি দেখুন যা,

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

ব্যবহারের ক্ষেত্রে হিসাবে দেওয়া হয়:

কেন আপনি এই চায়?

যখন কোনও প্রোগ্রাম মেমরির চাপ সৃষ্টি করে বা সিস্টেমটি মেমরির বাইরে চলে যায় তখন মেমরির বরাদ্দ এবং অবনতি ম্যানুয়ালি নিয়ন্ত্রণ করতে সহায়ক হতে পারে। গো আপনাকে বরাদ্দগুলি নিয়ন্ত্রণ করতে সহায়তা করতে পারে তবে স্পষ্টতই অনিবদ্ধ ডেটা অপসারণ করা সম্ভব নয়।

এটি আরও দীর্ঘমেয়াদী সমাধান হিসাবে মনে হচ্ছে।

আপনি যদি সি সম্পর্কে আরও জানতে চান (মেমরি পরিচালনা সহ), সি প্রোগ্রামিং ভাষা হ'ল মানক রেফারেন্স।


আমি নিশ্চিত যে মেমরির ব্যবহার সত্যিই একটি সমস্যা। প্রোগ্রামটি অপ্রত্যাশিতভাবে 2x শারীরিক মেমরি আকারে বেড়ে গেলে পৃষ্ঠা থ্র্যাশিংয়ের কারণে মেশিনটি সম্পূর্ণ সম্পূর্ণ অ-প্রতিক্রিয়াশীল হয়ে ওঠে। আমি যখন ডিগ্রি সেন্ট করেছি এবং ম্যাকস যখন মাউস ক্লিকগুলিতে প্রতিক্রিয়া জানাতে শুরু করেছে তখন এর মধ্যে প্রায় এক ঘন্টা সময় লেগেছিল; মাঝপথে একমাত্র প্রমাণ যে এটি হিমশীতল হয়নি তা হ'ল দ্রুত ড্রাইভের হার্ড ড্রাইভের শান্ত শব্দ।
cpcallen

এটি সম্ভবত অনুশীলনের ক্ষেত্রে একটি যুক্তিসঙ্গত সমাধান, তবে ইউনিক্স ওএস (ও ডারউইন) ওলিমিটের বিপরীতে এটি কিল কমান্ড কার্যকরভাবে কার্যকর করতে সময় মতো ফ্যাশনে পর্যাপ্ত মেমরি বরাদ্দ করতে সক্ষম হওয়ার উপর নির্ভর করে। আমি সত্যিই বরং কার্নেল দ্বারা প্রয়োগ প্রক্রিয়া আকার সীমা চাই।
cpcallen

@cpcallen কিছু অনুসন্ধান করে মনে হচ্ছে "-মিলিট থেকে এমপি প্যারামিটারের লিনাক্স সিস্টেমে ২.৪.৩০ এর চেয়ে বেশি কার্নেল সংস্করণ নেই।" দেখে মনে হচ্ছে ওএসএক্সও এই পরিবর্তনটি গ্রহণ করেছে। ঠিকানা স্থান সীমাবদ্ধ করতে -v বিকল্পটি ব্যবহার করে দেখুন
ইভান রোসিকা

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