শেল স্ক্রিপ্ট দ্বারা পার্স করার জন্য উপযুক্ত আমার লিনাক্স বাক্সের মোট শারীরিক স্মৃতি (র‌্যাম) কীভাবে খুঁজে পাব?


123

কয়েকটি আরএইচইএল লিনাক্স বাক্সে মোট শারীরিক স্মৃতি সন্ধান করতে আমি একটি শেল স্ক্রিপ্ট টাইপ করছি।

সবার আগে আমি জোর দিয়ে বলতে চাই যে আমি কেবল উপলভ্য স্মৃতি নয়, কার্নেল দ্বারা স্বীকৃত মোট শারীরিক স্মৃতিতে আগ্রহী । অতএব, দয়া করে / proc / meminfo পড়ার বা বিনামূল্যে , শীর্ষ বা সর কমান্ড ব্যবহার করার পরামর্শ দেওয়া উত্তরগুলি এড়িয়ে চলুন - এই সমস্ত ক্ষেত্রে তাদের " মোট স্মৃতি " মানগুলি " উপলব্ধ স্মৃতি " বলে বোঝায় ।

প্রথম চিন্তাটি বুট কার্নেল বার্তা পড়ার ছিল:

Memory: 61861540k/63438844k available (2577k kernel code, 1042516k reserved, 1305k data, 212k init)

কিছু কিছু লিনাক্স বাক্সে, EMC2- র পাওয়ারপাথ সফ্টওয়্যার এবং কার্নেল প্রারম্ভকালে এর বন্যার বুট বার্তাগুলির ব্যবহারের কারণে , দরকারী বুট কার্নেল বার্তা উপলব্ধ নেই, এমনকি / var / লগ / ডেমেসগ ফাইলেও পাওয়া যায় না।

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

আমার শেষ সুযোগটি ছিল getconf কমান্ড। এটি মেমোরি পৃষ্ঠার আকারের প্রতিবেদন করে তবে মোট দৈহিক পৃষ্ঠাগুলির সংখ্যা নয় - _PHYS_PAGES সিস্টেমের ভেরিয়েবলটি উপলব্ধ দৈহিক পৃষ্ঠাগুলি হিসাবে মনে হয়, মোট দৈহিক পৃষ্ঠাগুলি নয়।

# getconf -a | গ্রেপ পৃষ্ঠা
পৃষ্ঠা 4096
_এভিপিওয়াইএসপ্যাগগুলি 1049978
_PHYS_PAGES 15466409

আমার প্রশ্ন: মোট শারীরিক মেমরির শেল স্ক্রিপ্টটি পার্স করার উপযুক্ত কি অন্য উপায় রয়েছে?


3
এটি লিনাক্স এবং ইউনিক্সে স্থানান্তরিত হওয়া উচিত
কলব ক্যানিয়ন

উত্তর:


56

আপনি যদি শারীরিক র‍্যামে আগ্রহী হন, কমান্ডটি ব্যবহার করুন dmidecode। এটি আপনাকে কেবল এটির চেয়ে অনেক বেশি তথ্য দেয় তবে আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে আপনি এটিও জানতে চাইতে পারেন যে সিস্টেমটিতে থাকা 8 জি 2x4GB স্টিক বা 4x2GB স্টিক থেকে এসেছে কিনা।


19
আমার সম্প্রতি এটি দরকার হয়েছিল এবং একটি সিস্টেমে সমস্ত মেমরি মডিউলগুলির মোট মেমরির আকার পেতে একটি সাধারণ কমান্ড রয়েছে: dmidecode -t 17 | গ্রেপ "আকার। * এমবি" | awk '{s + = $ 2} END {s / 1024} মুদ্রণ করুন
জোন্সিনেটর

6
অন্যান্য উত্তর থেকে পৃথক, dmidecode রুট সুবিধার প্রয়োজন
chus

1
এটি আমাকে এই ত্রুটিটি দেয় # ডমিডেকোড ৩.০ / সিস / ফার্মওয়্যার / ডিএমআই / টেবিল / এসএমবিওস_এন্ট্রি_পয়েন্ট: প্রবেশের পয়েন্টের জন্য অনুমতি স্ক্যানিং / ডেভ / মেম্বিকে অস্বীকার করেছে। / dev / mem: অনুমতি অস্বীকার করা হয়েছে
ভিভিবি

128

আপনি চেষ্টা করেছেন cat /proc/meminfo? তারপর তুমি পারো awk বা grep আউট কি আপনি চান, MemTotal যেমন

awk '/MemTotal/ {print $2}' /proc/meminfo

অথবা

cat /proc/meminfo | grep MemTotal

8
তবে মেমোটোটাল মোট শারীরিক স্মৃতি নয় - দয়া করে প্রোক (5) এর জন্য ম্যান পেজটি দেখুন
ক্রিস স্ট্রাটন

2
@ ক্রিসট্রেটটন: আপনি আরও স্পষ্টভাবে বলতে পারেন? বেশিরভাগ ব্যবহারিক উদ্দেশ্য এবং উদ্দেশ্যে, এই উত্তরটি যথেষ্ট হতে পারে।
ড্যান ড্যাসক্লেস্কু

13
awk '/MemTotal/ {print $2}' /proc/meminfo কম পাইপ আরও ভাল।
মাস্তা

3
সর্বাধিক মতামতযুক্ত বিকল্প: জঞ্জাল এড়ানো উচিত, যখন আপনি পারেন। রিজেক্স / পিসিআরই অনেক বেশি সার্বজনীন প্যাটার্ন মেলানো ভাষা (যেমন আপনি পাইথন বা পার্লেও এটি ব্যবহার করতে পারেন)। আপনি যদি বিশ্রী শিখেন তবে আপনার ইতিমধ্যে সবগুলিই অবাস্তব। আপনি যদি অন্যদিকে গ্রেপ + পিসিআরই ঝুঁকে থাকেন ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
গ্যাব্রিয়েল তোতুসেক

5
@ গ্যাব্রিলবারখোল্ডার এর বিপরীত দৃষ্টিভঙ্গিও রয়েছে: পসিক্স দ্বারা মানীকৃত awkতবে grepএর বিকল্পগুলি -oএবং এটিও -Pনয়! আপনার উদাহরণটি grepজিএনইউতে কার্যকর হবে (তবে জিএনইউ এখনও বলেছে যে পিসিআরই বাস্তবায়ন পরীক্ষামূলক) তবে এটি সম্ভবত অন্যান্য বাস্তবায়নের সাথে কাজ করবে না।
পাবউক

48

cat /proc/meminfo | grep MemTotalবা ফ্রি আপনাকে আপনার সার্ভারের সঠিক পরিমাণের র‍্যাম দেয়। এটি "উপলব্ধ স্মৃতি" নয়।

আমি অনুমান করি যখন আপনার একটি ভিএম থাকবে তখন আপনার সমস্যাটি উপস্থিত হবে এবং আপনি হাইপারভাইজার দ্বারা হোস্ট করা সম্পূর্ণ পরিমাণ মেমরি গণনা করতে চান তবে আপনাকে সেই ক্ষেত্রে হাইপারভাইজারে লগইন করতে হবে।

cat /proc/meminfo | grep MemTotal

সমতুল্য

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'

5
4 জিবি মেমরির cat /proc/meminfo | grep MemTotalপ্রতিবেদন সহ আমার শারীরিক বাক্সে MemTotal: 3957032 kB, এটি 4 জিবি থেকে বেশ খানিকটা ছোট। ওপি (এবং আমি) এমন কিছু সন্ধান করছে যা 4 জিবি রিপোর্ট করবে report
টিভি

1
এটি করার আরও সরাসরি উপায় কেবলgrep MemTotal /proc/meminfo
ড্যান পাসারো

3
@ টিভিই 3957032 kBস্রেফ বিভ্রান্তিকর এটা তোলে KiB লেবেল করা উচিত, যেমন নির্দেশিত এই পোস্টে । এর অর্থ এটি সত্যিকার অর্থে 4,052,000,768 বাইট প্রতিবেদন করছে যা 4 জিবি এর চেয়ে কিছুটা বড়। এটি / প্রোম / মেমিনফো বাস্তবায়ন কিবি স্বীকৃতিটির প্রাক-তারিখের কারণে is
জেফ জি

4
@ জেফজি আমার মনে হয় আপনি টুলমেকারস্টিভ যে পয়েন্টটি তৈরি করছেন তা মিস করেছেন। প্রত্যাশিত মান 4 জিবিবি নয় 4 জিবি, এবং টিভিটি কেবল মানটির ভুল ব্যবহার করে। টুলমেকারস্টিভটি সঠিক যে টিভিইর মন্তব্যে র্যামের "4 জিবি" "4 জিআইবি" হিসাবে ব্যাখ্যা করা উচিত, এবং সেইজন্য আমরা এর সাথে তুলনা করছি value আপনি ঠিক বলেছেন যে মানটি 4 গিগাবাইটের চেয়েও বেশি, ঠিক যেমন এটি 2 জিবি এবং 2 জিআইবি এবং 6 জিবি এবং 6 জিবিবি এর চেয়েও কম, তবে এখানে কী বিষয়টিকে 4GiB এর সাথে তুলনা করা যায়, তাই কে এটি যত্ন করে যে এটি অন্যান্য পদক্ষেপের সাথে কীভাবে তুলনা করে? হ্যাঁ, আপনার বক্তব্যটি সঠিক, তবে এটি অপ্রাসঙ্গিক।
টিম

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

19

এর শেষ 2 টি এন্ট্রি যুক্ত করুন /proc/meminfo, তারা আপনাকে হোস্টের কাছে উপস্থিত সঠিক মেমরি দেয়।

উদাহরণ:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 কেবি = 4096 এমবি।


3
এখানে সেরা উত্তর, ডমিডেকোড ব্যবহার ব্যতীত, যার জন্য মূল প্রয়োজন। ডাইরেক্টম্যাপ সর্বদা সঠিক হয় না। আমার 4 জিবি সহ একটি সার্ভার রয়েছে এবং এটি বলে: `ডাইরেক্টম্যাপ ৪ কে: 110200 কেবি ডাইরেক্টম্যাপ ২ এম: 3993600 কেবি` এটি 4007 এমবি, 4096 এমবি নয় ...
টিভি

দ্রষ্টব্য: যদিও টিভিইয়ের ওএস 1024 বাইটের ইউনিটগুলিতে প্রতিবেদন করছে, তার মোট 4103800 x 1024 4 জিবিবি (যা হবে 4194304 x 1024) এর চেয়ে কম পড়ে।
নির্মাতা

এছাড়াও, লিনাক্সের সমস্ত সংস্করণে উপলব্ধ নেই। আমার সেন্টোস 5 বাক্স (হ্যাঁ, আমি জানি) এটি রিপোর্ট করে না।
টম কোয়ারেন্ডন

রেকর্ডের জন্য, এগুলি কেবলমাত্র x86 এ উপস্থিত রয়েছে। এই কাজটি করার কারণটি হ'ল এই এন্ট্রিগুলি টিএলবিতে 4k, 2M, 1G পৃষ্ঠাগুলি দ্বারা প্রতিনিধিত্ব করা মেমরির পরিমাণ গণনা করে, যা অবশ্যই কার্নেলের দ্বারা অ্যাক্সেসযোগ্য সমস্ত মেমরির আবরণ করতে হবে
কেভিমিচ

1
আপডেট: আমি একই মেশিনে বিভিন্ন কার্নেল সংস্করণগুলির (লিনাক্স -3.18.28, লিনাক্স -413-আরসি 6) মধ্যে স্থান নিয়েছি তখন এই যোগফলটি সামান্য পরিবর্তিত হয়।
কেভিমিচ

17

আরও একটি দরকারী কমান্ড:
vmstat -s | grep memory
আমার মেশিনে নমুনা আউটপুট হল:

  2050060 K total memory
  1092992 K used memory
   743072 K active memory
   177084 K inactive memory
   957068 K free memory
   385388 K buffer memory

মেমরির তথ্য পাওয়ার জন্য আর একটি দরকারী কমান্ড হ'ল:
free
নমুনা আউটপুট:

             total       used       free     shared    buffers     cached
Mem:       2050060    1093324     956736        108     385392     386812
-/+ buffers/cache:     321120    1728940
Swap:      2095100       2732    2092368

এখানে একটি পর্যবেক্ষণ হ'ল, কমান্ডটি freeঅদলবদলের স্থান সম্পর্কেও তথ্য দেয়।
নিম্নলিখিত লিঙ্কটি আপনার জন্য দরকারী হতে পারে:
http://www.linuxnix.com/find-ram-details-in-linuxunix/


1
এটি একটি দুর্দান্ত সহজ সমাধান, আপনি যদি মেগাবাইটে আপনার আউটপুটটি চোখের দিকে আরও সহজ করতে চানvmstat -s -S M | grep ' memory'
অলিভার ডুঙ্গি

17
free -h | awk '/Mem\:/ { print $2 }' 

এটি আপনাকে মানব পাঠযোগ্য বিন্যাসে আপনার সিস্টেমে মোট স্মৃতি সরবরাহ করবে এবং স্বয়ংক্রিয়ভাবে উপযুক্ত ইউনিটে স্কেল করবে (যেমন বাইটস, কেবি, এমবি, বা জিবি)।


আমি কি খুঁজছিলাম!
টমাস গঞ্জালেজ

10
dmidecode -t 17 | grep  Size:

"আকার:" এর পরে প্রদর্শিত সমস্ত উপরের মানগুলি যুক্ত করা সার্ভারে থাকা সমস্ত র‌্যাম কাঠির সঠিক মোট শারীরিক আকার দেবে।


2

মোট অনলাইন মেমরি

সিস-এফএস ব্যবহার করে মোট অনলাইন মেমরি গণনা করুন।

totalmem=0;
for mem in /sys/devices/system/memory/memory*; do
  [[ "$(cat ${mem}/online)" == "1" ]] \
    && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes)))));
done

#one-line code
totalmem=0; for mem in /sys/devices/system/memory/memory*; do [[ "$(cat ${mem}/online)" == "1" ]] && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes))))); done

echo ${totalmem} bytes
echo $((totalmem/1024**3)) GB

4 জিবি সিস্টেমের জন্য আউটপুট উদাহরণ:

4294967296 bytes
4 GB

ব্যাখ্যা

/ Sys / devices / সিস্টেম / মেমরি / block_size_bytes

মেমরি ব্লকে বাইটের সংখ্যা (হেক্স মান)। মানটির সামনে 0x ব্যবহার করা নিশ্চিত করে যে এটি গণনার সময় সঠিকভাবে পরিচালনা করা হয়েছে।

/ Sys / devices / সিস্টেম / মেমরি / মেমোরি *

সেগুলি অনলাইনে রয়েছে কিনা তা যাচাই করতে সমস্ত উপলভ্য মেমরি ব্লকগুলিতে আইট্রেট করা এবং যদি হয় তবে গণনা করা ব্লকের আকার যোগ করুন।

[["$ (বিড়াল $ {মেমি} / অনলাইন)" "==" 1 "]] &&

আপনি যদি অন্য মেমরির অবস্থাকে পছন্দ করেন তবে আপনি এটি পরিবর্তন বা সরাতে পারেন।


আমি যত তাড়াতাড়ি সম্ভব আপনার সমাধানটি পরীক্ষা করব check
জ্যামেডিয়ান

বাশ টিপ: আপনার কোডে আপনাকে \পরবর্তী লাইনে চালিয়ে যাওয়ার জন্য স্ল্যাশ অক্ষর ( ) ব্যবহার করার দরকার নেই - আসলে, আপনি &&সেই উদ্দেশ্যে লাইনটির শেষে ব্যবহার করতে পারেন ।
জ্যামেডিয়ান


0

এই উপায়:

1. / proc / মেমিনফো

MemTotal: 8152200 kB

MemFree: 760808 kB

পার্স করার জন্য আপনি কোনও কোড বা স্ক্রিপ্ট লিখতে পারেন।

2. নীচে ম্যাক্রো ব্যবহার করে সিসকনফ ব্যবহার করুন

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

৩. সিসিনফো সিস্টেম কল ব্যবহার করে

int sysinfo (@ sysinfo * তথ্য);

s sysinfo {।

   .

   unsigned long totalram;  /*Total memory size to use */

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 

ক্যাট /
প্রোক

-7

আমি htopএকটি দরকারী সরঞ্জাম খুঁজে।

sudo অ্যাপ-গেট ইনস্টল করুন

এবং তারপর

ফ্রি-এম

আপনার প্রয়োজনীয় তথ্য দেবে

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