সীমিত র‌্যাম ব্যবহারের সাথে কীভাবে একটি ব্যবহারকারী তৈরি করবেন?


43

সুতরাং আমার কাছে 4 জিবি র‌্যাম + 4 জিবি সোয়াপ রয়েছে। আমি সীমিত র‌্যাম এবং অদলবদল সহ একটি ব্যবহারকারী তৈরি করতে চাই: 3 গিগাবাইট র‌্যাম এবং 1 জিবি সোয়াপ। এ জাতীয় জিনিস কি সম্ভব? কোনও পৃথক ব্যবহারকারী তৈরি না করেই (এবং কোনও বিশেষ অ্যাপ্লিকেশন ইনস্টল না করে - কেবলমাত্র একটি ডিফল্ট ডেবিয়ান / সেন্টোস সার্ভার কনফিগারেশন থাকা, এবং সুডো ব্যবহার না করে) সীমাবদ্ধ র‌্যামের সাথে অ্যাপ্লিকেশনগুলি শুরু করা এবং তাদের কাছে উপলভ্য অদলবদল সম্ভব?

হালনাগাদ:

সুতরাং আমি টার্মিনাল খুললাম এবং এটিতে ulimit কমান্ড টাইপ করেছি : ulimit -v 1000000যা 976,6Mbসীমাবদ্ধতার মতো হবে । এরপরে আমি ফোন করে ulimit -aদেখেছি যে সীমাবদ্ধতা "চালু"। তারপরে আমি এমন কিছু বাশ স্ক্রিপ্ট শুরু করেছি যা আমার অ্যাপ্লিকেশনটি সংকলন করে এবং শুরু করে nohup, একটি দীর্ঘ nohup ./cloud-updater-linux.sh >& /dev/null & ... তবে কিছুক্ষণ পরে আমি দেখেছি:

এখানে চিত্র বর্ণনা লিখুন

(যা কোনও সীমাবদ্ধতা প্রয়োগ না করা হলে ঠিক হবে - এটি কিছু বড় লিব ডাউনলোড করে এবং এটি সংকলন করতে শুরু করে))

তবে আমি ভেবেছিলাম যে আমি শেলের সীমাবদ্ধতা প্রয়োগ করেছি এবং এর সাথে / এর মাধ্যমে প্রবর্তিত সমস্ত প্রক্রিয়া ulimit -v 1000000? আমার কী ভুল হয়েছে? টার্মিনালটি কীভাবে তৈরি করা যায় এবং এটি চালু করা সমস্ত উপ-প্রক্রিয়াগুলি ম্যাম ব্যবহারের ক্ষেত্রে সীমাবদ্ধ থাকে?


1
আপনি সামগ্রিকভাবে কেবল কোনও প্রক্রিয়াতেই কোনও ব্যবহারকারীর উপর মেমরির সীমাবদ্ধতা রাখতে পারবেন না। এবং আপনি র‌্যাম এবং অদলবদ ব্যবহারের মধ্যে পার্থক্য করতে পারবেন না। আপনি যদি সূক্ষ্ম নিয়ন্ত্রণ চান তবে ব্যবহারকারীর প্রক্রিয়াগুলি ভার্চুয়াল মেশিনে চালান।
গিলস 23'30

@ গিলস নিশ্চিতভাবে নিশ্চিত হন যে ভার্চুয়াল মেশিনগুলি কেবল সিগ্রুপ এবং নেমস্পেস বা ডেরিভেটিভস ব্যবহার করে
র‌্যাপিডওয়েবস

পছন্দ করেছেন তারা কেবল র‌্যামের পূর্বনির্ধারিত পরিমাণকে অনুকরণ করে এবং অতিথি ওএস তারপরে কীভাবে প্রক্রিয়াগুলিতে এটি বরাদ্দ করা যায় তা স্থির করে।
রুসলান

পাত্রে (ভার্চুয়াল মেশিন নয়) মেমরির ব্যবহার সীমিত করতে cgroups ব্যবহার করে। ভার্চুয়াল মেমরি সীমাবদ্ধ করা ভাল ধারণা নয়; একটি প্রক্রিয়া প্রচুর ভার্চুয়াল মেমরি ব্যবহার করতে পারে তবে কেবল সামান্য র‍্যাম ব্যবহার করতে পারে। উদাহরণস্বরূপ আমার সিস্টেমে 34359738367 কেবি বরাদ্দ রয়েছে, তবে খুব কম র‌্যাম রয়েছে।
ctrl-alt-delor 20

উত্তর:


63

ulimitএই জন্য তৈরি করা হয়। আপনি ulimitপ্রতি ব্যবহারকারী বা প্রতি গোষ্ঠী ভিত্তিতে ডিফল্ট সেটআপ করতে পারেন

/etc/security/limits.conf

ulimit -v KBYTESসর্বাধিক ভার্চুয়াল মেমরি আকার নির্ধারণ করে। আমি মনে করি না আপনি সর্বোচ্চ পরিমাণে অদলবদল দিতে পারেন। এটি ব্যবহারকারী কতটা ভার্চুয়াল মেমরি ব্যবহার করতে পারে তার সীমাবদ্ধতা।

সুতরাং আপনার limits.confলাইনটি থাকবে (সর্বাধিক 4Gস্মৃতিতে)

luser  hard  as   4000000

আপডেট - সিগ্রুপস

দ্বারা সীমাবদ্ধ ulimitএবং limits.confপ্রক্রিয়া অনুযায়ী হয়। আমি অবশ্যই এই বিষয়ে পরিষ্কার ছিল না।

আপনি যদি কোনও ব্যবহারকারী ব্যবহারের জন্য মোট পরিমাণ মেমরি সীমাবদ্ধ করতে চান (যা আপনি যা চেয়েছিলেন)। আপনি সিগ্রুপ ব্যবহার করতে চান ।

ইন /etc/cgconfig.conf:

group memlimit {
    memory {
        memory.limit_in_bytes = 4294967296;
    }
}

এটি এমন একটি তৈরি করে cgroupযাতে 4GiB এর সর্বাধিক মেমরি সীমা থাকে।

ইন /etc/cgrules.conf:

luser   memory   memlimit/

এই দ্বারা চালানো সকল প্রক্রিয়ার কারণ হবে luserভিতরে চালানো যাবে memlimitএর মধ্যে তৈরি করা Cgroups cgconfig.conf


এ জাতীয় জিনিস কি স্থির হয় useradd?
myWallJSON

4
@myWallJSON সরাসরি নয়, তবে আপনি তা অবিলম্বে এটি সীমাবদ্ধতাগুলিতে যুক্ত করতে পারেন, বা আপনি সীমানাঙ্কনফের নির্দিষ্ট সীমা সহ একটি গোষ্ঠী সেটআপ করতে পারেন এবং সেই গোষ্ঠীতে ব্যবহারকারী যুক্ত করতে পারেন।
ইউটোপিয়াবাউন্ড

1
সেটা খুবই ভালো! আমি জানতাম না যে আপনি এটি করতে পারেন! দুর্দান্ত উত্তর +1
ইয়ানিক গিরোয়ার্ড

1
@ ইউটিপিয়াউন্ড: আমার কিউ আপডেট করেছে কিছু ডেটা দিয়ে আমি ইউলিমিট ব্যবহার করার চেষ্টা করেছি।
myWallJSON

1
@ f.ardelian কার্নেল আপগ্রেড করুন। কীভাবে এটি করা যায় সে সম্পর্কে এখানে একটি নিবন্ধ !
ড্যানিয়েল সি সোব্রাল

4

আপনি ব্যবহারকারীর পর্যায়ে মেমরির ব্যবহার ক্যাপ করতে পারবেন না, একক প্রক্রিয়ার জন্যও ইউলিমিট তা করতে পারে।

এমনকি প্রতি ব্যবহারকারীর সীমাবদ্ধতা ব্যবহার করেও /etc/security/limits.conf, একজন ব্যবহারকারী একাধিক প্রক্রিয়া চালিয়ে সমস্ত স্মৃতি ব্যবহার করতে পারেন।

আপনি যদি সত্যই সংস্থানগুলি ক্যাপচার করতে চান, আপনার সোলারিসের অধীনে প্রকল্প এবং অঞ্চলগুলি দ্বারা ব্যবহৃত rcapd এর মতো একটি সংস্থান ব্যবস্থাপনার সরঞ্জাম ব্যবহার করা উচিত।

এমন কিছু আছে যা লিনাক্সে অনুরূপ বৈশিষ্ট্য সরবরাহ করে যা আপনি তদন্ত করতে পারেন: সিগ্রুপগুলি


ঠিক আছে, আমি মনে করি যে ব্যবহারকারীগণের লগইন শেলটিতে একটি ক্যাপ সেট করা বা এর মতো কোনও কিছু "ব্যবহারকারীর জন্য একটি সীমা নির্ধারণ" হিসাবে ব্যাখ্যা করা যেতে পারে, যেহেতু সমস্ত প্রক্রিয়া সেই শেল থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হবে?
amn

1
@ এমএন এটি করবে না এই জাতীয় সীমাবদ্ধতার জন্য কোনও ব্যবহারকারী সহজেই একটি নতুন লগইন শেল খুলতে পারে।
jlliagre

ঠিক আছে, এটি আমার অনুমানকে বাতিল করে দেয়।
amn

3

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

memory.memsw.limit_in_bytesএবং memory.limit_in_bytesঅদলবদল সহ যথাক্রমে সীমাবদ্ধ করে। ক্ষতিটি memory.limit_in_bytesহ'ল এটি গ্রুপের কোটার বিপরীতে সিগ্রুপে প্রক্রিয়াগুলির পক্ষে কার্নেল দ্বারা আটকানো ফাইলগুলি গণনা করে। কম ক্যাচিংয়ের অর্থ আরও বেশি ডিস্ক অ্যাক্সেস, সুতরাং যদি সিস্টেমটি অন্যথায় কিছু মেমরি উপলব্ধ থাকে তবে আপনি সম্ভাব্যভাবে কিছু কার্য সম্পাদন ত্যাগ করেন।

অন্যদিকে, memory.soft_limit_in_bytesসিগ্রুপকে ওভার-কোটায় যেতে দেয়, তবে কার্নেল ওওএম কিলারকে যদি অনুরোধ করা হয় তবে তাদের কোটার উপরে থাকা সিগ্রুপগুলি প্রথমে যুক্তিসঙ্গতভাবে মেরে ফেলা হবে। তবে এর নেতিবাচক দিকটি হ'ল এমন পরিস্থিতি রয়েছে যেখানে কিছু স্মৃতি তাত্ক্ষণিকভাবে প্রয়োজন হয় এবং OOM হত্যাকারীর জন্য হত্যা প্রক্রিয়াগুলির আশেপাশে দেখার সময় নেই, এমন ক্ষেত্রে অতিরিক্ত-কোটা ব্যবহারকারীর প্রক্রিয়াগুলির আগে কিছু ব্যর্থ হতে পারে নিহত.

ulimitতবে এটি একেবারে ভুল সরঞ্জাম tool ভার্চুয়াল মেমরির ব্যবহারের উপর ulimit স্থান সীমাবদ্ধতা, যা আপনি চান তা প্রায় নয়। অনেক বাস্তব-বিশ্বের অ্যাপ্লিকেশন শারীরিক মেমরির চেয়ে অনেক বেশি ভার্চুয়াল মেমরি ব্যবহার করে। বেশিরভাগ আবর্জনা-সংগৃহীত রানটাইম (জাভা, গো) খণ্ড খণ্ডগুলি এড়াতে এইভাবে কাজ করে। সি-তে একটি তুচ্ছ "হ্যালো ওয়ার্ল্ড" প্রোগ্রাম, যদি ঠিকানা স্যানিটাইজার দিয়ে সংকলিত হয় তবে 20TB ভার্চুয়াল মেমরি ব্যবহার করতে পারে। যে বরাদ্দকারীরা নির্ভর করে না sbrkযেমন জেমালোক (যা জংয়ের জন্য ডিফল্ট বরাদ্দকারী ) বা tcmalloc, এছাড়াও তাদের শারীরিক ব্যবহারের চেয়ে বেশি পরিমাণে ভার্চুয়াল মেমরির ব্যবহার করবে। দক্ষতার জন্য, অনেক সরঞ্জাম ফাইল এমএম্যাপ করবে, যা ভার্চুয়াল ব্যবহার বাড়ায় তবে শারীরিক ব্যবহারের প্রয়োজন হয় না। আমার সমস্ত ক্রোম প্রক্রিয়া প্রতিটি 2 টিবি ভার্চুয়াল মেমরি ব্যবহার করে। আমি 8 জিবি শারীরিক স্মৃতিযুক্ত একটি ল্যাপটপে আছি। এখানে যে কোনও উপায়ে ভার্চুয়াল মেমোরি কোটা সেট আপ করার চেষ্টা করা হয় তা ক্রোমকে ভেঙে দেয়, ক্রোমকে এমন কিছু সুরক্ষা বৈশিষ্ট্য নিষ্ক্রিয় করতে বাধ্য করে যা প্রচুর পরিমাণে ভার্চুয়াল মেমরি বরাদ্দের উপর নির্ভর করে (তবে ব্যবহার করে না), বা ব্যবহারকারীকে সিস্টেমটিকে অপব্যবহার করা থেকে বিরত রাখতে সম্পূর্ণ অকার্যকর হতে পারে ।

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