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?
źródło
Odpowiedzi:
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.źródło
Czy próbowałeś
cat /proc/meminfo
? Możesz wtedy awk lub grep , co chcesz, MemTotal nplub
źródło
awk '/MemTotal/ {print $2}' /proc/meminfo
Im mniej rur, tym lepiej.grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
awk
jest znormalizowany przez POSIX, alegrep
ma opcje-o
i-P
nie jest! Twój przykład będzie działał dobrze z GNUgrep
(ale GNU nadal mówi, że implementacja PCRE jest eksperymentalna), ale prawdopodobnie nie będzie działać z innymi implementacjami.cat /proc/meminfo | grep MemTotal
lub 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.
jest równa
źródło
cat /proc/meminfo | grep MemTotal
raportami o 4 GB pamięciMemTotal: 3957032 kB
to trochę za mało 4 GB. OP (i ja) szukamy czegoś, co zgłosiłoby 4 GB.grep MemTotal /proc/meminfo
3957032 kB
ma 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./proc/meminfo
wymagał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.Dodaj ostatnie 2 wpisy
/proc/meminfo
, podają dokładną pamięć obecną na hoście.Przykład:
10240 + 4184064 = 4194304 kB = 4096 MB.
źródło
Jeszcze jedno przydatne polecenie:
vmstat -s | grep memory
przykładowe dane wyjściowe na moim komputerze to:
inne przydatne polecenie do uzyskania informacji o pamięci to:
free
przykładowe dane wyjściowe to:
Jedna uwaga jest taka, że polecenie
free
podaje również informacje o przestrzeni wymiany.Poniższy link może być przydatny:
http://www.linuxnix.com/find-ram-details-in-linuxunix/
źródło
vmstat -s -S M | grep ' memory'
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).
źródło
Dodanie wszystkich powyższych wartości wyświetlanych po „Rozmiar:” da dokładny fizyczny rozmiar wszystkich pendrive'ów na serwerze.
źródło
Całkowita pamięć online
Oblicz całkowitą pamięć online za pomocą sys-fs.
Przykładowe dane wyjściowe dla systemu 4 GB:
Wyjaśnienie
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.
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ą.
Możesz to zmienić lub usunąć, jeśli wolisz inny stan pamięci.
źródło
\
), aby kontynuować w następnej linii - w rzeczywistości możesz użyć do&&
tego celu na końcu linii.Całkowita pamięć w
Mb
:lub:
źródło
Oto sposoby:
1. / proc / meminfo
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 {.
źródło
Znajduję
htop
przydatne narzędzie.i wtedy
poda potrzebne informacje.
źródło