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?


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.


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

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

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.


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/


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).


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.


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.


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))

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*/

   .

   . 

  }; 

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.