Linux kutumun bir kabuk betiği tarafından ayrıştırılmaya uygun toplam fiziksel belleğini (RAM) nasıl bulabilirim?


123

Bazı RHEL linux kutularındaki toplam fiziksel belleği bulmak için bir kabuk komut dosyası yazıyorum.

Öncelikle, yalnızca kullanılabilir bellekle değil, çekirdek tarafından tanınan toplam fiziksel bellekle ilgilendiğimi vurgulamak istiyorum . Bu nedenle, lütfen okuma / proc / meminfo veya ücretsiz , top veya sar komutlarını kullanmayı öneren yanıtlardan kaçının - Tüm bu durumlarda, " toplam bellek " değerleri " kullanılabilir bellek " olanları ifade eder.

İlk düşünce, önyükleme çekirdeği mesajlarını okumaktı:

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

Ancak bazı linux kutularında, EMC2'nin PowerPath yazılımının kullanımı ve çekirdek başlangıcındaki flooding önyükleme mesajlarından dolayı, bu yararlı önyükleme çekirdeği mesajı / var / log / dmesg dosyasında bile mevcut değildir .

İkinci seçenek dmidecode komutuydu (bazı eski çekirdek ve mimarilerin sınırlamaları nedeniyle çekirdek tarafından tanınan RAM ve gerçek RAM'in olası uyumsuzluğuna karşı uyarıldım). --Memory seçeneği komut dosyasını basitleştirir, ancak bu komutun eski sürümlerinde --memory seçeneğinin olmadığını fark ettim .

Son şansım getconf komutuydu . Bellek sayfa boyutunu bildirir, ancak toplam fiziksel sayfa sayısını bildirmez - _PHYS_PAGES sistem değişkeni, toplam fiziksel sayfalar değil, kullanılabilir fiziksel sayfalar gibi görünür.

# getconf -a | grep SAYFALARI
SAYFA BOYUTU 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

Sorum: Toplam fiziksel bellek miktarını elde etmenin bir kabuk betiği tarafından ayrıştırılmaya uygun başka bir yolu var mı?


3
Bu, linux ve unix'e taşınmalı
Kolob Canyon

Yanıtlar:


56

Fiziksel RAM ile ilgileniyorsanız, komutu kullanın dmidecode. Size bundan çok daha fazla bilgi verir , ancak kullanım durumunuza bağlı olarak, sistemdeki 8G'nin 2x4GB'lık çubuklardan veya 4x2GB'lık çubuklardan gelip gelmediğini de bilmek isteyebilirsiniz.


19
Yakın zamanda buna ihtiyacım vardı ve bir sistemdeki tüm bellek modüllerinin toplam bellek boyutunu elde etmek için basit bir komuta sahiptim: dmidecode -t 17 | grep "Boyut. * MB" | awk '{s + = 2 $ SON {baskı s / 1024}'
Jonesinator

6
Diğer yanıtlardan farklı olarak dmidecode, kök ayrıcalıkları gerektirir .
chus

1
Bana şu hatayı veriyor # dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point: İzin reddedildi Giriş noktası için tarama / dev / mem. / dev / mem: İzin reddedildi
VVB

128

Denedin cat /proc/meminfomi Ardından edebilirsiniz awk veya grep istediğini dışarı, MemTotal mesela

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

veya

cat /proc/meminfo | grep MemTotal

8
Ancak MemTotal toplam fiziksel bellek değildir - lütfen proc (5) için man sayfasına bakın
Chris Stratton

2
@ChrisStratton: Daha açık konuşabilir misin? Çoğu pratik niyet ve amaç için bu cevap yeterli olabilir.
Dan Dascalescu

13
awk '/MemTotal/ {print $2}' /proc/meminfo Ne kadar az boru o kadar iyidir.
masta

3
Son derece kararlı bir alternatif: Yapabildiğiniz zaman awk'tan kaçının. Regex / PCRE çok daha evrensel bir kalıp eşleştirme dilidir (yani Python veya Perl'de de kullanabilirsiniz). Eğer awk öğrenirseniz, zaten tekiniz awk olacaktır. Öte yandan grep + grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
PCRE'ye yaslanırsanız

5
Ayrıca karşıt görüş vardır @GabrielBurkholder: awkPOSIX tarafından standardize ancak grep'ın seçenekleri -ove -Pdeğildir! grepÖrneğiniz GNU ile iyi çalışacaktır (ancak GNU hala PCRE uygulamasının deneysel olduğunu söylüyor) ancak muhtemelen diğer uygulamalarla çalışmayacaktır.
pabouk

48

cat /proc/meminfo | grep MemTotalveya ücretsiz size sunucunuzun sahip olduğu tam RAM miktarını verir. Bu "kullanılabilir hafıza" değildir.

Sanırım sorununuz bir VM'niz olduğunda ortaya çıkıyor ve hiper yönetici tarafından barındırılan tam bellek miktarını hesaplamak istiyorsanız, ancak bu durumda hipervizörde oturum açmanız gerekecek.

cat /proc/meminfo | grep MemTotal

eşdeğerdir

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

5
4GB bellek ile benim fiziksel kutusunda cat /proc/meminfo | grep MemTotalraporlar MemTotal: 3957032 kB, yani 4GB yeraldığını kısa. OP (ve ben) 4GB rapor edecek bir şey arıyoruz.
TvE

1
Bunu yapmanın daha doğrudan bir yolu sadecegrep MemTotal /proc/meminfo
Dan Passaro

3
@TvE 3957032 kByanlış etiketlenmiş. Belirtildiği gibi, KIB etiketlenmelidir bu yazı . Bu, 4 GB'den biraz daha büyük olan 4.052.000.768 baytı gerçekten rapor ettiği anlamına gelir. Bunun nedeni, / proc / meminfo uygulamalarının kiB gösterimini önceden tarihlendirmesidir.
Jeff G

4
@JeffG Sanırım ToolmakerSteve'in yaptığı noktayı kaçırdın. Beklenen değer 4 GB değil 4 GiB'dir ve TvE değeri yanlış aktarmaktadır. ToolmakerSteve, TvE'nin yorumunda "4 GB" RAM'in "4 GiB" olarak yorumlanması gerektiği konusunda haklı ve bu nedenle karşılaştırdığımız değer bu. 2GB ve 2GiB'den büyük ve 6GB ve 6GiB'den küçük olduğu gibi, değerin 4GB'den büyük olduğu konusunda haklısınız, ancak burada önemli olan 4GiB ile karşılaştırıldığında nasıl olduğu, öyleyse diğer ölçülerle karşılaştırıldığında nasıl olduğu kimin umurunda? Yani evet, ifadeniz doğru, ama aynı zamanda alakasız.
Tim

1
@Tim Sadece sorulan soruyu yanıtlayan destekleyici belgelerle birlikte gerçeklere dayalı olarak doğru bilgiler verdim. /proc/meminfoBulmanın önemsiz bir aramadan daha fazlasını gerektirdiği göz önüne alındığında, kiB'deki rapor sayılarının, @TvE'nin farklı bir soru sorma niyetinden bağımsız olarak, bu tartışmanın son derece önemli bir parçası olduğunu düşünüyorum .
Jeff G

19

Son 2 girdiyi ekleyin /proc/meminfo, bunlar size ana bilgisayarda bulunan tam belleği verir.

Misal:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB.


3
Burada en iyi cevap, kök gerektiren dmidecode kullanmak dışında. Ancak DirectMap her zaman kesin değildir. 4GB'lık bir sunucum var ve şöyle diyor: `` DirectMap4k: 110200 kB DirectMap2M: 3993600 kB "Bu 4007MB, 4096MB değil ...
TvE

NOT: TvE'nin işletim sistemi 1024 baytlık birimler halinde raporlama yapsa bile, toplam 4103800 x 1024, 4 GiB'nin (4194304 x 1024 olacaktır) altında kalır.
ToolmakerSteve

Ayrıca, Linux'un tüm sürümlerinde mevcut değildir. Centos5 kutum (evet, biliyorum) bunu bildirmiyor.
Tom Quarendon

Kayıt için bunlar yalnızca x86'da mevcuttur. Bunun işe yaramasının nedeni, bu girişlerin TLB'de 4k, 2M, 1G sayfaları ile temsil edilen ve çekirdek tarafından erişilebilen tüm belleği kapsaması gereken bellek miktarını saymasıdır .
kevmitch

1
GÜNCELLEME: Aynı makinede farklı kernel sürümleri (linux-3.18.28, linux-4.13-rc6) arasında hareket ettiğimde bu toplam biraz değişiyor.
kevmitch

17

Kullanışlı bir komut daha:
vmstat -s | grep memory
makinemdeki örnek çıktı:

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

bellek bilgilerini almak için başka bir yararlı komut şudur:
free
örnek çıktı:

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

Buradaki bir gözlem, komutun freetakas alanı hakkında da bilgi vermesidir.
Aşağıdaki bağlantı sizin için yararlı olabilir:
http://www.linuxnix.com/find-ram-details-in-linuxunix/


1
Megabayt vmstat -s -S M | grep ' memory'
cinsinden çıktınızın gözünüzde

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

Bu size sisteminizdeki toplam belleği insan tarafından okunabilir formatta sağlayacak ve uygun birime (örn. Bayt, KB, MB veya GB) otomatik olarak ölçeklenecektir.


Tam da aradığım şey!
Tomas Gonzalez

10
dmidecode -t 17 | grep  Size:

"Boyut:" dan sonra görüntülenen yukarıdaki tüm değerlerin eklenmesi, sunucudaki tüm RAM çubuklarının tam toplam fiziksel boyutunu verecektir.


2

Toplam çevrimiçi bellek

Sys-fs kullanarak toplam çevrimiçi belleği hesaplayın.

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 sistem için örnek çıktı:

4294967296 bytes
4 GB

açıklama

/ Sys / cihazların / sistem / bellek / block_size_bytes

Bir bellek bloğundaki bayt sayısı (onaltılık değer). Değerin önünde 0x kullanılması, hesaplama sırasında doğru şekilde işlenmesini sağlar.

/ Sys / cihazlar / sistem / bellek / bellek *

Çevrimiçi olduklarını doğrulamak için mevcut tüm bellek bloklarını yinelemek ve hesaplanmış blok boyutunu ise totalmem'e eklemek.

[["$ (cat $ {mem} / online)" == "1"]] &&

Başka bir hafıza durumunu tercih ederseniz, bunu değiştirebilir veya kaldırabilirsiniz.


Çözümünüzü elimden geldiğince çabuk kontrol edeceğim.
Jdamian

bash ipucu: kodunuzda bir \sonraki satıra devam etmek için eğik çizgi ( ) kullanmanıza gerek yoktur - aslında &&bu amaç için satırın sonundaki karakterini kullanabilirsiniz .
Jdamian

1

Toplam hafıza Mb:

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

veya:

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

0

Yollar şunlardır:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

Ayrıştırmak için bir kod veya komut dosyası yazabilirsiniz.

2. Aşağıdaki makroları kullanarak sysconf kullanın

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. sysinfo sistem çağrısını kullanarak

int sysinfo (struct sysinfo * bilgisi);

struct sysinfo {.

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 

cat / proc / meminfo gömülü sistemimde benim için çalışıyor
webbertiger

-7

htopYararlı bir araç buluyorum .

sudo apt-get install htop

ve sonra

serbest-m

ihtiyacınız olan bilgileri verecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.