Esiste una versione Terminale Mac OS X del comando "gratuito" nei sistemi Linux?


194

Su Linux, utilizzo spesso il comando gratuito per visualizzare la quantità corrente di memoria libera e utilizzata nel sistema. Per esempio:

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

Non sembra esistere quando freeentro nel Terminale di Mac OS X. C'è un'alternativa?

Risposte:


92

Come dice @khedron , puoi vedere queste informazioni in Activity Monitor.

Se lo vuoi sulla riga di comando, ecco uno script Python che ho scritto (o forse modificato da quello di qualcun altro, non ricordo, è abbastanza vecchio ora) per mostrarti le quantità di memoria Wired, Active, Inactive e Free:

#!/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 ))

Come puoi vedere, puoi semplicemente chiamare vm_statdalla riga di comando, anche se conta in pagine da 4kB, quindi lo script da convertire in MB.

Lo script conta anche l'utilizzo della "memoria reale" di tutti i processi in esecuzione per il confronto (questo non corrisponderà a nessun valore specifico dalle statistiche di memoria complessive, perché la memoria è un belva complesso).


Ecco un esempio dell'output dello script sul mio sistema:

[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

(leggermente adattato per adattarsi al dimensionamento delle schede su StackExchange;)


qual è il modo migliore per usare questo script?
iddober,

2
non sai esattamente cosa intendi ... copiarlo e incollarlo in un nuovo file, salvarlo da qualche parte (forse in / usr / local / bin), renderlo eseguibile ed eseguirlo?
drfrogsplat,

Penso che @idober stia suggerendo di includere un esempio di esecuzione e dell'output prodotto (ad esempio una cattura dello schermo)
AJ.

@AJ, ah ok, capito
drfrogsplat,

6
solo i miei 2 centesimi:ps -caxm -orss= | awk '{ sum += $1 } END { print "Resident Set Size: " sum/1024 " MiB" }'
caveau

70

Il comando di cui hai bisogno è vm_stat- simile al tradizionale strumento Unix vmstatma con alcune differenze specifiche di MACH. La pagina man è ben scritta.


2
Cosa sono le "pagine"?
DilithiumMatrix,

8
@zhermes - La più piccola unità di memoria utilizzabile dal sistema ... nel caso di Mac x86 e PPC, è 4K. Le pagine libere sono il numero di 4k unità di memoria libera.
RI Swamp Yankee,

2
Le pagine sono anche 4K in iOS.
smci,

54

Sembra che la ragione sia lenta perché top -l 1ritarda sempre di un secondo dopo il completamento, il ritardo standard tra gli aggiornamenti. L'aggiunta di -s 0 al comando lo completa immediatamente:

top -l 1 -s 0 | grep PhysMem

Inoltre, per chiarezza, mi piace mostrare ogni componente mem sulla sua linea, quindi ho aggiunto 9 spazi per l'allineamento con 'PhysMem:' nella stringa di sostituzione sed:

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

1
È un cane lento, è molto meglio utilizzarlo vm_stat.
mgol

3
Sì, l'interrogazione topè significativamente più lenta di quella chiamata vm_statma l' topestrazione è molto meno dettagliata e l'unità è megabyte e non pagine. Per essere ancora meno dettagliati, le interruzioni di riga possono essere rimosse e awkpossono essere sostituite greprisultando top -l 1 | grep ^PhysMem.
Stefan Schmidt,

2
Tutto considerato, questa è la risposta migliore. Non dà risultati in pageunità inutili / richiede una sorta di post-elaborazione caotica per rendere interpretabili tali unità.
ijoseph,

39

Ecco un semplice one-liner per rendere l'intera vm_statproduzione più amichevole per l'uomo:

$ 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

Nel caso in cui sei veramente interessato all'utilizzo dello swap (quale sarebbe l'ultima riga di output da free):

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

lo stavo cercando molto grazie :)
onalbi

20

C'è un comando terminale simile a quello freesu Mac OS X ... si chiamatop

Per ulteriori informazioni è possibile consultare questo documento di supporto Apple.

Mac OS X: come visualizzare l'utilizzo della memoria con l'utilità "top"


24
A rigor di termini, "top" su OS X è piuttosto più simile al comando "top" di Linux, ovviamente :)
calum_b

6
meglio che in alto:htop
nXqd

3
@nXqd htop: comando non trovato
itsazzad

4
@SazzadTusharKhan brew install htop se hai installato brew
nXqd

2
Tecnicamente non sono affatto simili perché la stampa libera qualcosa di carino e pulito sulla riga di comando mentre la parte superiore è qualcosa che attivamente vedi.
anon58192932

10

Basta prendere la soluzione da @zack e aggiungere blocchi inattivi e speculativi.

#!/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}'

Solo per esperti Unix:

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

1
Questo non restituisce più alcun risultato in macOS moderno.
Matt Sephton,

utilizzare top -l1 | awk '/PhysMem/ {print $2}'su macos> = High Sierra
JDS

Non restituisce memoria usata
theillien

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

1
L'edizione corrente di quel comando non funziona per me in tcsh(impostazione predefinita) o sh. Il comando è specifico della shell?
Graham Perrin,

Sì, è bashe kshspecifico. In tcshprova: set freeblocks=`vm_stat | grep free | awk '{ print $3 }' | sed 's/\.//'` ; set freeMB=`expr $freeblocks \* 4096 / 1048576`; set free=`echo $freeMB MiB free`. È quindi possibile fare echo $freeper stampare la quantità di memoria libera. Si potrebbe anche creare un alias: alias free echo $freeMB MiB free.
Jaume

7

A giudicare dall'altra tua domanda , penso che tu abbia trovato l'uso dell'utilità Activity Monitor per esaminare il tuo stato di memoria, giusto? Solo per la cronaca, è in / Applicazioni / Utilità / Activity Monitor.app.


7

Non esiste un equivalente esatto distribuito con Mac OS X, ma ci sono un paio di altri modi per ottenere le informazioni:

  1. system_profiler - Mostra tutte le informazioni sul profilo di sistema del Mac nella shell
  2. sysctl -a | grep memo sysctl hw.memsize(mem totale)

+1, funziona dal terminale in modalità di ripristino (cmd-r durante l'avvio)
Steve Kehlet

7

È possibile provare il comando allmemoryse si desidera uno strumento da riga di comando che riporta un utilizzo della memoria estremamente dettagliato.


1
Uno strumento potente, ma ad alta intensità di processore (circa il 95% di una delle due CPU sul mio MacBookPro5,2) e se viene utilizzata molta memoria: una semplice esecuzione allmemorypuò essere inaspettatamente lunga - per me oggi, oltre quattro minuti per corsa, YMMV. Una corsa di allmemoryper sysdiagnosepotrebbe richiedere molto più tempo.
Graham Perrin,

6

Quanto sopra è uno sforzo eccessivo per i miei gusti e presume che tu abbia anche un'installazione completa ... Se hai avviato da un disco di avvio di Mac OS X, ovviamente tutte le soluzioni sopra non funzioneranno. .. Basta usare il comando "hostinfo", ecco l'output del mio MBAir di metà 2012 con 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

Il bello di questo comando è che viene preinstallato con il programma di installazione 10.9 troppo sotto /usr/bin, quindi è molto utile,

idealmente, se vuoi solo RAM, emetti:

$ hostinfo | grep memory

Non so se hostinfo esiste su qualsiasi sistema operativo precedente però ...


4
Come hostinfomostra la memoria utilizzata ?
Nohillside

3
questo comando (almeno qui in OS 10.6.8) mostra solo la memoria fisicamente disponibile, ma non la quantità attualmente utilizzata
MostlyHarmless

Ciò significa che in realtà non risponde alla domanda posta in quanto afferma specificamente che desidera "memoria libera e utilizzata".
b4hand

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

Questo dovrebbe fare bene :)


3

Penso che oggigiorno, psutile il suo meminfo.pyscript forniscano i dettagli più utili sull'uso della memoria. Per provarlo:

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

L'output che produce è simile al seguente:

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

Si noti la Availableriga, che mostra una stima della quantità di memoria effettivamente disponibile per l'avvio di nuove applicazioni , senza scambio.

Non conosco altre utilità di MacOS che forniscono tale stima della memoria disponibile.

Per motivi di confronto: su un sistema Linux, lo stesso tipo di informazioni è fornito nella availablecolonna nell'output delle versioni correnti di 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

Quella availablecolonna in freeoutput proviene da MemAvailabledentro /proc/meminfo. E su sistemi che lo hanno /proc/meminfo, psutil lo usa anche solo per stimare la memoria disponibile.

Ma MacOS non ha /proc/meminfo, in modo di stimare la quantità di memoria disponibile in quel caso, psutil impiega lo stesso algoritmo utilizzato su Linux per il calcolo MemAvailableper/proc/meminfo .


3

Puoi provare il memory_pressurecomando. Vedi l'output del mio sistema (i5, 4 GB 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

Bash comanda "gratis come" per Mac OSX.

Questa è la seconda ristampa di questo post. All'inizio ne ho presi due -1. Uno perché non stavo descrivendo in inglese, è corretto. L'altro perché l'ho usato gawk(che non fa parte di un'installazione standard di OS X), è anche corretto, ora lo uso awk. L' -2sono ancora lì ;-). Il migliore è forse ora di testare e valutare i comandi stessi?

Ho rivisto la mia prima idea di creare un solo comando orientato all'utente finale con un display intuitivo e altamente configurabile, ne ho fatti due:

  • free-like.sh uno script sempre orientato "utente finale", con maggiore precisione, un display "amichevole" e configurabile, ma con più calcoli e consumo di risorse,

  • free-like-raw.sh, un comando ora orientato sviluppatore, amministratore di sistema, ecc., con meno calcolo e consumo di risorse, ma anche con meno precisione, display meno "amichevole".

I dati per la memoria fisica vengono estratti dai risultati del comando vm_stat(che restituisce i risultati in blocchi). L'imprecisione risultante dalla trasformazione in byte (number_of_blocks * block_size, il valore predefinito dei calcoli) sarà compresa tra 0 <la dimensione del blocco. I dati per la memoria virtuale sono presi dal topcomando. L'imprecisione qui è collegata all'unità di riferimento del topcomando: chilo, mega, giga.

I calcoli vengono effettuati utilizzando il awkrispetto arrotondato (al contrario di bc). awkè anche più veloce di bc. Puoi vedere lo script di test qui: http://myblog.robert.sebille.name/article29.html#awk-bc

Puoi visualizzare i risultati dei comandi in byte (impostazione predefinita), in chilo, mega o giga, con x decimali nel caso di free-like.sh e se chiedi la visualizzazione in mega ou giga.

Gli script sono troppo lunghi per un post, ma puoi trovarli su questo articolo del mio blog: http://myblog.robert.sebille.name/article29.html

L'articolo è in francese, ma mostra un esempio di display per ciascun comando e il loro aiuto integrato ( ./free-like.sh -he ./free-like-raw.sh -h), in inglese. Questi aiuti descrivono completamente i comandi. L'articolo mostra anche i codici.

L'inglese non è la mia lingua madre. Se qualcuno vuole correggere errori nell'aiuto integrato, è il benvenuto;).

il tuo.


Oltre ad essere più o meno inutilizzabile da qualcuno senza alcuna conoscenza del francese, il tuo script sembra richiedere gawkche non faccia parte di un'installazione standard di OS X.
Nohillside

@patrix: grazie per il tuo feedback, farò una descrizione in inglese e tradurrò anche l'aiuto integrato (attualmente in francese). gawk: in realtà, ho dimenticato, grazie. Ho riscontrato alcuni problemi di localizzazione (virgola decimale o punto decimale) con awk. Sono scomparsi senza sapere il perché. Sono tornato a Awk invece di Gawk. Ho avuto bisogno di un po 'di tempo per sistemare le cose, ripubblicherò quando sarà pronto. Il tuo.
Robert,

1
La semplice sostituzione di gawk con awk ha funzionato senza problemi per me.
Nohillside


1

vm_stat ti mostra in kilobyte.

L'eleliner seguente mostra in megabyte:

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

Ritorna:

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

In questo caso usi fishshell su osx, insieme a fisher il suo gestore di pacchetti.

Ho scritto la seguente estensione: https://github.com/fisherman/free

È una ripetizione completa del comando gratuito per osx. Vedi da solo

> 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

Bello. Immediatamente l'ha soprannominato.
PeterVP,

-1

top o htop possono anche aiutare a risolvere il problema.


Benvenuti a chiedere diverso. Fornisci ulteriori informazioni su come i comandi a cui fai riferimento rispondono alla domanda.
tubedogg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.