"ক্যাশেড" মেমরি ডি-ফ্যাক্টো মুক্ত?


11

চলমান অবস্থায় cat /proc/meminfo, আপনি শীর্ষে এই 3 টি মান পাবেন:

MemTotal:        6291456 kB
MemFree:         4038976 kB
Cached:          1477948 kB

যতদূর আমি জানি, "ক্যাশেড" মানটি লিনাক্স সিস্টেমের তৈরি ডিস্ক ক্যাশে যা কোনও অ্যাপ্লিকেশনকে আরও বেশি র্যামের প্রয়োজন হলে অবিলম্বে মুক্তি দেওয়া হবে, সুতরাং মেমফ্রি এবং ক্যাশেড উভয়ই শূন্য না হওয়া অবধি লিনাক্স কখনই মেমরির বাইরে চলে না।

দুর্ভাগ্যক্রমে, "মেমোএভলভ্যালিটি" / proc / meminfo দ্বারা প্রতিবেদন করা হয়নি, সম্ভবত কারণ এটি ভার্চুয়াল সার্ভারে চলছে। (কার্নেলের সংস্করণটি ৪.৪)

সুতরাং সমস্ত ব্যবহারিক উদ্দেশ্যে, অ্যাপ্লিকেশনগুলির জন্য উপলব্ধ র্যামটি মেমফ্রি + ক্যাশেড।

এটা কি সঠিক?


1
আমি এই সোনার হাতুড়িটি বন্ধ করতে চাই না, তবে নকলটি না থাকলে এই প্রশ্নটি প্রাসঙ্গিক। আমি অবাক হয়েছি যে আপনার কাছে নেই MemAvailable, এটি 3.14 এ যুক্ত করা হয়েছিল।
স্টিফেন কিট

এই প্রশ্নের গৃহীত উত্তরটি / প্রোক / জোনিনফো ব্যবহার করে, যা আমার ভ্যাসভারেও উপলভ্য নয়
রোল্যান্ড Seuhs

আনম-এ: লিনাক্স হোস্ট 4.4.0-042stab134.8 # 1 এসএমপি শুক্র ডিসেম্বর 7 17:16:09 এমএসকে 2018 x86_64 x86_64 x86_64 জিএনইউ / লিনাক্স
রোল্যান্ড সেউহস

আমি সন্দেহ করি এটি একটি ওপেনভিজেড সিস্টেম যা কার্নেল সহ যা সত্যই ২.৪.৩২ এর উপর ভিত্তি করে, ৪.৪ নয়।
স্টিফেন কিট

1
@ সোর্সজেদি এবং এটি ঠিক একই সময়ে সংকলিত হয়েছিল ৪.৪ কার্নেলের মতো!
স্টিফেন কিট

উত্তর:


10

রিয়েল-ওয়ার্ল্ডের কয়েকটি ক্ষেত্রে এই দৃশ্যটি খুব বিভ্রান্তিকর হতে পারে।

কার্নেলটি বর্তমানে MemAvailableমাঠে উপলব্ধ মেমরির জন্য একটি অনুমান সরবরাহ করে । এই মান থেকে উল্লেখযোগ্যভাবে পৃথক MemFree + Cached

/ প্রোক / মেমিনফো: আনুমানিক উপলব্ধ মেমরি সরবরাহ করুন [কর্নেল পরিবর্তন বর্ণনা, ২০১৪]

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

এটি ভুল কারণ ক্যাশে এমন মেমরি রয়েছে যা পৃষ্ঠা ক্যাশে হিসাবে মুক্ত নয়, উদাহরণস্বরূপ ভাগ করা মেমরি বিভাগ, tmpfs, এবং ramfs, এবং এটি পুনরুদ্ধারযোগ্য স্ল্যাব মেমরি অন্তর্ভুক্ত করে না, যা বেশিরভাগ নিষ্ক্রিয় সিস্টেমে সিস্টেম মেমরির একটি বৃহত ভগ্নাংশ নিতে পারে প্রচুর ফাইল।

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

নথিপত্র / ফাইল সিস্টেম / proc.txt:
...
MemAvailable: কত স্মৃতি নতুন অ্যাপ্লিকেশন শুরু, সোয়াপিং ছাড়া জন্য উপলব্ধ একটি অনুমান। মেমফ্রি, এসআরসিলেবল, ফাইল এলআরইউ তালিকার আকার এবং প্রতিটি জোনে কম জলছবি থেকে গণনা করা হয়েছে। অনুমানটি বিবেচনায় নেয় যে সিস্টেমটি কার্যকরভাবে কাজ করতে কিছু পৃষ্ঠার ক্যাশে প্রয়োজন এবং আইটেমগুলি ব্যবহারের কারণে সমস্ত পুনরুদ্ধারযোগ্য স্ল্যাব পুনরুদ্ধারযোগ্য হবে না। এই কারণগুলির প্রভাব সিস্টেম থেকে অন্য সিস্টেমে পরিবর্তিত হবে।

1. স্মরণযোগ্য বিশদ

যেমন এটি উপরে বলেছে, tmpfs এবং অন্যান্য Shmemমেমরি মুক্ত করা যায় না, কেবল অদলবদলে স্থানান্তরিত হয়। Cachedমধ্যে /proc/meminfoখুব, বিভ্রান্তিকর এই swappable সহ কারণে হতে পারে Shmemমেমরির। আপনার যদি একটি tmpfs এ অনেকগুলি ফাইল থাকে তবে এটি আপনার প্রচুর স্মৃতিতে দখল করতে পারে :-)। Shmemকিছু গ্রাফিক্স মেমরি বরাদ্দও অন্তর্ভুক্ত করতে পারে, যা খুব বড় হতে পারে।

MemAvailableইচ্ছাকৃতভাবে swappable মেমরি অন্তর্ভুক্ত করা হয় না। অতিরিক্ত অদলবদল করতে বিলম্ব হতে পারে। এমনকি আপনি অদলবদল ছাড়াই চালানো পছন্দ করেছেন, বা কেবল অপেক্ষাকৃত সীমিত পরিমাণের জন্য অনুমতি দিয়েছেন।

আমাকে কীভাবে MemAvailableকাজ করে ডাবল-চেক করতে হয়েছিল । প্রথম নজরে, কোডটি এই পার্থক্যের উল্লেখ করে বলে মনে হয়নি।

/*
 * Not all the page cache can be freed, otherwise the system will
 * start swapping. Assume at least half of the page cache, or the
 * low watermark worth of cache, needs to stay.
 */
pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];
pagecache -= min(pagecache / 2, wmark_low);
available += pagecache;

তবে, আমি এটি সঠিকভাবে Shmem"ব্যবহৃত" মেমরি হিসাবে বিবেচনা করি । আমি একটি টিএমপিএসে বেশ কয়েকটি 1 জিবি ফাইল তৈরি করেছি। প্রতি 1 জিবি বৃদ্ধি 1 জিবি দ্বারা Shmemহ্রাস MemAvailable। সুতরাং "ফাইল এলআরইউ তালিকাগুলির আকার" এ ভাগ করা মেমরি বা অন্য কোনও স্বাপযোগ্য মেমরি অন্তর্ভুক্ত করে না। (আমি এই একই পৃষ্ঠা গন্য এছাড়াও ব্যবহার করা হয় লক্ষ্য করেছি যে কোডটি 'নোংরা সীমা "হিসাব মধ্যে )।

এই MemAvailableগণনাটি ধরেও নিয়েছে যে আপনি কার্নেলের "লো ওয়াটারমার্ক" এর সমান করতে কমপক্ষে পর্যাপ্ত ফাইল ক্যাশে রাখতে চান। বা বর্তমান ক্যাশে অর্ধেক - যেটি ছোট। (এটি পুনরুদ্ধারযোগ্য স্ল্যাবগুলির জন্য একই ধারণাও তৈরি করে)। কার্নেলের "লো ওয়াটারমার্ক" টিউন করা যায়, তবে এটি সাধারণত সিস্টেমের র্যামের প্রায় 2% । সুতরাং আপনি যদি কেবল কোনও মোটামুটি অনুমান করতে চান তবে আপনি এই অংশটি উপেক্ষা করতে পারেন :-)।

আপনি যখন firefoxপৃষ্ঠার ক্যাশে ম্যাপযুক্ত প্রায় 100MB প্রোগ্রাম কোড নিয়ে চলছেন , আপনি সাধারণত সেই 100MB র‌্যামে রাখতে চান :-)। অন্যথায়, সর্বোপরি আপনি বিলম্বিত হবেন, সবচেয়ে খারাপ সময়ে সিস্টেম তার সমস্ত সময় বিভিন্ন অ্যাপ্লিকেশনগুলির মধ্যে ছড়িয়ে দেওয়ার জন্য ব্যয় করবে । সুতরাং এর MemAvailableজন্য র‍্যামের একটি অল্প শতাংশের অনুমতি দেওয়া হচ্ছে। এটি যথেষ্ট পরিমাণে অনুমতি না দেয় বা এটি অতিরিক্ত উদার হতে পারে। "এই কারণগুলির প্রভাব সিস্টেম থেকে সিস্টেমে পৃথক হবে"।

অনেকগুলি পিসি ওয়ার্কলোডের জন্য, "প্রচুর ফাইল" সম্পর্কিত পয়েন্টটি প্রাসঙ্গিক নাও হতে পারে। তবুও, আমার বর্তমানে আমার ল্যাপটপে 500 এমবি রিক্লেমিয়েবল স্ল্যাব মেমরি রয়েছে (8 জিবি র‌্যামের বাইরে)। এটি ext4_inode_cache(300K এরও বেশি অবজেক্ট) কারণে । এটি ঘটেছিল কারণ আমার ডিস্কের স্থানটি কী ব্যবহার করছে তা সন্ধান করতে আমাকে সম্প্রতি পুরো ফাইল সিস্টেমটি স্ক্যান করতে হয়েছিল :-)। আমি কমান্ডটি ব্যবহার করেছি df -x / | sort -n, তবে উদাহরণস্বরূপ জিনোম ডিস্ক ব্যবহার বিশ্লেষক একই কাজ করবে।

২. [সম্পাদনা করুন] কন্ট্রোল গ্রুপগুলিতে মেমরি

তথাকথিত "লিনাক্স পাত্রে" থেকে নির্মিত হয় namespaces, cgroupsএবং স্বাদ অনুযায়ী বিভিন্ন অন্যান্য বৈশিষ্ট্য :-)। তারা প্রায় পুরো লিনাক্স সিস্টেমের মতো কিছু চালানোর জন্য একটি দৃ conv়প্রত্যয়ী পরিবেশ সরবরাহ করতে পারে। হোস্টিং পরিষেবাগুলি এই জাতীয় পাত্রে তৈরি করতে পারে এবং এগুলিকে "ভার্চুয়াল সার্ভার" :-) হিসাবে বিক্রি করতে পারে।

হোস্টিং সার্ভারগুলি মেইনলাইন লিনাক্সে নেই এমন বৈশিষ্ট্যগুলি ব্যবহার করে "ভার্চুয়াল সার্ভারগুলি" তৈরি করতে পারে। ওপেনজেড কনটেইনারগুলি দু'বছরের মধ্যে পূর্ব-তারিখের মূললাইন সিগ্রুপগুলিতে মেমরি সীমাবদ্ধ করতে "বিঙ্কাউন্টারস" ব্যবহার করতে পারে। সুতরাং আপনি যদি ডকুমেন্টগুলি পড়েন বা মূললাইন লিনাক্স কার্নেল সম্পর্কে প্রশ্ন জিজ্ঞাসা করেন তবে এই মেমরিটি কীভাবে সীমাবদ্ধ তা ঠিক বুঝতে পারবেন না। cat /proc/user_beancountersবর্তমান ব্যবহার এবং সীমা দেখায়। vzubcএটি কিছুটা বেশি বন্ধুত্বপূর্ণ বিন্যাসে উপস্থাপন করে। Beancounters মূল পৃষ্ঠা সারি নাম একটি প্রামাণ্য দলিল।

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

আপনি সিগ্রুপ-ভি 1 বা সিগ্রুপ-ভি 2 ব্যবহার করে যদি এর উপর নির্ভর করে এর জন্য ইন্টারফেসটি বিভিন্ন উপায়ে পৃথক হয় ।

আমার ল্যাপটপ ইনস্টল cgroup-v1 ব্যবহার করে। আমি দৌড়াতে পারি cat /sys/fs/cgroup/memory/memory.stat। ফাইল সহ বিভিন্ন ক্ষেত্র দেখায় total_rss, total_cache, total_shmem। tmpfs সহ shmem, মেমরির সীমাতে গণনা করে। আমার ধারণা আপনি এর total_rssবিপরীত সমতুল্য হিসাবে দেখতে পারেন MemFree। এবং সেখানে ফাইলও রয়েছে memory.kmem.usage_in_bytes, স্ল্যাব সহ কার্নেল মেমরি উপস্থাপন করে। (আমি ধরে নিলাম এর memory.kmem.মধ্যে রয়েছে memory.kmem.tcp.এবং ভবিষ্যতের যে কোনও এক্সটেনশন রয়েছে, যদিও এটি স্পষ্টভাবে দলিল করা হয়নি)। পুনঃসংশোধনযোগ্য স্ল্যাব মেমরি দেখার জন্য পৃথক কাউন্টার নেই। Cgroup-v1 এর জন্য নথিতে বলা হয়েছে যে মেমরির সীমাটি আঘাত করা কোনও স্ল্যাব মেমরির পুনঃসংশোধন করতে পারে না । (দস্তাবেজের একটি অস্বীকৃতিও রয়েছে যে এটি "আশাহীনভাবে পুরানো", এবং আপনার বর্তমান উত্স কোডটি পরীক্ষা করা উচিত)।

সিগ্রুপ-ভি 2 আলাদা। আমি মনে করি মূল (শীর্ষ-স্তর) সিগ্রুপ মেমরি অ্যাকাউন্টিং সমর্থন করে না। cgroup-v2 এখনও একটি memory.statফাইল আছে। সমস্ত ক্ষেত্র চাইল্ড সিগ্রুপের উপরে রয়েছে, তাই আপনাকে total_...ক্ষেত্রগুলি সন্ধান করার দরকার নেই । একটি fileক্ষেত্র রয়েছে, যার অর্থ একই কাজ cache। Annoyingly আমি একটি সামগ্রিক ক্ষেত্র দেখতে না পান rssভিতরে memory.stat; আমার ধারণা আপনার পৃথক ক্ষেত্রগুলি যুক্ত করতে হবে। পুনরুদ্ধারযোগ্য এবং অগ্রহণযোগ্য স্ল্যাব মেমরির জন্য পৃথক পরিসংখ্যান রয়েছে; আমি মনে করি কোনও ভি 2 সিগ্রুপ যখন মেমরিটিতে কম চলতে শুরু করে স্ল্যাবগুলি পুনরায় দাবি করতে ডিজাইন করা হয়েছে।

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

systemdcgroup-v1 বিশ্বাস করে যে নিরাপদে যেমন কনটেইনারগুলিতে অর্পণ করা যাবে না। আমি systemd-nspawnআমার সিগ্রুপ-ভি 1 সিস্টেমে একটি ধারকটির ভিতরে দেখেছি । আমি এটি ভিতরে রাখা cgroup এবং মেমরি অ্যাকাউন্টিং দেখতে পাচ্ছি। অন্যদিকে এতে থাকা systemdসংস্থানগুলি রিসোর্স অ্যাকাউন্টিংয়ের জন্য যথারীতি প্রতি-পরিষেবা সিগ্রুপ সেট আপ করে না। যদি এই সিগ্রুপের মধ্যে মেমরি অ্যাকাউন্টিং সক্ষম না করা হয়, তবে আমি ধারনা করি যে ধারকটি এটি সক্ষম করতে সক্ষম হবে না।

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



1
এটি ক্লিক করুন না। আমি গিটহাব লিঙ্কগুলি ব্যবহার করি কারণ তারা প্রতিশ্রুত (অনুরূপ git describe --contains) ধারণ করে প্রথম প্রকাশ করে । এটি এসএইউ প্রশ্নের দ্বারা একটি টিএল; ডিআর হিসাবে লিঙ্কিত পাওয়া গেছে, যা প্রো.ইচএসটিএস্টে যুক্ত বিভাগটির উদ্ধৃতি হিসাবে দেখা গেছে। তবে এই প্রশ্নের জন্য, প্রতিশ্রুতিবদ্ধ বিবরণটি কেবল নিখুঁত IMO :-)।
সোর্সজেদি

মেমোভ্যালিবলটি বেশিরভাগ ভার্চুয়াল সার্ভারগুলিতে উপলব্ধ বলে মনে হচ্ছে না ... তখন কী করব?
রোল্যান্ড Seuhs

@ রোল্যান্ডসিউস সম্ভবত "বিয়ানকাউন্টস" শিখবেন। সাহসীভাবে সম্পাদনাগুলি দেখুন। যদি আপনার beancounters সম্পর্কে কোনও প্রশ্ন থাকে, আপনি যদি নতুন প্রশ্ন জিজ্ঞাসা করেন তবে আমি এটির প্রশংসা করব। আমরা এটির সাথে সর্বদা এটির সাথে লিঙ্ক করতে পারি, তবে বিশদগুলি সম্ভবত কোনও মূললাইন লিনাক্স কার্নেল ব্যবহারকারী কোনও পাঠকের সাথে প্রাসঙ্গিক নয়।
সোর্সজেডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.