কীভাবে আমি বিতরণে বহনযোগ্য মেমরির পরিমাণ পেতে পারি?


12

স্ট্যান্ডার্ড ফাইল / সরঞ্জাম যা মেমোরিটির প্রতিবেদন করে তাদের বিভিন্ন লিনাক্স বিতরণে বিভিন্ন ফর্ম্যাট রয়েছে বলে মনে হয়। উদাহরণস্বরূপ, আর্চ এবং উবুন্টুতে।

  • খিলান

    $ free
                  total        used        free      shared  buff/cache   available
    Mem:        8169312     3870392     2648348       97884     1650572     4110336
    Swap:      16777212      389588    16387624
    
    
    $ head /proc/meminfo 
    MemTotal:        8169312 kB
    MemFree:         2625668 kB
    MemAvailable:    4088520 kB
    Buffers:          239688 kB
    Cached:          1224520 kB
    SwapCached:        17452 kB
    Active:          4074548 kB
    Inactive:        1035716 kB
    Active(anon):    3247948 kB
    Inactive(anon):   497684 kB
    
  • উবুন্টু

    $ free
                 total       used       free     shared    buffers     cached
    Mem:      80642828   69076080   11566748    3063796     150688   58358264
    -/+ buffers/cache:   10567128   70075700
    Swap:     20971516    5828472   15143044
    
    
    $ head /proc/meminfo 
    MemTotal:       80642828 kB
    MemFree:        11565936 kB
    Buffers:          150688 kB
    Cached:         58358264 kB
    SwapCached:      2173912 kB
    Active:         27305364 kB
    Inactive:       40004480 kB
    Active(anon):    7584320 kB
    Inactive(anon):  4280400 kB
    Active(file):   19721044 kB
    

সুতরাং, আমি কীভাবে বহনযোগ্যভাবে (কেবল লিনাক্সের ডিস্ট্রোস জুড়ে) এবং নির্ভরযোগ্যভাবে মেমরির পরিমাণ পেতে পারি - অদলবদল বাদে software যা কোনও নির্দিষ্ট সময়ে আমার সফ্টওয়্যারটির জন্য ব্যবহারযোগ্য? সম্ভবত যে কি আউটপুটে হিসাবে "প্রাপ্তিসাধ্য" এবং "MemAvailable" টি দেখানো হচ্ছে freeএবং cat /proc/meminfoআর্চ কিন্তু আমি উবুন্টু বা অন্য বিতরণে একই পেতে পারি?

উত্তর:


18

MemAvailable/proc/meminfoকার্নেলের 3.14 সংস্করণ অন্তর্ভুক্ত করা হয়েছে; এটি কমিটমেন্ট 34e431b0a দ্বারা যুক্ত হয়েছিল । এটি আপনার প্রদর্শিত আউটপুট পরিবর্তনের নির্ধারক কারণ। প্রতিশ্রুতিবদ্ধ বার্তা ইঙ্গিত দেয় যে কীভাবে উপলব্ধ মেমরির অনুমান করতে হবে MemAvailable:

বর্তমানে, মেমরির পরিমাণ যে একটি নতুন কাজের চাপ জন্য উপলব্ধ, swap 'র মধ্যে সিস্টেম ঠেলাঠেলি ছাড়া, থেকে অনুমান করা যায় MemFree, Active(file), Inactive(file), এবং SReclaimableথেকে, সেইসাথে "কম" ওয়াটারমার্ক /proc/zoneinfo

লো ওয়াটারমার্কগুলি এমন স্তর যা নীচে সিস্টেমটি অদলবদল করবে। সুতরাং অনুপস্থিতিতে MemAvailableআপনি অন্তত জন্য দেওয়া মান পর্যন্ত যোগ করতে পারেন MemFree, Active(file), Inactive(file)এবং SReclaimable(বর্তমান রয়েছে যেটা /proc/meminfo), এবং কম ওয়াটারমার্ক বিয়োগ /proc/zoneinfo। পরবর্তীকালে জোন প্রতি ফ্রি পৃষ্ঠাগুলির সংখ্যাও তালিকাবদ্ধ করে, এটি তুলনা হিসাবে কার্যকর হতে পারে ...

সম্পূর্ণ অ্যালগরিদমটি প্যাচটিতে দেওয়া হয়েছে meminfo.cএবং মানিয়ে নেওয়া যুক্তিসঙ্গতভাবে সহজ বলে মনে হচ্ছে:

  • সমস্ত অঞ্চল জুড়ে স্বল্প জলছবিগুলি যোগ করুন;
  • চিহ্নিত ফ্রি মেমরি নিন ( MemFree);
  • নিম্ন ওয়াটারমার্ক বিয়োগ (আমাদের অদলবদল এড়ানোর জন্য যে স্পর্শ এড়াতে হবে);
  • পৃষ্ঠা ক্যাশে (যোগফল Active(file)এবং যোগ Inactive(file)) থেকে আমরা যে পরিমাণ মেমরি ব্যবহার করতে পারি তা যুক্ত করুন: এটি পৃষ্ঠার ক্যাশে যে পরিমাণ মেমরি ব্যবহার করে তা হল মাইনাসের অর্ধেক পৃষ্ঠার ক্যাশে বা কম ওয়াটারমার্ক, যেকোন ছোট হোক না কেন;
  • SReclaimableএকই অ্যালগরিদম অনুসরণ করে আমরা ( ) পুনরায় দাবি করতে পারি এমন পরিমাণ মেমরি যুক্ত করুন ।

সুতরাং, এই সমস্ত কিছু একসাথে রাখলে আপনি নতুন প্রক্রিয়াটির জন্য মেমরিটি এগুলি পেতে পারেন:

awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') \
 '{a[$1]=$2}
  END{ 
   print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low); 
  }' /proc/meminfo 

আহ, ভাল, কমপক্ষে এটি একই কার্নেল সংস্করণে পোর্টেবল হওয়া উচিত। এইটা একটা জিনিস. আমি আপনার পরামর্শটি যাচাই করছি awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') '{a[$1]=$2}END{m=a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]; print a["MemAvailable:"],m-low}' /proc/meminfoযা দিয়ে আমাকে একই নম্বরটি বার বার মুদ্রিত করা উচিত। তবে দ্বিতীয় সংখ্যাটি (আপনার প্রস্তাবিত অ্যালগরিদম সম্পর্কে আমার বোঝাপড়া) এতে MemAvailableদেখানো চেয়ে বেশি /proc/meminfo। আমি কি ভুল করছি?
terdon

2
/proc/zoneinfoপৃষ্ঠাগুলি গণনা করা হয়, যা বেশিরভাগ আকারে 4KB থাকে amd64; আপনি পৃষ্ঠা ক্যাশে এবং পুনরুদ্ধারযোগ্য মেমোরিতে যুক্ত হওয়া অতিরিক্ত সুরক্ষাটিও হারিয়েছেন। পরবর্তীটি সরল করে আমরা তিনবার নিম্ন জলছবিটি বিয়োগ করতে পারি, সুতরাং m-12*low(3 × 4KB) আমার সিস্টেমে সঠিক ফলাফল দেয়। (এই সরলকরণটি যদি পৃষ্ঠার ক্যাশে বা পুনরুদ্ধারযোগ্য মেমরিটি কম ওয়াটারমার্কের চেয়ে দ্বিগুণ হয় তবে উপলভ্য মেমরিটিকে কম দেখায় না but তবে আপনি সেই পরিস্থিতিতে তেমন স্মৃতি ব্যবহার করতে চাইবেন না যাতে এটি যুক্তিসঙ্গত আপস বলে মনে হয়))
স্টিফেন কিট

1
@ স্টেফেনকিট আপনি কীভাবে পুরানো কার্নেলগুলির প্রবেশদ্বার (file)বা SReclaimableএন্ট্রি নেই তার জন্য এটি গণনা করতে যাবেন ? কার্নেল ভি 2.6.18-348.16.1.el5xen সহ একটি পুরানো সেন্টো বাক্সে (প্রতি uname -r) এটি আমার প্রাপ্ত আউটপুট: পেস্টবিন . com/iFWiM1kX । আপনার গণনাটি কেবল MemFreeঅংশটি টানছে
মিচ

@ মিচ আমি জানি না, আমি নিশ্চিত না যে আপনার পুরানো কার্নেল থেকে প্রাপ্ত তথ্য উপলব্ধ মেমরিটি (অদলবদলের আগে) সঠিকভাবে নির্ধারণ করার জন্য যথেষ্ট is
স্টিফেন কিট

যারা এই থ্রেডে অবদান রেখেছেন তাদের সবাইকে ধন্যবাদ, এটি একটি দুর্দান্ত রেফারেন্স। মেমোভ্যালেবলের গণনাটি লিনাক্স ৪.৪ এ সামান্য সমন্বয় করা হয়েছে। তবে নতুন মেমোভ্যাবলযোগ্য গণনাটি সর্বদা পুরানোটির চেয়ে কিছুটা বেশি (বা সম্ভবত একই হিসাবে) হওয়া উচিত, সুতরাং এটি সমস্ত ক্ষেত্রে পুরানো গণনাটি ব্যবহার করা নিরাপদ হওয়া উচিত। gitlab.com/procps-ng/procps/issues/42
সোর্সজেডি

7

স্টিফেনের উত্তর পুরোপুরি যথেষ্ট এবং সতর্কতার দিক থেকে ভুল হলেও আমি ন্যূনতম তুলনা সহ সম্পূর্ণ যুক্তিটি লেখার সিদ্ধান্ত নিয়েছি। তথ্য প্রথমে / proc / meminfo থেকে পড়ে এবং একটি ভেরিয়েবলে সংরক্ষণ করা হয় যাতে মেমরির বিবরণ সামঞ্জস্য হয়।

LOW_WATERMARK=$(awk '$1 == "low" {LOW_WATERMARK += $2} END {print LOW_WATERMARK * 4096}' /proc/zoneinfo)

MEMINFO=$(</proc/meminfo)

MEMINFO_MEMFREE=$(echo "${MEMINFO}" | awk '$1 == "MemFree:" {print $2 * 1024}')
MEMINFO_FILE=$(echo "${MEMINFO}" | awk '{MEMINFO[$1]=$2} END {print (MEMINFO["Active(file):"] + MEMINFO["Inactive(file):"]) * 1024}')
MEMINFO_SRECLAIMABLE=$(echo "${MEMINFO}" | awk '$1 == "SReclaimable:" {print $2 * 1024}')

MEMINFO_MEMAVAILABLE=$((
  MEMINFO_MEMFREE - LOW_WATERMARK
  + MEMINFO_FILE - ((MEMINFO_FILE/2) < LOW_WATERMARK ? (MEMINFO_FILE/2) : LOW_WATERMARK)
  + MEMINFO_SRECLAIMABLE - ((MEMINFO_SRECLAIMABLE/2) < LOW_WATERMARK ? (MEMINFO_SRECLAIMABLE/2) : LOW_WATERMARK)
))

if [[ "${MEMINFO_MEMAVAILABLE}" -le 0 ]]
then
  MEMINFO_MEMAVAILABLE=0
fi

পরিবর্তনশীল মধ্যে সঞ্চিত ফলাফল বাইট হয়।


এই উত্তরটি 34e431b0a প্রতিশ্রুতিতে গণনা প্রয়োগ করে, স্টিফেন কিটের উত্তর আমি পরীক্ষিত 5 টির মধ্যে 2 টি মেশিনের আরও সঠিক অনুমান সরবরাহ করেছে provided সমস্ত 5 টি মেশিনে, উভয় উত্তরই ম্যাকএভায়বিলিটি / প্রো / মেমিনফো থেকে সরাসরি পড়ার চেয়ে বড় অনুমান দেয়। সম্ভবত একটি নিরাপদ উপায় হ'ল 2 এর মধ্যে ছোটটি অর্জন করা এবং 0.95 বা তার বেশি গুণ করে।
toddwz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.