ฉันจะทราบได้อย่างไรว่าหน่วยความจำฟิสิคัล (RAM) ทั้งหมดของกล่อง linux ของฉันเหมาะที่จะแยกวิเคราะห์โดยเชลล์สคริปต์


123

ฉันกำลังพิมพ์เชลล์สคริปต์เพื่อค้นหาหน่วยความจำฟิสิคัลทั้งหมดในกล่องลินุกซ์ RHEL บางกล่อง

แรกของทั้งหมดที่ผมอยากจะเน้นว่าฉันสนใจในหน่วยความจำกายภาพทั้งหมดได้รับการยอมรับโดย kernel ไม่เพียง แต่หน่วยความจำ ดังนั้นโปรดหลีกเลี่ยงการตอบแนะนำในการอ่าน/ proc / meminfoหรือใช้ฟรี , ด้านบนหรือsarคำสั่ง - ในทุกกรณีเหล่านี้ของพวกเขา " หน่วยความจำทั้งหมด " ค่าหมายถึง " หน่วยความจำ " คน

ความคิดแรกคือการอ่านข้อความบูตเคอร์เนล:

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

แต่ในบางกล่องลินุกซ์เนื่องจากการใช้ซอฟแวร์ PowerPath EMC2 และของน้ำท่วมข้อความบูตในการเริ่มต้นเคอร์เนลว่าข้อความบูตเคอร์เนลที่มีประโยชน์ไม่สามารถใช้งานได้แม้ใน/ var บันทึก dmesg / /ไฟล์

ตัวเลือกที่สองคือคำสั่งdmidecode (ฉันได้รับคำเตือนเกี่ยวกับความไม่ตรงกันที่เป็นไปได้ของ RAM ที่รู้จักกับเคอร์เนลและแรมจริงเนื่องจากข้อ จำกัด ของเมล็ดและสถาปัตยกรรมรุ่นเก่าบางส่วน) ตัวเลือก--memoryช่วยลดความยุ่งยากสคริปต์ แต่ฉันรู้ว่ารุ่นเก่าของคำสั่งที่ไม่เคยมีใคร--memoryตัวเลือก

โอกาสสุดท้ายของฉันคือคำสั่งgetconf รายงานขนาดเพจหน่วยความจำ แต่ไม่ใช่จำนวนเพจฟิสิคัลทั้งหมด - ตัวแปรระบบ_PHYS_PAGESดูเหมือนจะเป็นเพจฟิสิคัลที่พร้อมใช้งานไม่ใช่เพจฟิสิคัลทั้งหมด

# getconf -a | grep หน้า
หน้า 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

คำถามของฉัน: มีวิธีอื่นในการรับจำนวนหน่วยความจำฟิสิคัลทั้งหมดที่เหมาะสมที่จะแยกวิเคราะห์โดยเชลล์สคริปต์หรือไม่


3
สิ่งนี้ควรจะย้ายไปที่ linux & unix
Kolob Canyon

คำตอบ:


56

dmidecodeหากคุณกำลังสนใจในการแรมทางใช้คำสั่ง มันทำให้คุณมีจำนวนมากข้อมูลมากกว่าเพียงแค่นั้น แต่ทั้งนี้ขึ้นอยู่กับกรณีการใช้งานของคุณคุณอาจต้องการที่จะรู้ว่าถ้า 8G ในระบบมาจากแท่ง 2x4GB หรือ 4x2GB แท่ง


19
ฉันต้องการสิ่งนี้เมื่อเร็ว ๆ นี้และมีคำสั่งง่ายๆเพื่อรับขนาดหน่วยความจำทั้งหมดของโมดูลหน่วยความจำทั้งหมดบนระบบ: dmidecode -t 17 | grep "ขนาด. * MB" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator

6
แตกต่างจากคำตอบอื่น ๆdmidecode ต้องการสิทธิ์รู
ขับร้อง

1
มันทำให้ฉันเกิดข้อผิดพลาด # dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point: การอนุญาตถูกปฏิเสธการสแกน / dev / mem สำหรับจุดเข้า / dev / mem: ปฏิเสธการอนุญาต
VVB

128

คุณลองแล้วcat /proc/meminfoหรือยัง? จากนั้นคุณสามารถawkหรือgrepสิ่งที่คุณต้องการMemTotalเช่น

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

หรือ

cat /proc/meminfo | grep MemTotal

8
แต่ MemTotal ไม่ใช่หน่วยความจำทางกายภาพทั้งหมดโปรดดูหน้าคนสำหรับ proc (5)
Chris Stratton

2
@ChrisStratton: คุณสามารถอธิบายเพิ่มเติมได้หรือไม่? สำหรับเจตนาและวัตถุประสงค์ในทางปฏิบัติส่วนใหญ่คำตอบนี้อาจเพียงพอ
Dan Dascalescu

13
awk '/MemTotal/ {print $2}' /proc/meminfo ท่อน้อยยิ่งดี
masta

3
ทางเลือกที่มีความคิดเห็นสูง: หลีกเลี่ยง awk เมื่อทำได้ Regex / PCRE เป็นภาษาการจับคู่รูปแบบที่เป็นสากลมากขึ้น (เช่นคุณสามารถใช้ใน Python หรือ Perl ได้เช่นกัน) หากคุณเรียนรู้สิ่งที่คุณมีอยู่แล้วก็จะตื่นขึ้น ถ้าคุณใช้ grep + PCRE ในทางกลับกัน ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel Totusek

5
@GabrielBurkholder นอกจากนี้ยังมีมุมมองที่ตรงกันข้าม: awkเป็นมาตรฐานโดย POSIX แต่grepเป็นตัวเลือก-oและ-Pไม่ใช่! ตัวอย่างของคุณจะทำงานได้ดีกับ GNU grep(แต่ GNU ยังคงบอกว่าการใช้งาน PCRE เป็นการทดลอง) แต่อาจใช้ไม่ได้กับการใช้งานอื่น ๆ
pabouk

48

cat /proc/meminfo | grep MemTotalหรือฟรีจะให้จำนวน RAM ที่แน่นอนที่เซิร์ฟเวอร์ของคุณมี นี่ไม่ใช่ "หน่วยความจำที่มีอยู่"

ฉันเดาว่าปัญหาของคุณเกิดขึ้นเมื่อคุณมี VM และคุณต้องการคำนวณจำนวนหน่วยความจำทั้งหมดที่โฮสต์โดยไฮเปอร์ไวเซอร์ แต่คุณจะต้องลงชื่อเข้าใช้ไฮเปอร์ไวเซอร์ในกรณีนั้น

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
ในกล่องจริงของฉันที่มีcat /proc/meminfo | grep MemTotalรายงานหน่วยความจำ 4GB MemTotal: 3957032 kBนั้นค่อนข้างสั้น 4GB OP (และ I) กำลังมองหาสิ่งที่จะรายงาน 4GB
TvE

1
วิธีที่ตรงกว่านี้คือเพียงgrep MemTotal /proc/meminfo
Dan Passaro

3
@TvE 3957032 kBเป็นเพียงป้ายกำกับผิด ควรมีชื่อว่า kiB ตามที่ระบุในโพสต์นี้ นั่นหมายความว่ามีการรายงานจริง 4,052,000,768 ไบต์ซึ่งมากกว่า 4 GB เล็กน้อย เนื่องจากการใช้งาน / proc / meminfo ก่อนวันที่สัญกรณ์ kiB
Jeff G

4
@JeffG ฉันคิดว่าคุณพลาดจุดที่ ToolmakerSteve กำลังทำ ค่าที่คาดไว้คือ 4GiB ไม่ใช่ 4GB และ TvE ก็แค่คำนวณค่าผิด ToolmakerSteve ถูกต้องว่า RAM "4 GB" ควรถูกตีความเป็น "4 GiB" ในความคิดเห็นของ TvE ดังนั้นจึงเป็นค่าที่เราเปรียบเทียบ คุณคิดถูกแล้วที่ค่านั้นมากกว่า 4GB เหมือนกับว่ามันมากกว่า 2GB และ 2GiB และน้อยกว่า 6GB และ 6GiB แต่สิ่งที่สำคัญคือการเปรียบเทียบกับ 4GiB ดังนั้นใครจะสนใจว่ามันจะเปรียบเทียบกับมาตรการอื่นอย่างไร? ใช่คำแถลงของคุณถูกต้อง แต่ก็ไม่เกี่ยวข้องเช่นกัน
ทิม

1
@ ทิมฉันให้ข้อมูลที่ถูกต้องตามความเป็นจริงพร้อมเอกสารประกอบเท่านั้นที่ตอบคำถามที่ถูกถาม เนื่องจากต้องใช้เวลามากกว่าการค้นหาเล็กน้อยในการค้นหาฉันคิดว่าข้อเท็จจริงที่ว่า/proc/meminfoรายงานตัวเลขใน kiB เป็นส่วนสำคัญอย่างยิ่งของการสนทนานี้ไม่ว่า @TvE ตั้งใจจะถามคำถามอื่นหรือไม่
Jeff G

19

เพิ่ม 2 รายการสุดท้ายของรายการ/proc/meminfoเหล่านี้ทำให้คุณมีหน่วยความจำที่แน่นอนที่ปรากฏบนโฮสต์

ตัวอย่าง:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 ลบ.


3
คำตอบที่ดีที่สุดที่นี่นอกเหนือจากการใช้ dmidecode ซึ่งต้องใช้ root แต่ DirectMap นั้นไม่แน่นอนเสมอไป ฉันมีเซิร์ฟเวอร์ที่มี 4GB และมันขึ้นว่า: `` DirectMap4k: 110200 kB DirectMap2M: 3993600 kB 'นั่นคือ 4007MB ไม่ใช่ 4096MB ...
TvE

หมายเหตุ: แม้ว่าระบบปฏิบัติการของ TvE จะรายงานเป็นหน่วย 1024 ไบต์ แต่ทั้งหมด 4103800 x 1024 ของเขาก็ยังไม่ถึง 4 GiB (ซึ่งจะเท่ากับ 4194304 x 1024)
ToolmakerSteve

นอกจากนี้ยังไม่สามารถใช้ได้กับ Linux ทุกเวอร์ชัน กล่อง Centos5 ของฉัน (ใช่ฉันรู้) ไม่รายงานสิ่งนี้
Tom Quarendon

สำหรับเรกคอร์ดสิ่งเหล่านี้จะแสดงบน x86 เท่านั้น เหตุผลที่งานนี้ก็คือว่ามันเหล่านี้นับรายการจำนวนเงินของหน่วยความจำที่แสดงโดย 4k, 2M หน้า 1G ใน TLB ซึ่งจะต้องครอบคลุมหน่วยความจำทั้งหมดที่สามารถเข้าถึงได้โดย kernel
kevmitch

1
อัปเดต: ผลรวมนี้แตกต่างกันเล็กน้อยเมื่อฉันย้ายไปมาระหว่างเวอร์ชันเคอร์เนล (linux-3.18.28, linux-4.13-rc6) บนเครื่องเดียวกัน
kevmitch

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จะให้ข้อมูลเกี่ยวกับ swap space ด้วย
ลิงค์ต่อไปนี้อาจเป็นประโยชน์สำหรับคุณ:
http://www.linuxnix.com/find-ram-details-in-linuxunix/


1
นี่เป็นวิธีง่ายๆที่ดีหากคุณต้องการให้เอาต์พุตเป็นเมกะไบต์เพื่อให้ง่ายต่อการมองเห็นvmstat -s -S M | grep ' memory'
Oliver Dungey

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

สิ่งนี้จะช่วยให้คุณมีหน่วยความจำทั้งหมดในระบบของคุณในรูปแบบที่มนุษย์สามารถอ่านได้และปรับขนาดเป็นหน่วยที่เหมาะสมโดยอัตโนมัติ (เช่นไบต์, KB, MB หรือ GB)


สิ่งที่ฉันกำลังมองหา!
Tomas Gonzalez

10
dmidecode -t 17 | grep  Size:

การเพิ่มค่าข้างต้นทั้งหมดที่แสดงหลัง "Size:" จะให้ขนาดทางกายภาพรวมที่แน่นอนของ RAM แท่งทั้งหมดในเซิร์ฟเวอร์


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 GB:

4294967296 bytes
4 GB

คำอธิบาย

sys / / อุปกรณ์ / ระบบ / หน่วยความจำ / block_size_bytes

จำนวนไบต์ในบล็อกหน่วยความจำ (ค่าฐานสิบหก) การใช้ 0x หน้าค่าทำให้แน่ใจว่าได้รับการจัดการอย่างเหมาะสมในระหว่างการคำนวณ

sys / / อุปกรณ์ / ระบบ / หน่วยความจำหน่วยความจำ / *

การทำซ้ำบล็อกหน่วยความจำทั้งหมดที่มีอยู่เพื่อตรวจสอบว่าออนไลน์อยู่และเพิ่มขนาดบล็อกที่คำนวณแล้วให้กับ totalmem หากเป็นเช่นนั้น

[["$ (cat $ {mem} / ออนไลน์)" == "1"]] &&

คุณสามารถเปลี่ยนหรือลบสิ่งนี้ได้หากคุณต้องการสถานะหน่วยความจำอื่น


ฉันจะตรวจสอบวิธีแก้ปัญหาของคุณโดยเร็วที่สุด
Jdamian

เคล็ดลับทุบตี: ในโค้ดของคุณคุณไม่จำเป็นต้องใช้อักขระสแลช ( \) เพื่อดำเนินการต่อในบรรทัดถัดไปจริงๆแล้วคุณสามารถใช้&&ที่ท้ายบรรทัดเพื่อจุดประสงค์นั้นได้
Jdamian

1

หน่วยความจำทั้งหมดใน Mb :

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
echo $((x/1024))

หรือ:

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo) ; echo $((x/1024))

0

วิธีเหล่านี้คือ:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

คุณสามารถเขียนโค้ดหรือสคริปต์เพื่อแยกวิเคราะห์ได้

2. ใช้ sysconf โดยใช้มาโครด้านล่าง

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. โดยใช้ระบบ sysinfo โทร

int 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 htop

แล้ว

ฟรี -m

จะให้ข้อมูลที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.