লিনাক্সে, ফ্রি কমান্ড দ্বারা রিপোর্ট করা "বাফার" এবং "ক্যাশে" এর মধ্যে পার্থক্য কী?


73

এটি একটি পুরানো প্রশ্ন যা আমি সময়ে সময়ে দেখেছি। এটি সম্পর্কে আমার বোঝার পরিবর্তে সীমাবদ্ধ (পার্থক্যের বিষয়ে অনেক আগে পড়েছি, তবে জড়িত ফ্যাকটিড) গুলি কখনই সত্যই আটকে যায় না।

আমি এটা বুঝতে হিসাবে,

  • বাফার

    সক্রিয় আই / ও ক্রিয়াকলাপ সহ প্রোগ্রামগুলি দ্বারা ব্যবহৃত হয়, অর্থাত্ ডিস্কে লেখার জন্য অপেক্ষা করা ডেটা

  • ক্যাশে

    একটি অনুরোধ সন্তুষ্ট করতে সম্পূর্ণ I / O ক্রিয়াকলাপগুলির ফলাফল, অর্থাৎ ফ্লাশ করা বাফারগুলি ডিস্ক থেকে পড়া ডেটা বা ফলাফল?

আমি কি উত্তরোত্তর সম্পর্কে একটি পরিষ্কার ব্যাখ্যা পেতে পারি?



এটি মেটাডেটার মতো যা আপনি বাফারগুলিতে খুঁজে পান এটি আইও বাফারের সাথে সম্পর্কিত নয়। কিছু কার্নেল বাফার স্ল্যাব বরাদ্দকারী হিসাবে গণ্য করা হয় তবে মোটেই বাফার বা ক্যাশে মেমরি গণনা করে না।
21 ই

উত্তর:


42

"ক্যাশেড" মোটে কিছু অন্যান্য মেমরির বরাদ্দও অন্তর্ভুক্ত থাকবে, যেমন কোনও টিএমপিএফএস ফাইলসাইটগুলি। এটি কার্যকরভাবে দেখতে চেষ্টা করুন:

mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m

এবং আপনি র‌্যাম-ভিত্তিক ফাইল সিস্টেমে অনুলিপি করেছেন এমন 100Mb দ্বারা "ক্যাশে" মানটি নেমে আসবে (ধরে নিই যে যথেষ্ট পরিমাণে নিখরচায় র‌্যাম রয়েছে, আপনি যদি মেশিনটির শর্তে ইতিমধ্যে অতিরিক্ত প্রতিশ্রুতিবদ্ধ থাকেন তবে এর কিছুটি অদলবদীতেই শেষ হতে পারে) স্মৃতি ব্যবহারের)। প্রতিটি কল ফ্রি করার আগে "সিঙ্ক; প্রতিধ্বনি 3> / প্রকো / সিস / ভিএম / ড্রপ_ক্যাচস" সমস্ত লিখিত বাফারগুলিতে (সিঙ্ক) মুলতুবি থাকা কিছু লিখতে হবে এবং মেমরি থেকে সমস্ত ক্যাশেড / বাফারড ডিস্ক ব্লক সাফ করা উচিত তাই কেবল অন্য পড়তে হবে "ক্যাশেড" মানতে বরাদ্দ।

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

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


1
আকর্ষণীয় সূক্ষ্ম জন্য +1। এই ধরণের তথ্য আমি সন্ধান করছি। প্রকৃতপক্ষে, আমি সন্দেহ করি যে পরিসংখ্যানগুলি এতটাই বিশৃঙ্খল, এতগুলি বিভিন্ন ক্রিয়াকলাপের সাথে জড়িত, যাতে তারা সেরা সাধারণ সূচক হয় ators
এভেরি পেইন

আমি মনে করি না যে ভার্চুয়াল মেশিনগুলির দ্বারা ব্যবহৃত র্যামটি কমপক্ষে qemu-kvm এর জন্য "ক্যাশেড" হিসাবে গণনা করা হয়। আমি লক্ষ্য করেছি যে আমার কেভিএম হোস্টে, ক্যাশের মানটি সঠিক হওয়ার জন্য খুব কম নয় (১.৯ গিগে) তবে আমি আমার ভিএমগুলির কোনও ধ্বংস / শুরু করলে এটি পরিবর্তন হয় না। আমি যদি কোনও ভিএম-তে tmpfs মাউন্ট ট্রিকটি সম্পাদন করি তবে এটিও পরিবর্তন হয় না। আমি সেখানে একটি 800 মেগ tmpfs পার্টিশন তৈরি করেছি এবং "ক্যাশেড" ভিএম-তে যথাযথ মান দেখায় কিন্তু এটি ভিএম হোস্টের পরিবর্তিত হয়নি। আমি যখন আমার ভিএম ধ্বংস / শুরু করেছি তখন "ব্যবহৃত" মানটি সঙ্কুচিত / বৃদ্ধি পেয়েছিল।
মাইক এস

... আমি সেন্টোস 7.2.1511 ভিএম হোস্টে কার্নেল চলমান 3.10.0-327 এ পরীক্ষা করেছি।
মাইক এস

@ মাইকস: বিভিন্ন ভার্চুয়ালাইজেশন সমাধান হ্যান্ডল মেমোরির পরিবর্তনের জন্য পৃথকভাবে দায়বদ্ধ, বাস্তবে কার্নেল কীভাবে মেমরির বিভিন্ন ব্যবহারের ব্যবস্থা করে তা বড় সংস্করণগুলির মধ্যে পরিবর্তিত হতে পারে।
ডেভিড স্পিললেট

@ মাইকস: "ভিএমএসগুলির মধ্যে একটিতে টিএমপিএফস মাউন্ট ট্রিকটি সম্পাদন করুন" সম্পর্কিত ক্ষেত্রে - আমি যদি হোস্টরা অন্য ভিএম দ্বারা ব্যবহৃত মেম না দেখায় তবে হোস্টের পাঠকে প্রভাবিত করবে না। আমি নিজেই কেভিএম ভিএম তে এর প্রভাবটি দেখতে পাচ্ছি: ডিডি ফ্রি = 2020 এর আগে, ডিডি ফ্রি = 1899 এর পরে, ড্রপ এফএস ফ্রি = 2001 পরে (19 এমবি পার্থক্যটি ভিএম এর অন্যান্য প্রক্রিয়ার কারণে হবে, আমি যখন দৌড়েছিলাম তখন এটি অলস ছিল না) পরীক্ষা). হোস্টটি পরিবর্তনটি নাও দেখতে পারে: ভিএম-তে প্রক্রিয়াগুলি ব্যবহারের জন্য নিখরচায় হলেও মেমরিটি সম্ভবত ভিএম-তে বরাদ্দ করা হয়।
ডেভিড স্পিললেট

8

কৌশলী প্রশ্ন. আপনি যখন খালি স্থান গণনা করেন তখন আপনাকে আসলে বাফার এবং ক্যাশে উভয়ই যোগ করতে হবে। এটিই আমি খুঁজে পেতে পারি

একটি বাফার এমন একটি জিনিস যা এখনও ডিস্কে "লিখিত" থাকে। একটি ক্যাশে এমন কিছু যা ডিস্ক থেকে "পড়তে" এবং পরে ব্যবহারের জন্য সঞ্চিত থাকে।

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135


5

আমি বাফার সম্পর্কে আরও পরিষ্কার বিবরণ খুঁজছিলাম এবং আমি এটি খুঁজে পেয়েছি "Professional Linux® Kernel Architecture 2008"

অধ্যায় 16: পৃষ্ঠা এবং বাফার ক্যাশে

মিথষ্ক্রিয়া

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


3

রেডহ্যাট দ্বারা ব্যাখ্যা :

ক্যাশে পৃষ্ঠা:

একটি ক্যাশে মেমোরির অংশ যা স্বচ্ছভাবে ডেটা সঞ্চয় করে যাতে সেই ডেটার জন্য ভবিষ্যতের অনুরোধগুলি দ্রুত পরিবেশন করা যায়। এই মেমরিটি কার্নেল দ্বারা ডিস্ক ডেটা ক্যাশে করতে এবং i / o কর্মক্ষমতা উন্নত করতে ব্যবহৃত হয়।

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

যখন কোনও ধরণের ফাইল / ডেটা অনুরোধ করা হবে তখন কার্নেল ব্যবহারকারী যে ফাইলটি ব্যবহার করছে তার যে অংশটি অনুলিপি করেছে তা অনুলিপি সন্ধান করবে এবং যদি এরকম কোনও অনুলিপি উপস্থিত না থাকে তবে এটি ক্যাশে মেমরির একটি নতুন পৃষ্ঠা বরাদ্দ করবে এবং এটি পূরণ করবে উপযুক্ত বিষয়বস্তু ডিস্ক থেকে পড়া।

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

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

বাফার্স:

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


2

বাফার / ক্যাশে মুক্ত করা হচ্ছে

সতর্কতা এটি প্রোডাকশন সার্ভারে প্রস্তাবিত নয় এমন একটি শক্তিশালী পদ্ধতি ব্যাখ্যা করে! সুতরাং আপনাকে সতর্ক করা হয়েছে, কিছু ভুল হলে আমাকে দোষ দেবেন না।

জিনিসটি বোঝার জন্য, আপনি ক্যাশেড ফাইলটি ফেলে দেওয়ার চেয়ে আপনার সিস্টেমকে যথাসম্ভব মেমোরি দিতে বাধ্য করতে পারেন cache:

প্রস্তাবনা

পরীক্ষা করার আগে, আপনি অন্য একটি উইন্ডো হিট খুলতে পারবেন:

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
 1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
...

বাস্তব সময়ে অদলবদলের বিবর্তনের জন্য।

নোট: আপনার অবশ্যই বর্তমান ডিরেক্টরিতে যতগুলি ডিস্ক ফ্রি নিষ্পত্তি করতে হবে, আপনার কাছে মেম + অদলবদল রয়েছে

ডেমো
$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    2004320      60076          0      90740     945964
-/+ buffers/cache:     967616    1096780
Swap:      3145720      38812    3106908

$ tot=0
$ while read -a line;do
      [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
    done </proc/meminfo
$ echo $tot
10420232

$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s

$ cat >/dev/null veryBigFile

$ free
             total       used       free     shared    buffers     cached
Mem:       2064396    2010160      54236          0      41568    1039636
-/+ buffers/cache:     928956    1135440
Swap:      3145720      39132    3106588

$ rm veryBigFile 

$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    1005104    1059292          0      41840      48124
-/+ buffers/cache:     915140    1149256
Swap:      3145720      39132    3106588

নোটা, আমি যে কাজটি করেছিলাম তাতে হোস্টটি দৃ strongly়ভাবে ব্যবহৃত হয়। সত্যই শান্ত যন্ত্রটিতে এটি আরও তাৎপর্যপূর্ণ হবে।


1
-আমি যদি পারতাম। এটি উভয়ই (এ) জিজ্ঞাসিত প্রশ্নের সাথে অপ্রাসঙ্গিক এবং (খ) ক্যাশে ছাড়পত্রের ট্রিগার করার একটি ভয়াবহ ধোঁকা-বলের উপায়। সেখানে আধুনিক করতে সরাসরি উপায়ে বিদ্যমান, তাই এটি পর্যন্ত এটি একটি পার্শ্ব প্রতিক্রিয়া হিসেবে flushes ডেটার সাথে এটিকে স্প্যামিং দ্বারা মেনে চলার মধ্যে সিস্টেম প্রতারিত করার সমর্থনযোগ্য নয়
underscore_d

ওরে আমার গোশ! আসল সার্ভারগুলিতে কখনও কখনও এটি করবেন না!
tamerlaha

@ তমরলাহা আমি সম্মত, তবে অনুগ্রহ করে ১ ম অনুচ্ছেদটি আবার পড়ুন: আপনাকে সতর্ক করা হয়েছে, আমাকে দোষ দেবেন না ! এর লক্ষ্যটি হল বাফার / ক্যাশে জড়িত হওয়া দেখানো।
এফ। হাউরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.