मैं एक शेल स्क्रिप्ट द्वारा पार्स किए जाने के लिए उपयुक्त मेरे लिनक्स बॉक्स की कुल भौतिक मेमोरी (रैम) का पता कैसे लगा सकता हूं?


123

मैं कुछ आरएचईएल लिनेक्स बॉक्स में कुल भौतिक मेमोरी का पता लगाने के लिए एक शेल स्क्रिप्ट टाइप कर रहा हूं।

सबसे पहले मैं इस बात पर जोर देना चाहता हूं कि मैं कर्नेल द्वारा मान्यता प्राप्त कुल भौतिक स्मृति में दिलचस्पी रखता हूं , केवल उपलब्ध स्मृति नहीं । इसलिए, कृपया, पढ़ने / खरीदने / ज्ञापन देने या मुफ्त , शीर्ष या सार आदेशों का उपयोग करने के लिए सुझाव देने से बचें - इन सभी मामलों में, उनके " कुल मेमोरी " मान का अर्थ " उपलब्ध स्मृति " वाले हैं।

पहला विचार बूट कर्नेल संदेशों को पढ़ने का था:

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

लेकिन कुछ लिनक्स बॉक्स में, कर्नेल स्टार्टअप में EMC2 के पॉवरपाथ सॉफ्टवेयर और इसके बाढ़ के बूट संदेशों के उपयोग के कारण , उपयोगी बूट कर्नेल संदेश उपलब्ध नहीं है, यहां तक ​​कि / var / log / dmesg फ़ाइल में भी नहीं।

दूसरा विकल्प dmidecode कमांड था (मैं कुछ पुराने कर्नेल और आर्किटेक्चर की सीमाओं के कारण कर्नेल मान्यता प्राप्त RAM और वास्तविक RAM के संभावित बेमेल के खिलाफ चेतावनी देता हूं)। विकल्प --memory सरल स्क्रिप्ट लेकिन मैंने महसूस किया कि कि आदेश के पुराने रिलीज नहीं है --memory विकल्प।

मेरा आखिरी मौका getconf कमांड था। यह स्मृति पृष्ठ आकार की रिपोर्ट करता है, लेकिन भौतिक पृष्ठों की कुल संख्या नहीं - _PHYS_PAGES सिस्टम चर उपलब्ध भौतिक पृष्ठ लगता है, न कि कुल भौतिक पृष्ठ।

# getconf -a | ग्रीप पेजेस
पेजेस 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

मेरा प्रश्न: क्या एक भौतिक विधि की कुल मात्रा प्राप्त करने का एक और तरीका है, शेल स्क्रिप्ट द्वारा पार्स करने के लिए उपयुक्त है?


3
यह लिनक्स और यूनिक्स के लिए माइग्रेट किया जाना चाहिए
कोलोब कैनियन

जवाबों:


56

यदि आप भौतिक RAM में रुचि रखते हैं, तो कमांड का उपयोग करें dmidecode। यह आपको बस की तुलना में बहुत अधिक जानकारी देता है, लेकिन आपके उपयोग के मामले के आधार पर, आप यह भी जानना चाह सकते हैं कि क्या सिस्टम में 8G 2x4GB स्टिक या 4x2GB स्टिक से आता है।


19
मुझे हाल ही में इसकी आवश्यकता थी, और एक सिस्टम पर सभी मेमोरी मॉड्यूल के कुल मेमोरी साइज को प्राप्त करने के लिए एक साधारण कमांड है: dmidecode -t 17 | grep "आकार। * एमबी" | awk '{s + = $ 2} END {प्रिंट s / 1024}'
जोन्सिनेटर


1
यह मुझे यह त्रुटि देता है # dmidecode 3.0 / sys / फर्मवेयर / dmi / टेबल / smbios_entry_point: अनुमति ने प्रवेश बिंदु के लिए स्कैनिंग / देव / मेम से इनकार किया। / देव / मेम: अनुमति से वंचित
VVB

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 + PCRE को दुबला करते हैं ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
गेब्रियल टोटूसेक

5
@GabrielBurkholder का एक विपरीत दृष्टिकोण भी है: awkPOSIX द्वारा मानकीकृत है, लेकिन grepविकल्प नहीं हैं -oऔर -Pनहीं हैं! आपका उदाहरण GNU के साथ ठीक काम करेगा grep(लेकिन GNU अभी भी कहता है कि PCRE कार्यान्वयन प्रयोगात्मक है) लेकिन यह संभवतः अन्य कार्यान्वयन के साथ काम नहीं करेगा।
पाब्लॉक

48

cat /proc/meminfo | grep MemTotalया निःशुल्क आपको आपके सर्वर में मौजूद RAM की सटीक मात्रा देता है। यह "उपलब्ध स्मृति" नहीं है।

मुझे लगता है कि जब आप एक वीएम रखते हैं तो आपका मुद्दा सामने आता है और आप हाइपरविजर द्वारा होस्ट की गई मेमोरी की पूरी मात्रा की गणना करना चाहते हैं, लेकिन आपको उस मामले में हाइपरविजर में लॉग इन करना होगा।

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
4GB मेमोरी cat /proc/meminfo | grep MemTotalरिपोर्ट के साथ मेरे फिजिकल बॉक्स पर, 4GB MemTotal: 3957032 kBकी थोड़ी कमी है। ओपी (और I) ऐसी चीज की तलाश कर रहे हैं जो 4GB की रिपोर्ट करे।
TvE

1
ऐसा करने का अधिक प्रत्यक्ष तरीका सिर्फ हैgrep MemTotal /proc/meminfo
Dan Passaro

3
@ टीवीई 3957032 kBसिर्फ गुमराह है। जैसा कि इस पोस्ट में बताया गया है, इसे kiB लेबल किया जाना चाहिए । इसका मतलब है कि यह वास्तव में 4,052,000,768 बाइट्स की रिपोर्ट कर रहा है, जो 4 जीबी से थोड़ा अधिक है। यह इस तथ्य के कारण है कि / proc / meminfo कार्यान्वयन kiB संकेतन की पूर्व-तिथि है।
जेफ जी

4
@ जेफ मुझे लगता है कि आपको याद आ गया कि टूलमेकरस्टेव बना रहा था। अपेक्षित मूल्य 4GiB है, 4GB नहीं है, और TvE केवल मूल्य को गलत बता रहा है। ToolmakerSteve सही है कि TvE की टिप्पणी में "4 GB" रैम की व्याख्या "4 GiB" के रूप में की जानी चाहिए, और इसलिए यह वह मूल्य है जिसके खिलाफ हम तुलना कर रहे हैं। आप सही कह रहे हैं कि मान 4GB से अधिक है, ठीक उसी तरह यह भी 2GB और 2GiB से अधिक है और 6GB और 6GiB से कम है, लेकिन यहाँ क्या मायने रखता है कि यह 4GiB से कैसे तुलना करता है, इसलिए कौन परवाह करता है कि यह अन्य उपायों की तुलना में कैसा है? तो हां, आपका कथन सही है, लेकिन यह अप्रासंगिक भी है।
टिम

1
@ मुझे केवल वही जानकारी प्रदान की गई जो सहायक दस्तावेज के साथ तथ्यात्मक रूप से सटीक है, जो पूछे गए प्रश्न का उत्तर देती है। यह देखते हुए कि इसे खोजने में एक तुच्छ खोज से अधिक समय लगा, मुझे लगता है कि तथ्य यह है कि /proc/meminfokiB में रिपोर्ट संख्या इस चर्चा का एक अत्यंत महत्वपूर्ण हिस्सा है, भले ही @TvE एक अलग प्रश्न पूछने का इरादा रखता हो।
जेफ जी

19

अंतिम 2 प्रविष्टियों को जोड़ें /proc/meminfo, वे आपको मेजबान पर मौजूद सटीक मेमोरी प्रदान करती हैं।

उदाहरण:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 एमबी।


3
सबसे अच्छा जवाब यहाँ, dmidecode का उपयोग करने के अलावा, जिसके लिए रूट की आवश्यकता होती है। लेकिन DirectMap हमेशा सटीक नहीं होता है। मेरे पास 4GB वाला सर्वर है और यह कहता है: `DirectMap4k: 110200 kB DirectMap2M: 3993600 kB` यह 4007MB है, 4096MB नहीं ...
TvE

ध्यान दें: भले ही TvE का OS 1024 बाइट की इकाइयों में रिपोर्ट कर रहा हो, उसका कुल 4103800 x 1024 4 GiB से कम होता है (जो 4194304 x 1024 होगा)।
टूलमेकर

इसके अलावा, लिनक्स के सभी संस्करणों पर उपलब्ध नहीं है। मेरा Centos5 बॉक्स (हाँ, मुझे पता है) यह रिपोर्ट नहीं करता है।
टॉम क्वारेंडन

रिकॉर्ड के लिए, ये केवल x86 पर मौजूद हैं। कारण यह है कि यह काम करता है कि यह प्रविष्टियाँ टीएलबी में 4k, 2M, 1G पेजों द्वारा दर्शाई गई मेमोरी के अमाउंट को गिनाती हैं, जिसे कर्नेल द्वारा सुलभ सभी मेमोरी को कवर करना चाहिए
kevmitch

1
अद्यतन: जब मैं एक ही मशीन पर विभिन्न कर्नेल संस्करणों (linux-3.18.28, linux-4.13-rc6) के बीच स्थानांतरित करता हूं, तो यह राशि थोड़ी भिन्न होती है।
केवमिच

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 }' 

यह आपको मानव पठनीय प्रारूप में आपके सिस्टम में कुल मेमोरी प्रदान करेगा और स्वचालित रूप से उपयुक्त इकाई (जैसे बाइट्स, KB, MB या GB) को स्केल करेगा।


मुझे इसकी ही खोज थी!
टॉमस गोंजालेज

10
dmidecode -t 17 | grep  Size:

"आकार:" के बाद प्रदर्शित सभी उपरोक्त मूल्यों को जोड़ने से सर्वर में सभी रैम स्टिक्स का कुल भौतिक आकार होगा।


2

कुल ऑनलाइन मेमोरी

Sys-fs का उपयोग करके कुल ऑनलाइन मेमोरी की गणना करें।

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 / उपकरणों / system / स्मृति / block_size_bytes

मेमोरी ब्लॉक (हेक्स मान) में बाइट्स की संख्या। मूल्य के सामने 0x का उपयोग करना सुनिश्चित करता है कि यह गणना के दौरान ठीक से नियंत्रित किया गया है।

/ Sys / उपकरणों / system / स्मृति / स्मृति *

सभी उपलब्ध मेमोरी ब्लॉकों को सत्यापित करने के लिए कि वे ऑनलाइन हैं और यदि वे हैं तो कुल ब्लॉक की गणना की गई गणना को जोड़ दें।

[["$ (बिल्ली $ {मेम} / ऑनलाइन)" == "१"]] &&

यदि आप किसी अन्य मेमोरी स्थिति को पसंद करते हैं, तो आप इसे बदल या निकाल सकते हैं।


मैं जितनी जल्दी हो सके आपके समाधान की जाँच करूँगा।
जमैदियन

bash tip: अपने कोड में आपको \अगली पंक्ति में जारी रखने के लिए स्लैश चरित्र ( ) का उपयोग करने की आवश्यकता नहीं है - वास्तव में, आप &&उस उद्देश्य के लिए लाइन के अंत में उपयोग कर सकते हैं ।
जमैडियन


0

ये तरीके हैं:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

आप इसे पार्स करने के लिए एक कोड या स्क्रिप्ट लिख सकते हैं।

2. नीचे मैक्रोज़ का उपयोग करके sysconf का उपयोग करें

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. sysinfo सिस्टम कॉल का उपयोग करके

int sysinfo (संरचना sysinfo * जानकारी);

संरचना sysinfo {।

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 

मेरे एम्बेडेड सिस्टम पर मेरे लिए cat / proc / meminfo काम करता है
webbertiger

-7

मुझे htopएक उपयोगी उपकरण मिल गया है।

sudo apt-get install होटॉप

और फिर

मुक्त-एम

आपको आवश्यक जानकारी देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.