এটি একটি পুরানো পোস্ট, তবে আমি এখনও আমার চিন্তাভাবনা এখানে রাখার স্বাধীনতা গ্রহণ করব।
নীচে থেকে শুরু করে লিনাক্স প্রথমে মেমরিটিকে পৃষ্ঠাগুলিতে ভাগ করে দেয় (সাধারণত x86_64 সিস্টেমে প্রতি পৃষ্ঠায় 4K)। এরপরে, ভার্চুয়াল মেমরি তৈরি হয়, যার ম্যাপিং এমএমইউ (মেমরি ম্যানেজমেন্ট ইউনিট) ব্যবহার করে শারীরিক মেমরির সাহায্যে সম্পন্ন হয়।
প্রক্রিয়াগুলি ভার্চুয়াল মেমরি অঞ্চল থেকে মেমরি বরাদ্দ করা হয়, সুতরাং দয়া করে নোট করুন, আপনি যখন / প্রোম / মেমিনফো দেখবেন, আপনি ভার্চুয়াল মেমরির বিশদ হিসাবে VMalloc * দেখতে পাবেন।
যাক মেমোরির জন্য অনুরোধ করে এমন একটি প্রক্রিয়া রয়েছে যা বলুন (300MB বলুন - একটি ওয়েব ব্রাউজার)। প্রক্রিয়াটি ভার্চুয়াল মেমরি থেকে 300MB বরাদ্দ করা হবে, তবে এটি প্রয়োজনীয় নয় এটি মেমরি ম্যাপ করা হয় (এটি শারীরিক স্মৃতিতে ম্যাপ করা হয়)। মেমোরি পরিচালনার জন্য "কপিরাইট অন রাইটিং" ধারণা রয়েছে, যার মাধ্যমে যদি আপনার প্রক্রিয়াগুলি প্রকৃতপক্ষে ভার্চুয়াল মেমরি থেকে বরাদ্দকৃত মেমরিটি ব্যবহার করে (তবে এটি মেমরিটিতে কিছু লেখেন) তবেই এটি শারীরিক স্মৃতিতে ম্যাপ করা হয়। এটি কার্নেলকে একটি বহু-প্রক্রিয়া পরিবেশে দক্ষতার সাথে সঠিকভাবে কাজ করতে সহায়তা করে।
ক্যাশে কি?
প্রক্রিয়া দ্বারা ব্যবহৃত প্রচুর মেমরি ভাগ করা হয়। বলুন যে গ্লিবিক লাইব্রেরি প্রায় সমস্ত প্রক্রিয়া দ্বারা ব্যবহৃত হয়। গ্লোবিকের একাধিক কপি স্মৃতিতে রাখার কী দরকার, যখন প্রতিটি প্রক্রিয়া একই মেমরির অবস্থান অ্যাক্সেস করতে পারে এবং কাজ করতে পারে। এ জাতীয় প্রায়শই ব্যবহৃত সম্পদগুলি ক্যাশে রাখা হয় যাতে প্রক্রিয়াগুলি যখন চাহিদা করে তখন সেগুলি একই মেমরির স্থানে উল্লেখ করা যায়। এটি প্রক্রিয়াগুলি গতিতে সহায়তা করে, কারণ গ্লিবসি (ইত্যাদি) পড়া এবং ডিস্ক থেকে আবার সময় সাপেক্ষ হতে পারে।
উপরেরগুলি প্রতি ভাগ ভাগ করা লাইব্রেরিগুলির জন্য ছিল, ফাইল পড়ার ক্ষেত্রেও এটি একই। আপনি যদি প্রথমবারের মতো একটি বড় ফাইল (100-200MB বলুন) পড়েন তবে অনেক সময় লাগবে। যাইহোক, আপনি যখন আবার একই পঠন করার চেষ্টা করেন এবং এটি করেন তখন তা আরও দ্রুত হয়। ডেটা মেমোরিতে ক্যাশে হয়েছিল এবং সমস্ত ব্লকের জন্য পুনরায় পঠন করা হয়নি।
বাফার কী?
বাফার সম্পর্কিত বিষয় হিসাবে, যখন কোনও প্রক্রিয়া I / O ফাইল করে, এটি ডিস্কে ডেটা লেখার জন্য কার্নেলের বাফারের উপর নির্ভর করে। প্রক্রিয়াগুলি, কার্নেলকে কাজটি করার জন্য অনুরোধ করে। সুতরাং, প্রক্রিয়াটির পক্ষ থেকে, কার্নেল তথ্যটিকে তার "বাফার" -তে লিখে দেয় এবং প্রক্রিয়াটি জানায় যে লেখাটি সম্পন্ন হয়েছে। একটি অ্যাসিঙ্ক পদ্ধতিতে, কার্নেল এই ডেফারটি ডিস্কে বাফারে সিঙ্ক করতে থাকবে। এই পদ্ধতিতে, ডিস্কের সাথে ডেটা সিঙ্ক করার জন্য প্রসেসগুলি কার্নেলের উপর নির্ভর করে এবং প্রক্রিয়াগুলি এগিয়ে কাজ চালিয়ে যেতে পারে। মনে রাখবেন, এটি সাধারণ I / O যা সাধারণ প্রক্রিয়াগুলি করে। তবে, বিশেষায়িত প্রক্রিয়াগুলি, যা নিশ্চিত করতে হবে যে I / O আসলে ডিস্কে সম্পন্ন হয়েছে তা ডিস্কে আই / ও করার জন্য অন্য প্রক্রিয়া ব্যবহার করতে পারে। কিছু ওপেনসোর্স ইউটিলিটি লাইবাইও। এছাড়াও, আপনার প্রক্রিয়া প্রসঙ্গে খোলার এফডিগুলিতে সুস্পষ্ট সিঙ্ক কল করার উপায় রয়েছে,
পৃষ্ঠার ত্রুটিগুলি তখন কি?
একটি উদাহরণ বিবেচনা করুন, যখন আপনি কোনও প্রক্রিয়া শুরু করেন (কোনও ওয়েব ব্রাউজার বলুন), যার বাইনারি প্রায় 300MB। তবে ওয়েব ব্রাউজার বাইনারিটির সম্পূর্ণ 300MB তাত্ক্ষণিকভাবে কাজ শুরু করে না। প্রক্রিয়াটি তার কোডের মধ্যে ক্রিয়াকলাপ থেকে ক্রিয়াকলাপ থেকে সরতে থাকে। যেমন আগেই বলা হয়েছিল, ভার্চুয়াল মেমরিটি 300MB গ্রাস করা হবে তবে সমস্ত শারীরিক স্মৃতিতে মেমরি ম্যাপ করা হয় না (আরএসএস - বাসিন্দার মেমরি কম হবে, শীর্ষ আউটপুট দেখুন)। কোড এক্সিকিউশন যখন এমন একটি পর্যায়ে পৌঁছায়, যার জন্য মেমোরিটি আসলে শারীরিকভাবে ম্যাপ করা হয় না, তখন একটি পৃষ্ঠার ত্রুটি হতে পারে। কার্নেল এই মেমরিটিকে শারীরিকভাবে ম্যাপ করবে, মেমরি পৃষ্ঠাকে আপনার প্রক্রিয়াতে যুক্ত করবে। এই জাতীয় পৃষ্ঠা ত্রুটিটিকে "মাইনর পৃষ্ঠা ফল্টস" বলা হয়। একইভাবে বলতে গেলে, যখন কোনও প্রক্রিয়া ফাইল করা হয় I / O প্রধান পৃষ্ঠার ত্রুটিগুলি উত্থাপিত হয়।
কখন এবং কেন অদলবদল হয়?
পরিস্থিতি 1:
উপরের বিশদগুলির সাথে ইনলাইন করুন, যখন ভাল পরিমাণ মেমরি মেমরি ম্যাপ হয়ে যায় তখন একটি দৃশ্য বিবেচনা করি। এবং এখন একটি প্রক্রিয়া শুরু হয়, যার জন্য মেমরি দরকার। উপরে আলোচিত হিসাবে, কার্নেল কিছু মেমরি ম্যাপিং করবে। তবে মেমরিটি মানচিত্র করার জন্য পর্যাপ্ত শারীরিক র্যাম উপলব্ধ নেই। এখন, কার্নেল প্রথমে ক্যাশে সন্ধান করবে, এটিতে কিছু পুরানো মেমরি পৃষ্ঠা থাকবে যা ব্যবহার হচ্ছে না not এটি সেই পৃষ্ঠাগুলিকে একটি পৃথক বিভাজনে (SWAP নামে পরিচিত) ফ্লাশ করবে, কিছু পৃষ্ঠা মুক্ত করবে এবং নতুন অনুরোধে মুক্ত পৃষ্ঠাগুলি মানচিত্র করবে। যেহেতু ডিস্ক রাইটিংটি সলিড-স্টেট র্যামের চেয়ে অনেক ধীরে ধীরে, এই প্রক্রিয়াটি অনেক সময় নেয় এবং তাই একটি ধীর গতি দেখা যায়।
পরিস্থিতি 2:
বলুন আপনি সিস্টেমে প্রচুর ফ্রি মেমরি উপলব্ধ দেখতে পান। তারপরেও আপনি দেখতে পাচ্ছেন যে প্রচুর অদলবদল হচ্ছে। মেমরি খণ্ডিত হওয়ার সম্ভাব্য সমস্যা হতে পারে। এমন একটি প্রক্রিয়া বিবেচনা করুন, যা কার্নেল থেকে 50MB সংক্ষিপ্ত মেমরির দাবি করে। (নিয়মিত মনে রাখবেন)। স্পষ্টতই, কার্নেল বিভিন্ন প্রক্রিয়াগুলিতে এলোমেলোভাবে পৃষ্ঠাগুলি বরাদ্দ করত এবং তাদের কিছু মুক্ত করত। যাইহোক, আমরা যখন স্বচ্ছ মেমরির দাবি করি তখন এটির একটি অংশের সন্ধান করতে হবে যা প্রক্রিয়াগুলির চাহিদা পূরণ করে। যদি এটি এরকম কোনও স্মৃতি পেতে সক্ষম না হয় তবে এটি কিছু পুরানো স্মৃতি পৃষ্ঠাগুলির একটি অদলবদল করতে হবে এবং তারপরে সামঞ্জস্যযুক্তগুলি বরাদ্দ করতে হবে। এমনকি এ জাতীয় ক্ষেত্রে সোয়াপ আউট ঘটবে। কার্নেল ভার্চ ২.6 এবং তারপরের থেকে শুরু করে, এই জাতীয় খণ্ড সমস্যাগুলি হ্রাস পেয়েছে। তবে, যদি সিস্টেমটি দীর্ঘ সময় ধরে চলতে থাকে তবে এই জাতীয় সমস্যাগুলি এখনও আসতে পারে।
এই উদাহরণটি দেখুন ( vmstat আউটপুট )
2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32 r b swpd free buff cache si so bi bo in cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660 1 8803 12701 4336 37487 14 7 40 38 0
2016-10-30 03:56:34 3 20 2889296 4977580 3345316 12026752 2109 2 8445 14665 4656 36294 12 7 46 34 0
2016-10-30 03:57:04 1 11 3418868 4939716 3347804 11536356 586 4744 2547 9535 3086 24450 6 3 59 33 0 <<<-----
2016-10-30 03:57:34 3 19 3456252 5449884 3348400 11489728 3291 13371 6407 17957 2997 22556 6 4 66 24 0
2016-10-30 03:58:04 7 6 4194500 5663580 3349552 10857424 2407 12240 3824 14560 2295 18237 4 2 65 29 0
2016-10-30 03:58:34 2 16 4203036 5986864 3348908 10838492 4601 16639 7219 18808 2575 21563 6 4 60 31 0
2016-10-30 03:59:04 3 14 4205652 6059196 3348760 10821448 6624 1597 9431 4357 1750 20471 6 2 60 31 0
2016-10-30 03:59:34 2 24 4206968 6053160 3348876 10777216 5221 2067 10106 7377 1731 19161 3 3 62 32 0
2016-10-30 04:00:04 0 13 4205172 6005084 3348932 10785896 6236 1609 10330 6264 1739 20348 4 2 67 26 0
2016-10-30 04:00:34 4 11 4206420 5996396 3348976 10770220 6554 1253 10382 4896 1964 42981 10 5 58 27 0
2016-10-30 04:01:04 6 4 4177176 5878852 3348988 10825840 8682 765 10126 2716 1731 32949 8 4 69 19 0
@ 2016-10-30 03:57:04, আমরা দেখতে পাচ্ছি যে এখনও নিখরচায় বিনামূল্যে র্যাম পাওয়া যায়। তবে, তারপরেও অদলবদল হয়েছে happened আমরা এই মুহুর্তে প্রসেস ট্রিটি পরীক্ষা করেছিলাম এবং আমরা এমন কোনও প্রক্রিয়া আসতে দেখিনি যা এত বেশি পরিমাণে মেমরির (মুক্ত মেমরির চেয়ে বেশি) দাবি করবে। স্পষ্ট সন্দেহ ছিল পরিস্থিতি 2 উপরে বর্ণিত। আমরা উপরের বন্ধু-ইনফো এবং জোনিনফোর লগগুলি পরীক্ষা করেছি (এগুলি পরীক্ষা করার জন্য প্রতিধ্বনি এম> / প্রোক / সিসারকি-ট্রিগার ব্যবহার করুন, আউটপুট সিসলোগে যায়)।
আমাদের একটি সাধারণ সিস্টেমের জন্য, জোন তথ্যের তুলনাটি এটি যায়। এবং ক্যাশে / ফ্রি / লো মেমের গ্রাফগুলিও নীচে উল্লেখ করা হয়েছে
তথ্যের দিকে তাকালে, এটি স্পষ্ট যে নোড 0 এবং নোড 1 স্বাভাবিকের মধ্যে মেমরি বিভাজন রয়েছে (নোড এটি NUMA ভিত্তিক মেশিন, সুতরাং একাধিক নোড (আপনার সিস্টেমে তথ্য পরীক্ষা করার জন্য নিউম্যাক্টল দেখুন))।
ফ্রি মেমরি থাকা সত্ত্বেও অদলবদলের ব্যবহার বাড়ার কারণ মেমরি বিভাজনও একটি কারণ।