Bagaimana cara mengetahui total memori fisik (RAM) kotak linux saya yang cocok untuk diurai oleh skrip shell?

123

Saya mengetik skrip shell untuk mengetahui total memori fisik di beberapa kotak linux RHEL.

Pertama-tama saya ingin menekankan bahwa saya tertarik pada total memori fisik yang dikenali oleh kernel, bukan hanya memori yang tersedia . Oleh karena itu, mohon, hindari jawaban yang menyarankan untuk membaca / proc / meminfo atau menggunakan perintah gratis , atas atau sar - Dalam semua kasus ini, nilai " memori total " berarti " memori yang tersedia ".

Pikiran pertama adalah membaca pesan kernel boot:

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

Tetapi di beberapa kotak linux, karena penggunaan perangkat lunak PowerPath EMC2 dan pesan boot yang membanjir di awal kernel, pesan kernel boot yang berguna itu tidak tersedia, bahkan di file / var / log / dmesg .

Opsi kedua adalah perintah dmidecode (saya diperingatkan terhadap kemungkinan ketidakcocokan RAM yang dikenali kernel dan RAM asli karena keterbatasan beberapa kernel dan arsitektur yang lebih lama). Opsi --memory menyederhanakan skrip tetapi saya menyadari bahwa rilis lama dari perintah itu tidak memiliki opsi --memory .

Kesempatan terakhir saya adalah perintah getconf . Ini melaporkan ukuran halaman memori, tetapi bukan jumlah total halaman fisik - variabel sistem _PHYS_PAGES tampaknya merupakan halaman fisik yang tersedia, bukan total halaman fisik.

# getconf -a | grep HALAMAN
HALAMAN 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

Pertanyaan saya: Apakah ada cara lain untuk mendapatkan jumlah total memori fisik, yang cocok untuk diurai oleh skrip shell?

Jdamian
sumber
3
Ini harus dipindahkan ke linux & unix
Kolob Canyon

Jawaban:

56

Jika Anda tertarik dengan RAM fisik, gunakan perintah dmidecode. Ini memberi Anda lebih banyak informasi daripada hanya itu, tetapi tergantung pada kasus penggunaan Anda, Anda mungkin juga ingin tahu apakah 8G dalam sistem berasal dari tongkat 2x4GB atau tongkat 4x2GB.

Dummy00001
sumber
19
Saya membutuhkan ini baru-baru ini, dan memiliki perintah sederhana untuk mendapatkan ukuran memori total dari semua modul memori pada sistem: dmidecode -t 17 | grep "Ukuran. * MB" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator
6
Berbeda dari jawaban lain, dmidecode membutuhkan hak akses root .
chus
1
Ini memberi saya kesalahan ini # dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point: Izin ditolak Memindai / dev / mem untuk titik masuk. / dev / mem: Izin ditolak
VVB
128

Apakah Anda mencoba cat /proc/meminfo? Anda kemudian dapat awk atau grep apa yang Anda inginkan, MemTotal misalnya

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

atau

cat /proc/meminfo | grep MemTotal
Alex
sumber
8
Tetapi MemTotal bukanlah total memori fisik - silakan lihat halaman manual untuk proc (5)
Chris Stratton
2
@ ChrisStratton: bisakah Anda lebih eksplisit? Untuk maksud dan tujuan yang paling praktis, jawaban ini mungkin cukup.
Dan Dascalescu
13
awk '/MemTotal/ {print $2}' /proc/meminfo Semakin sedikit pipa semakin baik.
masta
3
Alternatif yang sangat beropini: Hindari canggung, bila Anda bisa. Regex / PCRE adalah bahasa pencocokan pola yang jauh lebih universal (yaitu Anda dapat menggunakannya dengan Python atau Perl juga). Jika Anda belajar awk, semua yang sudah Anda lakukan adalah awk. Jika Anda bersandar grep + PCRE di sisi lain ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel Totusek
5
@GabrielBurkholder ada juga pandangan yang berlawanan: awkdistandarisasi oleh POSIX tetapi grepopsi -odan -Ptidak! Contoh Anda akan berfungsi dengan baik dengan GNU grep(tetapi GNU masih mengatakan bahwa implementasi PCRE bersifat eksperimental) tetapi mungkin tidak akan berfungsi dengan implementasi lain.
pabouk
48

cat /proc/meminfo | grep MemTotalatau gratis memberi Anda jumlah pasti RAM yang dimiliki server Anda. Ini bukan "memori yang tersedia".

Saya kira masalah Anda muncul ketika Anda memiliki VM dan Anda ingin menghitung jumlah penuh memori yang dihosting oleh hypervisor tetapi Anda harus masuk ke hypervisor dalam kasus itu.

cat /proc/meminfo | grep MemTotal

setara dengan

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'
Cyril
sumber
5
Di kotak fisik saya dengan cat /proc/meminfo | grep MemTotallaporan memori 4GB MemTotal: 3957032 kB, itu agak kurang dari 4GB. OP (dan saya) mencari sesuatu yang akan melaporkan 4GB.
TvE
1
Cara yang lebih langsung untuk melakukan ini adalahgrep MemTotal /proc/meminfo
Dan Passaro
3
@TvE 3957032 kBbaru saja diberi label yang salah. Ini harus diberi label kiB, seperti yang ditunjukkan dalam posting ini . Itu berarti itu benar-benar melaporkan 4.052.000.768 byte, yang sedikit lebih besar dari 4 GB. Hal ini disebabkan oleh fakta bahwa / proc / meminfo menerapkan sebelum notasi kiB.
Jeff G
4
@JeffG Saya rasa Anda melewatkan poin yang dibuat oleh ToolSteve. Nilai yang diharapkan adalah 4GiB, bukan 4GB, dan TVE salah mengutip nilainya. ToolmakerSteve benar bahwa "4 GB" RAM harus diartikan sebagai "4 GiB" dalam komentar TvE, dan oleh karena itu, itulah nilai yang kami bandingkan. Anda benar bahwa nilainya lebih besar dari 4GB, sama seperti itu juga lebih besar dari 2GB dan 2GiB dan kurang dari 6GB dan 6GiB, tapi yang penting di sini adalah bagaimana perbandingannya dengan 4GiB, jadi siapa yang peduli bagaimana perbandingannya dengan ukuran lainnya? Jadi ya, pernyataan Anda benar, tetapi juga tidak relevan.
Tim
1
@Tim I hanya memberikan informasi yang akurat secara faktual, dengan dokumentasi pendukung, yang menjawab pertanyaan yang diajukan. Mengingat butuh lebih dari sekadar pencarian sepele untuk menemukannya, menurut saya fakta bahwa /proc/meminfomelaporkan angka dalam kiB adalah bagian yang sangat penting dari diskusi ini, terlepas dari apakah @TvE bermaksud mengajukan pertanyaan yang berbeda.
Jeff G
19

Tambahkan 2 entri terakhir /proc/meminfo, mereka memberi Anda memori yang tepat yang ada di host.

Contoh:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB.

Sandip
sumber
3
Jawaban terbaik di sini, selain menggunakan dmidecode, yang membutuhkan root. Tetapi DirectMap tidak selalu tepat. Saya memiliki server dengan 4GB dan tertulis: `` DirectMap4k: 110200 kB DirectMap2M: 3993600 kB `` Itu 4007MB, bukan 4096MB ...
TvE
CATATAN: Bahkan jika TvE OS melaporkan dalam satuan 1024 byte, totalnya 4103800 x 1024 kurang dari 4 GiB (yang akan menjadi 4194304 x 1024).
ToolmakerSteve
Juga, tidak tersedia di semua versi Linux. Kotak Centos5 saya (ya, saya tahu) tidak melaporkan ini.
Tom Quarendon
Sebagai catatan, ini hanya ada di x86. Alasan ini berhasil adalah karena entri ini menghitung jumlah memori yang diwakili oleh halaman 4k, 2M, 1G di TLB, yang harus mencakup semua memori yang dapat diakses oleh kernel .
kevmitch
1
UPDATE: Jumlah ini sedikit berbeda ketika saya berpindah di antara versi kernel yang berbeda (linux-3.18.28, linux-4.13-rc6) pada mesin yang sama.
kevmitch
17

Satu perintah lagi yang berguna:
vmstat -s | grep memory
contoh keluaran di mesin saya adalah:

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

perintah lain yang berguna untuk mendapatkan informasi memori adalah:
free
keluaran sampel adalah:

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

Satu pengamatan di sini adalah, perintah freememberikan informasi tentang ruang swap juga.
Tautan berikut mungkin berguna untuk Anda:
http://www.linuxnix.com/find-ram-details-in-linuxunix/

Yogesh Jilhawar
sumber
1
Ini adalah solusi sederhana yang bagus, jika Anda ingin keluaran dalam Megabyte lebih mudah dilihatvmstat -s -S M | grep ' memory'
Oliver Dungey
17
free -h | awk '/Mem\:/ { print $2 }' 

Ini akan memberi Anda total memori dalam sistem Anda dalam format yang dapat dibaca manusia dan secara otomatis menskalakan ke unit yang sesuai (mis. Byte, KB, MB, atau GB).

JayEek
sumber
Hanya apa yang saya cari!
Tomas Gonzalez
10
dmidecode -t 17 | grep  Size:

Menambahkan semua nilai di atas yang ditampilkan setelah "Size:" akan memberikan ukuran fisik total yang tepat dari semua RAM stick di server.

Raghu Ni
sumber
2

Total memori online

Hitung total memori online menggunakan 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

Contoh keluaran untuk sistem 4 GB:

4294967296 bytes
4 GB

Penjelasan

/ sys / devices / system / memory / block_size_bytes

Jumlah byte dalam blok memori (nilai hex). Menggunakan 0x di depan nilai memastikannya ditangani dengan benar selama penghitungan.

/ sys / perangkat / sistem / memori / memori *

Iterasi di atas semua blok memori yang tersedia untuk memverifikasi mereka sedang online dan menambahkan ukuran blok terhitung ke totalmem jika mereka.

[["$ (kucing $ {mem} / daring)" == "1"]] &&

Anda dapat mengubah atau menghapus ini jika Anda lebih suka status memori lain.

André
sumber
Saya akan memeriksa solusi Anda secepat mungkin.
Jdamian
tip bash: dalam kode Anda, Anda tidak perlu menggunakan karakter garis miring ( \) untuk melanjutkan ke baris berikutnya - sebenarnya, Anda dapat menggunakan &&di akhir baris untuk tujuan itu.
Jdamian
1

Total memori di Mb:

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

atau:

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

Ini caranya:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

Anda dapat menulis kode atau skrip untuk menguraikannya.

2. Gunakan sysconf dengan menggunakan makro di bawah ini

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. Dengan menggunakan system call sysinfo

int sysinfo (struct sysinfo * info);

struct sysinfo {.

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 
Sandeep_black
sumber
cat / proc / meminfo berfungsi untuk saya di sistem tertanam saya
webbertiger
-7

Saya menemukan htopalat yang berguna.

sudo apt-get install htop

lalu

bebas -m

akan memberikan informasi yang Anda butuhkan.

Sathyam
sumber