কিভাবে অ্যাপ্লিকেশন মেমরি ব্যবহার সীমাবদ্ধ?


10

আমি এই বিষয়ে 2 ঘন্টা প্রশ্ন পড়তে ব্যয় করেছি এবং এখনও কিছু ভুল বোঝাবুঝি আছে।

আমার এই প্রক্রিয়াটি রয়েছে:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

এটি 19.3Mbসিস্টেম রেসিডেন্ট মেমরির ব্যবহার করে (আমার কাছে কোনও সোয়াপ ফাইল নেই), 1.8%পুরো 1GBসিস্টেমের মেমরির প্রায় রয়েছে । ভার্চুয়াল আকার 1.39GB?!? আমি পড়েছি যে ulimit -mকাজ করে না। ulimit -vপ্রক্রিয়াটির জন্য লোকেরা উদাহরণস্বরূপ ভার্চুয়াল মেমরি সেট করে। এই ভার্চুয়াল মেমরিটি কি একটি ভিএসজেডের সাথে তালিকাভুক্ত ps? 100MBসর্বাধিক সিস্টেম মেমরি ব্যবহার করতে আমি এই প্রক্রিয়াটি সীমাবদ্ধ রাখতে চাইলে আমার কোন মান নির্ধারণ করা উচিত । আমি এর জন্য ডকুমেন্টেশন পড়েছি setrlimitএবং এটি যথাযথ বলে মনে হচ্ছে:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

তবে ডকুমেন্টেশনের অন্যান্য সংস্করণগুলিতে এই RLIMIT_ASপরামিতিটি ভার্চুয়াল মেমরির আকার নির্ধারণ করে। সত্য কি?


দয়া করে পোস্ট ফর্ম্যাটে কিছুটা মনোযোগ দিন।
rozcietrzewiacz

উত্তর:


6

হ্যাঁ, ভিএসজেড ভার্চুয়াল মেমরি। আরএলআইএমআইআইএএস হিসাবে, আপনি উপরের উদ্ধৃত অনুচ্ছেদটি কোথায় পেয়েছেন? যেহেতু সেট্রলিমিট (2) একটি লিনাক্স সিস্টেম কল, সুতরাং আমি এটি দেখতে পাচ্ছি না এটি সম্ভবত কোনও লাইব্রেরির ফাংশন malloc (3) কীভাবে পর্যবেক্ষণ করতে পারে। পরিবর্তে, এটি কেবলমাত্র brk (2), sbrk (2), এবং mmap (2) নিয়ে কাজ করতে পারে - এটির ম্যানপেজ (বৈজ্ঞানিক লিনাক্সের পরীক্ষিত) এর পরামর্শও এটি। যাইহোক, এই ফাংশন মাধ্যমে অনুরোধ মেমরি মোট পরিমাণ হয় ভার্চুয়াল মেমরি তাই RLIMIT_AS প্রকৃতপক্ষে ভার্চুয়াল মেমরি সীমিত করে। (এটি আবার সেটরলিমিট (2) ম্যানপেজ অনুসারে)

দুর্ভাগ্যক্রমে, আপনি লিনাক্সের অধীনে আরএসএসকে সীমাবদ্ধ করতে পারবেন না (এটি হবে ulimit -m)। আপনি চেষ্টা করতে পারেন ulimit -d(RLIMIT_DATA), তবে এটি এমএম্যাপ (2) উপেক্ষা করবে, সাধারণত বড় বরাদ্দের জন্য ব্যবহৃত হয়। আর একটি সম্ভাবনা ভার্চুয়াল মেমরির সীমিত করা, তবে আরএসএস এবং ভিএসজেডের মধ্যে এত বড় পার্থক্য থাকা, এটি কঠিন হতে পারে।


আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। অনুচ্ছেদটি setrlimitম্যান পৃষ্ঠা থেকে IEEE/The Open Group 2003 GETRLIMIT(3P)এসেছে কীভাবে আসুন psআমাকে আরএসএস দেখায়, কিন্তু কার্নেল এতে সীমাবদ্ধতা প্রয়োগ করতে পারে না?
ড্র্যাগোমির ইভানভ

6
অ্যালান কক্সের মতে, এর historicalতিহাসিক কারণ রয়েছে: আরএসএস গণনা ব্যয়বহুল হত, সুতরাং সীমাটি প্রয়োগ করা কর্নেলের উপর একটি বড় বোঝা চাপিয়ে দেয়; উৎস: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html । আরও দেখুন stackoverflow.com/questions/3043709/...
Ansgar Esztermann

আমি দেখি. আমার ধারণা আমি ulimit -dতখন সাথে যাব । অ্যাপ্লিকেশনটি আমার দ্বারা লিখিত, এবং আমি ব্যবহার করিনি mmap()
ড্রাগগোমির ইভানভ

2
না, আপনি সাধারণত না (না sbrk ()), কিন্তু malloc () হতে পারে।
আনসার এস্জেটারম্যান

আমি দেখি. এটা খুব দুর্ভাগ্যজনক। সুতরাং এই প্রশ্নের সমাধানটি হ'ল হয় সিগ্রুপস, বা কোনও স্ক্রিপ্ট ভাষার সাথে মেমরির ব্যবহার পোল।
ড্রাগগোমির ইভানভ

3

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

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