Czy w systemie Linux jest dostępna wersja terminala „bezpłatnego” w systemie Mac OS X Terminal?


194

W systemie Linux często używam polecenia free, aby zobaczyć bieżącą ilość wolnej i zajętej pamięci w systemie. Na przykład:

$ free
             total       used       free     shared    buffers     cached
Mem:       7264256    1010952    6253304          0     371892     189088
-/+ buffers/cache:     449972    6814284
Swap:      8126456         28    8126428

Wydaje się, że nie istnieje, gdy wchodzę freedo terminalu Mac OS X. Czy istnieje alternatywa?

Odpowiedzi:


92

Jak mówi @khedron , możesz zobaczyć te informacje w Monitorze aktywności.

Jeśli chcesz go w wierszu poleceń, oto skrypt w języku Python, który napisałem (lub być może zmodyfikowałem z cudzego, nie pamiętam, jest już dość stary), aby pokazać ilość pamięci przewodowej, aktywnej, nieaktywnej i wolnej:

#!/usr/bin/python

import subprocess
import re

# Get process info
ps = subprocess.Popen(['ps', '-caxm', '-orss,comm'], stdout=subprocess.PIPE).communicate()[0].decode()
vm = subprocess.Popen(['vm_stat'], stdout=subprocess.PIPE).communicate()[0].decode()

# Iterate processes
processLines = ps.split('\n')
sep = re.compile('[\s]+')
rssTotal = 0 # kB
for row in range(1,len(processLines)):
    rowText = processLines[row].strip()
    rowElements = sep.split(rowText)
    try:
        rss = float(rowElements[0]) * 1024
    except:
        rss = 0 # ignore...
    rssTotal += rss

# Process vm_stat
vmLines = vm.split('\n')
sep = re.compile(':[\s]+')
vmStats = {}
for row in range(1,len(vmLines)-2):
    rowText = vmLines[row].strip()
    rowElements = sep.split(rowText)
    vmStats[(rowElements[0])] = int(rowElements[1].strip('\.')) * 4096

print 'Wired Memory:\t\t%d MB' % ( vmStats["Pages wired down"]/1024/1024 )
print('Active Memory:\t\t%d MB' % ( vmStats["Pages active"]/1024/1024 ))
print('Inactive Memory:\t%d MB' % ( vmStats["Pages inactive"]/1024/1024 ))
print('Free Memory:\t\t%d MB' % ( vmStats["Pages free"]/1024/1024 ))
print('Real Mem Total (ps):\t%.3f MB' % ( rssTotal/1024/1024 ))

Jak widać, możesz po prostu wywoływać vm_statz wiersza poleceń, choć liczy się to na stronach 4kB, stąd skrypt do konwersji na MB.

Skrypt zlicza również użycie „rzeczywistej pamięci” wszystkich uruchomionych procesów do porównania (nie będzie to odpowiadało żadnej konkretnej wartości z ogólnych statystyk pamięci, ponieważ pamięć jest złożoną bestią).


Oto przykład danych wyjściowych skryptu w moim systemie:

[user@host:~] % memReport.py
Wired Memory:           1381 MB
Active Memory:          3053 MB
Inactive Memory:        727 MB
Free Memory:            1619 MB
Real Mem Total (ps):    3402.828 MB

(bardzo nieznacznie dostosowany do rozmiaru tabulatora na StackExchange;)


jaki jest najlepszy sposób na użycie tego skryptu?
październik

2
nie jestem pewien, co dokładnie masz na myśli ... skopiować i wkleić do nowego pliku, zapisać go gdzieś (być może w / usr / local / bin), uczynić go wykonywalnym i uruchomić?
drfrogsplat

Myślę, że @idober sugerował, abyś załączył przykład jego uruchomienia i wyprodukowanej produkcji (np. Zrzut ekranu)
AJ.

@AJ, ah ok,
rozumiem

6
tylko moje 2 centy:ps -caxm -orss= | awk '{ sum += $1 } END { print "Resident Set Size: " sum/1024 " MiB" }'
sklepienie

70

Polecenie, którego potrzebujesz to vm_stat- podobne do tradycyjnego narzędzia uniksowego, vmstatale z kilkoma różnicami specyficznymi dla MACH. Strona podręcznika jest dobrze napisana.


2
Co to są „strony”?
DilithiumMatrix

8
@zhermes - najmniejsza jednostka pamięci używana przez system ... w przypadku komputerów Mac x86 i PPC jest to 4k. Strony wolne to liczba 4k jednostek wolnej pamięci.
RI Swamp Yankee

2
Strony mają także 4K w iOS.
smci

54

Wydaje się, że powód jest wolny, ponieważ top -l 1zawsze opóźnia się o jedną sekundę po zakończeniu, standardowe opóźnienie między odświeżeniami. Dodanie -s 0 do polecenia powoduje natychmiastowe zakończenie:

top -l 1 -s 0 | grep PhysMem

Ponadto, dla jasności, lubię pokazywać każdy element mem w jego linii, więc dodałem 9 spacji dla wyrównania z „PhysMem:” w łańcuchu zastępującym sed:

top -l 1 -s 0 | grep PhysMem | sed 's/, /\n         /g'

1
Jest to pies wolny, o wiele lepiej go wykorzystać vm_stat.
mgol

3
Tak, odpytywanie topjest znacznie wolniejsze od wywoływania, vm_statale topwypakowanie jest znacznie mniej szczegółowe, a jednostka to megabajt, a nie strony. Aby być jeszcze mniej gadatliwym, można usunąć podziały linii i awkzastąpić je grepwynikiem top -l 1 | grep ^PhysMem.
Stefan Schmidt

2
Biorąc wszystko pod uwagę, to najlepsza odpowiedź. Nie daje wyników w nieprzydatnych pagejednostkach / wymaga jakiegoś hakera postprocessingu, aby umożliwić interpretację tych jednostek.
ijoseph

39

Oto prosty linijka, dzięki której cały vm_statwydruk będzie bardziej przyjazny dla człowieka:

$ vm_stat | perl -ne '/page size of (\d+)/ and $size=$1; /Pages\s+([^:]+)[^\d]+(\d+)/ and printf("%-16s % 16.2f Mi\n", "$1:", $2 * $size / 1048576);'
free:                     2330.23 Mi
active:                   2948.07 Mi
inactive:                 1462.97 Mi
speculative:               599.45 Mi
wired down:                840.46 Mi
copy-on-write:           43684.84 Mi
zero filled:            385865.48 Mi
reactivated:               608.14 Mi

25

Jeśli naprawdę interesuje Cię tylko zamiana (jaka byłaby ostatnia linia danych wyjściowych free):

$ sysctl vm.swapusage
vm.swapusage: total = 64.00M  used = 0.00M  free = 64.00M  (encrypted)

bardzo tego szukałem :)
onalbi

20

Istnieje polecenie terminalu podobne do freesystemu Mac OS X ... nazywa siętop

Więcej informacji można znaleźć w tym dokumencie wsparcia Apple.

Mac OS X: jak przeglądać użycie pamięci za pomocą narzędzia „top”


24
Ściśle mówiąc, „top” w OS X jest oczywiście bardziej podobny do polecenia „top” w Linuksie :)
calum_b 11.11.11

6
lepszy niż górny:htop
nXqd

3
@nXqd htop: nie znaleziono polecenia
itsazzad

4
@SazzadTusharKhan napar zainstalować htop, jeśli masz zainstalowany napar
nXqd

2
Technicznie wcale nie są do siebie podobne, ponieważ darmowe wydruki wyświetlają coś ładnego i schludnego do wiersza poleceń, podczas gdy góra jest czymś, co aktywnie oglądasz.
anon58192932

10

Wystarczy pobrać rozwiązanie z @zack i dodać nieaktywne i spekulacyjne bloki.

#!/bin/bash

FREE_BLOCKS=$(vm_stat | grep free | awk '{ print $3 }' | sed 's/\.//')
INACTIVE_BLOCKS=$(vm_stat | grep inactive | awk '{ print $3 }' | sed 's/\.//')
SPECULATIVE_BLOCKS=$(vm_stat | grep speculative | awk '{ print $3 }' | sed 's/\.//')

FREE=$((($FREE_BLOCKS+SPECULATIVE_BLOCKS)*4096/1048576))
INACTIVE=$(($INACTIVE_BLOCKS*4096/1048576))
TOTAL=$((($FREE+$INACTIVE)))
echo Free:       $FREE MB
echo Inactive:   $INACTIVE MB
echo Total free: $TOTAL MB

9
#!/bin/bash
top -l 1 | grep PhysMem: | awk '{print $10}'

Tylko dla ekspertów Unix:

top -l 1 | awk '/PhysMem:/ {print $10}'

1
To nie zwraca już żadnego wyniku we współczesnym systemie macOS.
Matt Sephton,

użyj top -l1 | awk '/PhysMem/ {print $2}'na macos> = High Sierra
JDS

Nie zwraca zużytej pamięci
theillien

8
free="$(( $(vm_stat | awk '/free/ {gsub(/\./, "", $3); print $3}') * 4096 / 1048576)) MiB free"

1
Bieżąca edycja tego polecenia nie działa dla mnie w tcsh(mój domyślny) lub sh. Czy polecenie jest specyficzne dla powłoki?
Graham Perrin

Tak, to jest bashi kshspecyficzny. W tcshpróbie: set freeblocks=`vm_stat | grep free | awk '{ print $3 }' | sed 's/\.//'` ; set freeMB=`expr $freeblocks \* 4096 / 1048576`; set free=`echo $freeMB MiB free`. Następnie możesz zrobić, echo $freeaby wydrukować ilość wolnej pamięci. Można również utworzyć alias: alias free echo $freeMB MiB free.
jaume

7

Sądząc po twoim drugim pytaniu , myślę, że znalazłeś użycie narzędzia Monitor aktywności do sprawdzania stanu pamięci, prawda? Dla przypomnienia, jest w / Applications / Utilities / Activity Monitor.app.


7

Nie ma dokładnego odpowiednika rozpowszechnianego w systemie Mac OS X, ale istnieje kilka innych sposobów uzyskania informacji:

  1. system_profiler - Pokazuje wszystkie informacje o profilu systemu Mac w powłoce
  2. sysctl -a | grep memlub sysctl hw.memsize(ogółem mem)

+1, działa z terminala w trybie odzyskiwania (cmd-r podczas uruchamiania)
Steve Kehlet

7

Możesz wypróbować polecenie, allmemoryjeśli potrzebujesz narzędzia wiersza poleceń, które raportuje bardzo szczegółowe użycie pamięci.


1
Potężne narzędzie, ale wymaga dużej mocy obliczeniowej (około 95% jednego z dwóch procesorów w moim MacBookPro5,2) i jeśli używa się dużej ilości pamięci: proste uruchomienie allmemorymoże być nieoczekiwanie długie - dla mnie dzisiaj ponad cztery minuty na uruchomienie, YMMV. Uruchomienie allmemorydla sysdiagnosemoże potrwać znacznie dłużej.
Graham Perrin

6

Powyższe stanowi zbyt duży wysiłek dla moich upodobań i zakłada, że ​​masz również pełnoprawną instalację ... Jeśli uruchomiłeś system z dysku startowego Mac OS X, wszystkie powyższe rozwiązania oczywiście nie będą działać. .. Wystarczy użyć polecenia „hostinfo”, oto dane wyjściowe z mojego MBAir z połowy 2012 roku z systemem Mavericks (10.9.1):

 Mach kernel version:
 Darwin Kernel Version 13.0.0: Thu Sep 19 22:22:27 PDT 2013; root:xnu-2422.1.72~6/RELEASE_X86_64
Kernel configured for up to 4 processors.
2 processors are physically available.
4 processors are logically available.
Processor type: i486 (Intel 80486)
Processors active: 0 1 2 3
Primary memory available: 8.00 gigabytes
Default processor set: 195 tasks, 961 threads, 4 processors
Load average: 1.61, Mach factor: 2.38

Zaletą tego polecenia jest to, że jest on wstępnie zainstalowany z instalatorem 10.9 zbyt niskim /usr/bin, więc jest bardzo przydatny,

idealnie, jeśli chcesz tylko pamięci RAM, wydaj:

$ hostinfo | grep memory

Nie wiem, czy hostinfo istnieje w poprzednich systemach operacyjnych ...


4
Jak hostinfopokazuje zużytą pamięć?
nohillside

3
to polecenie (przynajmniej tutaj w OS 10.6.8) pokazuje tylko fizycznie dostępną pamięć, ale nie pokazuje, ile z niej jest obecnie używana
MostlyHarmless

Co oznacza, że ​​tak naprawdę nie odpowiada na zadane pytanie, ponieważ wyraźnie stwierdza, że ​​pragnie „wolnej i używanej pamięci”.
b4hand

5
top -l 1 -s 0 | awk ' /Processes/ || /PhysMem/ || /Load Avg/{print}'

To powinno zrobić dobrze :)


3

Myślę, że w dzisiejszych czasach, psutila jego meminfo.pyskrypt zawiera najbardziej pomocne szczegóły dotyczące wykorzystania pamięci. Spróbować tego:

pip install psutil
curl -O https://raw.githubusercontent.com/giampaolo/psutil/master/scripts/meminfo.py
python ./meminfo.py

Dane wyjściowe, które produkuje, wyglądają następująco:

MEMORY
------
Total      :   16.0G
Available  :    5.5G
Percent    :    65.8
Used       :   13.5G
Free       :    1.5G
Active     :    7.4G
Inactive   :    4.0G
Wired      :    2.1G

SWAP
----
Total      :    1.0G
Used       :   33.5M
Free       :  990.5M
Percent    :     3.3
Sin        :   15.9G
Sout       :   71.6M

Zwróć uwagę na Availablewiersz, który pokazuje szacunkową ilość dostępnej pamięci na uruchomienie nowych aplikacji , bez zamiany.

Nie znam żadnego innego narzędzia MacOS zapewniającego taką dostępną pamięć.

Dla porównania: w systemie Linux ten sam rodzaj informacji znajduje się w availablekolumnie danych wyjściowych z bieżących wersji free:

              total        used        free      shared  buff/cache   available
Mem:           7.8G        552M        182M        156M        7.1G        6.9G
Swap:            0B          0B          0B
Total:         7.8G        552M        182M

Że availablekolumna w freeprodukcji pochodzi właśnie MemAvailablew /proc/meminfo. A w systemach, które je mają /proc/meminfo, psutil również używa tego do oszacowania dostępnej pamięci.

Ale MacOS nie ma /proc/meminfo, więc oszacować ilość dostępnej pamięci w tym przypadku psutil wykorzystuje ten sam algorytm używany w systemie Linux obliczyć MemAvailabledla/proc/meminfo .


3

Możesz spróbować wykonać memory_pressurepolecenie. Zobacz dane wyjściowe mojego systemu (i5, 4 GB pamięci RAM)

The system has 2147483648 (524288 pages with a page size of 4096).

Stats: 
Pages free: 90009 
Pages purgeable: 139593 
Pages purged: 7496548 

Swap I/O:
Swapins: 470466 
Swapouts: 530913 

Page Q counts:
Pages active: 407739 
Pages inactive: 148277 
Pages speculative: 16200 
Pages throttled: 0 
Pages wired down: 263064 

Compressor Stats:
Pages used by compressor: 122815 
Pages decompressed: 7327420 
Pages compressed: 17625795 

File I/O:
Pageins: 1538997 
Pageouts: 86692 

System-wide memory free percentage: 63%

2

Polecenia bash „za darmo jak” dla Mac OSX.

To druga odsłona tego postu. Na początku mam dwa -1. Jeden, ponieważ nie opisywałem go po angielsku, jest poprawiony. Drugi, ponieważ użyłem gawk(który nie jest częścią standardowej instalacji OS X), jest również poprawiony, teraz używam awk. -2Wciąż tam ;-). Być może najlepiej jest teraz przetestować i ocenić same polecenia?

Przejrzałem swój pierwszy pomysł, aby zbudować tylko jedno polecenie zorientowane na użytkownika końcowego z przyjaznym i wysoce konfigurowalnym wyświetlaczem, zrobiłem dwa:

  • free-like.sh skrypt zawsze zorientowany na „użytkownika końcowego”, z większą dokładnością, „przyjazny” i konfigurowalny wyświetlacz, ale z większą ilością obliczeń i zużyciem zasobów,

  • free-like-raw.sh, programista zorientowany na polecenia, sysadmin itp., z mniejszym obliczeniem i zużyciem zasobów, ale także z mniejszą precyzją i mniej „przyjaznym” wyświetlaniem.

Dane dla pamięci fizycznej są wyodrębniane z wyników polecenia vm_stat(które zwraca wyniki w wielkości bloku). Niedokładność wynikająca z transformacji w bajtach (liczba_bloków * rozmiar_bloku, domyślna wartość obliczeń) będzie wynosić od 0 <wielkość bloku. Dane pamięci wirtualnej są pobierane z toppolecenia. Niedokładność jest tutaj powiązana z jednostką odniesienia toppolecenia: kilo, mega, giga.

Obliczenia są wykonywane przy użyciu awkzaokrąglonych wartości (w przeciwieństwie do bc). awkjest również szybszy niż bc. Możesz zobaczyć skrypt testowy tutaj: http://myblog.robert.sebille.name/article29.html#awk-bc

Możesz wyświetlić wyniki poleceń w bajtach (domyślnie), w kilogramach, mega lub giga, z x miejscami dziesiętnymi w przypadku free-like.sh i jeśli poprosisz o wyświetlenie w mega ou giga.

Skrypty są zbyt długie, aby opublikować post, ale można je znaleźć w tym artykule na moim blogu: http://myblog.robert.sebille.name/article29.html

Artykuł jest w języku francuskim, ale wyświetla jeden przykład wyświetlania dla każdego polecenia i jego zintegrowanej pomocy ( ./free-like.sh -hi ./free-like-raw.sh -h), w języku angielskim. Pomoce te całkowicie opisują polecenia. Artykuł wyświetla także kody.

Angielski nie jest moim językiem ojczystym. Jeśli ktoś chce poprawić błędy w zintegrowanej pomocy, jest mile widziany;).

Twój.


Poza tym, że jest mniej lub bardziej bezużyteczny przez kogoś bez znajomości francuskiego, twój skrypt wydaje się wymagać, gawkco nie jest częścią standardowej instalacji OS X.
nohillside

@patrix: Dziękuję za twoją opinię Zrobię opis w języku angielskim i przetłumaczę również zintegrowaną pomoc (obecnie w języku francuskim). gawk: właściwie, zapomniałem, dziękuję. Z awk napotkałem pewne problemy z lokalizacją (przecinek dziesiętny lub przecinek dziesiętny). Zniknęli nie wiedząc dlaczego. Wróciłem do awk zamiast gapić się. Potrzebowałem trochę czasu, aby dostosować rzeczy, ponownie opublikuję, gdy będzie gotowy. Twój.
Robert

1
Po prostu zastąpienie gawk awk działało dla mnie bez problemów.
nohillside


1

vm_stat pokazuje w kilobajtach.

Poniższy oneliner pokazuje w megabajtach:

paste <(vm_stat | awk 'NR>1' | grep -o ".*:") <(for i in $(vm_stat | awk 'NR>1' | tr -d '.' | awk '{print $NF}'); do perl -e "print $i/1024" | awk '{printf "%0.2f", $0}'; echo; done) | column -s: -t

Zwroty:

Pages free                      11.06
Pages active                    798.25
Pages inactive                  776.03
Pages speculative               9.15
Pages throttled                 0.00
Pages wired down                303.27
Pages purgeable                 0.95
"Translation faults"            82172.66
Pages copy-on-write             11629.60
Pages zero filled               27685.41
Pages reactivated               1450.70
Pages purged                    91.66
File-backed pages               430.20
Anonymous pages                 1153.24
Pages stored in compressor      481.75
Pages occupied by compressor    149.91
Decompressions                  1277.92
Compressions                    1622.33
Pageins                         13198.02
Pageouts                        66.61
Swapins                         54.34
Swapouts                        90.63

1

Jeśli używasz fishshell na OSX, wraz z Fisherem, menedżerem pakietów.

Napisałem następujące rozszerzenie: https://github.com/fisherman/free

Jest to pełne ponowne wykonanie bezpłatnego polecenia dla systemu osx. Zobacz sam

> free
                 total     used     free   appmem    wired   compressed
Mem:            8.00Gb   6.65Gb   1.95Gb   2.87Gb   2.09Gb   1.86Gb
+/- Cache:               1.24Gb   1.87Gb
Swap(43%):      2048Mb    877Mb   1171Mb
Load Avg:        1.63 1.95 1.95

Miły. Natychmiast podrobiłem to.
PeterVP,

-1

Top lub htop mogą również pomóc rozwiązać problem.


Witaj, aby zapytać Inny. Podaj więcej informacji o tym, w jaki sposób polecenia, na które się powołujesz, odpowiadają na pytanie.
tubedogg
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.