Jak mogę sprawdzić całkowitą pamięć fizyczną (RAM) mojego komputera z systemem Linux, która może być analizowana przez skrypt powłoki?

123

Piszę skrypt powłoki, aby sprawdzić całkowitą pamięć fizyczną w niektórych skrzynkach linuxowych RHEL.

Przede wszystkim chcę podkreślić, że interesuje mnie całkowita pamięć fizyczna rozpoznawana przez jądro, a nie tylko dostępna pamięć . Dlatego, proszę, unikaj odpowiedzi sugerujących przeczytanie / proc / meminfo lub użycie poleceń free , top lub sar - we wszystkich tych przypadkach ich wartości „ total memory ” oznaczają „ dostępną pamięć ”.

Pierwszą myślą było przeczytanie komunikatów jądra rozruchowego:

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

Ale w niektórych linuksach, z powodu użycia oprogramowania PowerPath EMC2 i jego zalewających wiadomości startowych podczas startu jądra, ta użyteczna wiadomość jądra startowego nie jest dostępna, nawet w pliku / var / log / dmesg .

Drugą opcją było polecenie dmidecode (ostrzegam przed możliwym niedopasowaniem pamięci RAM rozpoznawanej przez jądro i prawdziwej pamięci RAM ze względu na ograniczenia niektórych starszych jąder i architektur). Opcja --memory upraszcza skrypt, ale zdałem sobie sprawę, że starsze wersje tego polecenia nie mają opcji --memory .

Moją ostatnią szansą było polecenie getconf . Podaje rozmiar strony pamięci, ale nie całkowitą liczbę stron fizycznych - zmienna systemowa _PHYS_PAGES wydaje się być dostępnymi stronami fizycznymi, a nie całkowitą liczbą stron fizycznych.

# getconf -a | grep STRONY
ROZMIAR STRONY 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

Moje pytanie: czy istnieje inny sposób uzyskania całkowitej ilości pamięci fizycznej, nadającej się do przeanalizowania przez skrypt powłoki?

Jdamian
źródło
3
Powinno to zostać przeniesione do linux i unix
Kolob Canyon

Odpowiedzi:

56

Jeśli interesuje Cię fizyczna pamięć RAM, użyj polecenia dmidecode. Dostarcza o wiele więcej informacji, ale w zależności od przypadku użycia możesz również chcieć wiedzieć, czy 8G w systemie pochodzi z pendrive'ów 2x4GB czy 4x2GB.

Dummy00001
źródło
19
Potrzebowałem tego ostatnio i mam proste polecenie, aby uzyskać całkowity rozmiar pamięci wszystkich modułów pamięci w systemie: dmidecode -t 17 | grep "Rozmiar. * MB" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator,
6
W odróżnieniu od innych odpowiedzi, dmidecode wymaga uprawnień roota .
chus
1
Daje mi ten błąd # dmidecode 3.0 / sys / firmware / dmi / table / smbios_entry_point: Odmowa uprawnień Skanowanie / dev / mem dla punktu wejścia. / dev / mem: Odmowa
dostępu
128

Czy próbowałeś cat /proc/meminfo? Możesz wtedy awk lub grep , co chcesz, MemTotal np

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

lub

cat /proc/meminfo | grep MemTotal
Alex
źródło
8
Ale MemTotal nie jest całkowitą pamięcią fizyczną - zobacz stronę podręcznika dla proc (5)
Chris Stratton,
2
@ChrisStratton: czy możesz być bardziej dosadny? W przypadku większości praktycznych intencji i celów ta odpowiedź może być wystarczająca.
Dan Dascalescu
13
awk '/MemTotal/ {print $2}' /proc/meminfo Im mniej rur, tym lepiej.
masta
3
Wysoce uparta alternatywa: Unikaj awk, kiedy możesz. Regex / PCRE jest znacznie bardziej uniwersalnym językiem dopasowywania wzorców (tzn. Można go używać również w Pythonie lub Perlu). Jeśli nauczysz się awk, wszystko, co już masz, to awk. Jeśli z drugiej strony grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
opierasz
5
@GabrielBurkholder jest również przeciwny pogląd: awkjest znormalizowany przez POSIX, ale grepma opcje -oi -Pnie jest! Twój przykład będzie działał dobrze z GNU grep(ale GNU nadal mówi, że implementacja PCRE jest eksperymentalna), ale prawdopodobnie nie będzie działać z innymi implementacjami.
pabuk
48

cat /proc/meminfo | grep MemTotallub za darmo daje dokładną ilość pamięci RAM, jaką ma Twój serwer. To nie jest „dostępna pamięć”.

Wydaje mi się, że problem pojawia się, gdy masz maszynę wirtualną i chcesz obliczyć pełną ilość pamięci hostowanej przez hiperwizora, ale w takim przypadku będziesz musiał zalogować się do hiperwizora.

cat /proc/meminfo | grep MemTotal

jest równa

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'
Cyryla
źródło
5
Na moim fizycznym pudełku z cat /proc/meminfo | grep MemTotalraportami o 4 GB pamięci MemTotal: 3957032 kBto trochę za mało 4 GB. OP (i ja) szukamy czegoś, co zgłosiłoby 4 GB.
TvE
1
Bardziej bezpośredni sposób na zrobienie tego jest po prostugrep MemTotal /proc/meminfo
Dan Passaro
3
@TvE 3957032 kBma po prostu błędną etykietę . Powinien być oznaczony jako kiB, jak wskazano w tym poście . Oznacza to, że w rzeczywistości zgłasza 4 052 000 768 bajtów, czyli nieco więcej niż 4 GB. Wynika to z faktu, że implementacje / proc / meminfo poprzedzają notację kiB.
Jeff G
4
@JeffG Myślę, że przegapiłeś punkt, o którym mówił ToolmakerSteve. Oczekiwana wartość to 4 GB, a nie 4 GB, a TvE po prostu błędnie podaje tę wartość. ToolmakerSteve ma rację, że „4 GB” pamięci RAM powinno być interpretowane jako „4 GiB” w komentarzu TvE i dlatego jest to wartość, z którą porównujemy. Masz rację, że wartość jest większa niż 4 GB, tak jak jest również większa niż 2 GB i 2 GB i mniej niż 6 GB i 6 GB, ale liczy się tutaj, jak wypada w porównaniu z 4GiB, więc kogo obchodzi, jak wypada w porównaniu z innymi miarami? Więc tak, twoje stwierdzenie jest poprawne, ale jest też nieistotne.
Tim
1
@Tim Podałem tylko te informacje, które są zgodne z faktami, wraz z dokumentacją uzupełniającą, która odpowiedziała na zadane pytanie. Biorąc pod uwagę, że znalezienie danych /proc/meminfowymagało więcej niż trywialnego wyszukiwania, myślę, że fakt, że numery raportów w kiB jest niezwykle ważną częścią tej dyskusji, niezależnie od tego, czy @TvE zamierzał zadać inne pytanie.
Jeff G
19

Dodaj ostatnie 2 wpisy /proc/meminfo, podają dokładną pamięć obecną na hoście.

Przykład:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB.

Sandip
źródło
3
Najlepsza odpowiedź tutaj, inna niż użycie dmidecode, które wymaga rootowania. Ale DirectMap nie zawsze jest dokładna. Mam serwer z 4 GB i jest napisane: `DirectMap4k: 110200 kB DirectMap2M: 3993600 kB` To 4007 MB, a nie 4096 MB ...
TvE
UWAGA: Nawet jeśli system operacyjny TvE raportuje w jednostkach po 1024 bajty, jego łączna wielkość 4103800 x 1024 jest mniejsza niż 4 GiB (co byłoby 4194304 x 1024).
ToolmakerSteve
Niedostępne również we wszystkich wersjach systemu Linux. Moje pudełko Centos5 (tak, wiem) nie zgłasza tego.
Tom Quarendon
Dla przypomnienia, są one obecne tylko na x86. Powodem tego jest to, że jeśli te wpisy zliczają ilość pamięci reprezentowanej przez strony 4k, 2M, 1G w TLB, która musi pokrywać całą pamięć dostępną dla jądra .
kevmitch
1
AKTUALIZACJA: Ta suma różni się nieznacznie, gdy przechodzę między różnymi wersjami jądra (linux-3.18.28, linux-4.13-rc6) na tym samym komputerze.
kevmitch
17

Jeszcze jedno przydatne polecenie:
vmstat -s | grep memory
przykładowe dane wyjściowe na moim komputerze to:

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

inne przydatne polecenie do uzyskania informacji o pamięci to:
free
przykładowe dane wyjściowe to:

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

Jedna uwaga jest taka, że ​​polecenie freepodaje również informacje o przestrzeni wymiany.
Poniższy link może być przydatny:
http://www.linuxnix.com/find-ram-details-in-linuxunix/

Yogesh Jilhawar
źródło
1
To fajne, proste rozwiązanie, jeśli chcesz, aby wydruk w megabajtach był łatwiejszy dla okavmstat -s -S M | grep ' memory'
Oliver Dungey
17
free -h | awk '/Mem\:/ { print $2 }' 

Zapewni to całkowitą pamięć w systemie w formacie czytelnym dla człowieka i automatycznie skaluje się do odpowiedniej jednostki (np. Bajty, KB, MB lub GB).

JayEek
źródło
Właśnie tego szukałem!
Tomas Gonzalez
10
dmidecode -t 17 | grep  Size:

Dodanie wszystkich powyższych wartości wyświetlanych po „Rozmiar:” da dokładny fizyczny rozmiar wszystkich pendrive'ów na serwerze.

Raghu Ni
źródło
2

Całkowita pamięć online

Oblicz całkowitą pamięć online za pomocą 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

Przykładowe dane wyjściowe dla systemu 4 GB:

4294967296 bytes
4 GB

Wyjaśnienie

/ sys / devices / system / memory / block_size_bytes

Liczba bajtów w bloku pamięci (wartość szesnastkowa). Użycie 0x przed wartością zapewnia, że ​​jest ona prawidłowo obsługiwana podczas obliczania.

/ sys / devices / system / memory / memory *

Iterowanie po wszystkich dostępnych blokach pamięci, aby sprawdzić, czy są w trybie online i dodać obliczony rozmiar bloku do totalmem, jeśli są.

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

Możesz to zmienić lub usunąć, jeśli wolisz inny stan pamięci.

André
źródło
Sprawdzę Twoje rozwiązanie najszybciej, jak to możliwe.
Jdamian,
bash wskazówka: w swoim kodzie nie musisz używać znaku ukośnika ( \), aby kontynuować w następnej linii - w rzeczywistości możesz użyć do &&tego celu na końcu linii.
Jdamian
1

Całkowita pamięć w Mb:

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

lub:

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo) ; echo $((x/1024))
Eduardo Cuomo
źródło
0

Oto sposoby:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

Możesz napisać kod lub skrypt, aby go przeanalizować.

2. Użyj sysconf używając poniższych makr

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. Używając funkcji systemowej sysinfo

int sysinfo (struct sysinfo * info);

struct sysinfo {.

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 
Sandeep_black
źródło
cat / proc / meminfo działa dla mnie w moim systemie wbudowanym
webbertiger
-7

Znajduję htopprzydatne narzędzie.

sudo apt-get install htop

i wtedy

wolne -m

poda potrzebne informacje.

Sathyam
źródło