Существует ли в Mac OS X Terminal версия «свободной» команды в системах Linux?

194

В Linux я часто использую команду free, чтобы увидеть текущий объем свободной и используемой памяти в системе. Например:

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

Кажется, он не существует, когда я вхожу freeв Терминал Mac OS X. Есть ли альтернатива?

HPY
источник

Ответы:

92

Как говорит @khedron , вы можете увидеть эту информацию в Activity Monitor.

Если вы хотите это в командной строке, вот сценарий Python, который я написал (или, возможно, модифицировал от чьего-либо, я не помню, сейчас он довольно старый), чтобы показать вам объемы проводной, активной, неактивной и свободной памяти:

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

Как видите, вы можете просто позвонить vm_statиз командной строки, хотя она рассчитана на страницы по 4 КБ, отсюда и скрипт для преобразования в МБ.

Сценарий также подсчитывает использование «реальной памяти» всеми запущенными процессами для сравнения (это не будет совпадать с какими-либо конкретными значениями из общей статистики памяти, потому что память - сложный зверь).


Вот пример вывода скрипта в моей системе:

[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

(очень немного откорректировано, чтобы соответствовать размеру вкладки в StackExchange;)

drfrogsplat
источник
Каков наилучший способ использовать этот скрипт?
iddober
2
не знаете точно, что вы имеете в виду ... скопируйте и вставьте его в новый файл, сохраните его где-нибудь (возможно, в / usr / local / bin), сделайте его исполняемым и запустите его?
drfrogsplat
Я думаю, что @idober предложил вам включить пример его запуска и полученный результат (например, снимок экрана)
AJ.
@ AJ, ну ладно, понял
drfrogsplat
6
только мои 2 цента:ps -caxm -orss= | awk '{ sum += $1 } END { print "Resident Set Size: " sum/1024 " MiB" }'
хранилище
70

Вам нужна команда vm_stat- похожая на традиционный инструмент Unix, vmstatно с некоторыми отличиями, характерными для MACH. Справочная страница хорошо написана.

Р.И. Болотный Янки
источник
2
Что такое «страницы»?
DilithiumMatrix
8
@zhermes - наименьшая единица памяти, используемая системой ... в случае компьютеров x86 и PPC это 4 КБ. Страницы свободны - это количество 4k единиц свободной памяти.
RI Swamp Yankee
2
Страницы также 4K в iOS.
smci
54

Кажется, причина в том, что это медленно, потому что top -l 1всегда задерживается на одну секунду после завершения, стандартная задержка между обновлениями. Добавление -s 0 к команде делает это мгновенно завершенным:

top -l 1 -s 0 | grep PhysMem

Также, для ясности, мне нравится показывать каждый mem-компонент в своей строке, поэтому я добавил 9 пробелов для выравнивания с PhysMem: в строке замены sed:

top -l 1 -s 0 | grep PhysMem | sed 's/, /\n         /g'
Линус
источник
1
Это собака медленная, ее гораздо лучше использовать vm_stat.
mgol
3
Да, запросы topзначительно медленнее, чем вызовы, vm_statно topвыдержка гораздо менее многословна, и единица измерения составляет мегабайт, а не страницы. Чтобы быть еще менее многословным, разрывы строк могут быть удалены и awkзаменены grepследующим образом top -l 1 | grep ^PhysMem.
Стефан Шмидт
2
Учитывая все обстоятельства, это лучший ответ. Не дает результатов в бесполезных модулях page/ не требует какой-то хакерской постобработки, чтобы сделать эти модули интерпретируемыми.
Иосиф
39

Вот простая строчка, чтобы сделать весь vm_statвывод более понятным для человека:

$ 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
Lloeki
источник
25

Если вы действительно заинтересованы в использовании свопа (какой будет последняя строка вывода free):

$ sysctl vm.swapusage
vm.swapusage: total = 64.00M  used = 0.00M  free = 64.00M  (encrypted)
rymo
источник
Я искал это большое спасибо :)
onalbi
20

Существует команда терминала, похожая freeна Mac OS X ... она называетсяtop

Для получения дополнительной информации вы можете проверить этот документ поддержки Apple.

Mac OS X: как просмотреть использование памяти с помощью «верхней» утилиты

z4mba
источник
24
Строго говоря, «top» в OS X, скорее, больше похож на команду «top» в Linux, конечно :)
calum_b
6
лучше верха:htop
nXqd
3
@nXqd htop: команда не найдена
itsazzad
4
@SazzadTusharKhan brew установите htop, если у вас установлен brew
nXqd
2
Технически они совсем не похожи, потому что free печатает что-то приятное и аккуратное в командной строке, а top - это то, что вы активно просматриваете.
anon58192932
10

Просто взяв решение от @zack и добавив неактивные и спекулятивные блоки.

#!/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
bajceta
источник
9
#!/bin/bash
top -l 1 | grep PhysMem: | awk '{print $10}'

Только для экспертов Unix:

top -l 1 | awk '/PhysMem:/ {print $10}'
Killinks
источник
1
Это больше не возвращает никакого результата в современных macOS.
Мэтт Сефтон
использовать top -l1 | awk '/PhysMem/ {print $2}'на macos> = High Sierra
JDS
Не возвращает использованную память
theillien
8
free="$(( $(vm_stat | awk '/free/ {gsub(/\./, "", $3); print $3}') * 4096 / 1048576)) MiB free"
Zack
источник
1
Текущая редакция этой команды не работает для меня tcsh(по умолчанию) или sh. Это командная оболочка?
Грэм Перрин
Да, это bashи kshконкретно. В tcshпопытке: set freeblocks=`vm_stat | grep free | awk '{ print $3 }' | sed 's/\.//'` ; set freeMB=`expr $freeblocks \* 4096 / 1048576`; set free=`echo $freeMB MiB free`. Затем вы echo $freeможете распечатать объем свободной памяти. Можно также создать псевдоним: alias free echo $freeMB MiB free.
Jaume
7

Судя по вашему другому вопросу , я думаю, вы нашли использование утилиты Activity Monitor для проверки состояния вашей памяти, верно? Просто для записи, он находится в / Applications / Utilities / Activity Monitor.app.

Майкл Х.
источник
7

Нет точного эквивалента, который распространяется с Mac OS X, но есть пара других способов получить информацию:

  1. system_profiler - Показывает всю информацию о профиле системы Mac в оболочке
  2. sysctl -a | grep memили sysctl hw.memsize(всего мем)
TrinitronX
источник
+1, работает из терминала в режиме восстановления (cmd-r во время загрузки)
Стив Кехлет
7

Вы можете попробовать команду, allmemoryесли вам нужен инструмент командной строки, который сообщает об очень детальном использовании памяти.

AlanGBaker
источник
1
Мощный инструмент, но он интенсивно использует процессор (около 95% одного из двух процессоров на моем MacBookPro5,2) и, если используется много памяти: простой запуск allmemoryможет быть неожиданно долгим - для меня сегодня более четырех минут на запуск, YMMV. Прогон allmemoryдля sysdiagnoseможет занять значительно больше времени.
Грэм Перрин
6

Выше приведено слишком много усилий на мой взгляд, и предполагается, что у вас тоже есть полноценная установка ... Если вы загрузились с загрузочного диска Mac OS X, то все вышеперечисленные решения, очевидно, не будут работать. .. Просто используйте команду "hostinfo", вот вывод моей середины 2012 MBAir под управлением 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

Преимущество этой команды в том, что она поставляется с предустановленной версией 10.9 /usr/bin, так что это очень удобно,

в идеале, если вы просто хотите RAM, выполните:

$ hostinfo | grep memory

Не знаю, существует ли hostinfo на каких-либо предыдущих ОС, хотя ...

hairbear ...
источник
4
Как hostinfoпоказать использованную память?
холме
3
эта команда (по крайней мере, здесь в OS 10.6.8) показывает только физически доступную память, но не сколько ее в настоящее время используется
MostlyHarmless
Это означает, что на самом деле это не отвечает на заданный вопрос, поскольку в нем прямо говорится, что он желает «свободной и использованной памяти».
b4hand
5
top -l 1 -s 0 | awk ' /Processes/ || /PhysMem/ || /Load Avg/{print}'

Это должно делать красиво :)

Бижур Валларк
источник
3

Я думаю, что в наши дни, psutilи его meminfo.pyсценарий предоставляет наиболее полезные детали использования памяти. Чтобы попробовать это:

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

Выходные данные выглядят так:

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

Обратите внимание на Availableстроку, в которой показана оценка того, сколько памяти фактически доступно для запуска новых приложений без замены.

Я не знаю ни одной другой утилиты MacOS, обеспечивающей такую ​​оценку доступной памяти.

Для сравнения: в системе Linux такая же информация предоставляется в availableстолбце при выводе из текущих версий 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

Этот availableстолбец в freeвыходной просто приходит от MemAvailableв /proc/meminfo. И в системах, которые имеют /proc/meminfo, psutil также просто использует это для оценки доступной памяти.

Но MacOS не имеет /proc/meminfo, поэтому оценить объем доступной памяти в этом случае psutil использует тот же алгоритм , используемый в Linux для расчета MemAvailableдля/proc/meminfo .

sideshowbarker
источник
3

Вы можете попробовать memory_pressureкоманду. Смотрите вывод моей системы (i5, 4 ГБ ОЗУ)

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 "free like" для Mac OSX.

Это второе переиздание этого поста. Сначала я получил два -1. Один, потому что я не описывал по-английски, он исправлен. Другой, потому что я использовал gawk(который не является частью стандартной установки OS X), это также исправлено, я теперь использую awk. Они -2все еще там ;-). Лучше всего, пожалуй, сейчас тестировать и оценивать сами команды?

Я пересмотрел свою первую идею создать только одну ориентированную на конечного пользователя команду с дружественным и легко настраиваемым дисплеем. Я сделал две:

  • free-like.sh скрипт всегда ориентирован на «конечного пользователя», с большей точностью, «дружественным» и настраиваемым отображением, но с большим количеством вычислений и потреблением ресурсов,

  • free-like-raw.sh- команда, ориентированная на разработчиков, sysadmin и т. д., с меньшими затратами на вычисления и ресурсы, но также с меньшей точностью и менее «дружественным» отображением.

Данные для физической памяти извлекаются из результатов команды vm_stat(которая возвращает результаты в размере блока). Неточность, возникающая в результате преобразования в байтах (number_of_blocks * block_size, значение вычислений по умолчанию), будет между 0 <размером блока. Данные для виртуальной памяти берутся из topкоманды. Неточность здесь связана с эталонной единицей topкоманды: кило, мега, гига.

Расчеты производятся с использованием awkокруглений (в отличие от bc). awkтакже быстрее чем bc. Вы можете увидеть тестовый скрипт здесь: http://myblog.robert.sebille.name/article29.html#awk-bc

Вы можете просмотреть результаты команд в байтах (по умолчанию), в килограммах, мегагерцах или гигах, с x десятичными разрядами в случае free-like.sh и при запросе отображения в мегапиксельном гига.

Сценарии слишком длинные для публикации, но вы можете найти их в этой статье моего блога: http://myblog.robert.sebille.name/article29.html

Статья написана на французском языке, но она отображает один пример отображения для каждой команды и их интегрированную справку ( ./free-like.sh -hи ./free-like-raw.sh -h) на английском языке. Эти средства полностью описывают команды. В статье отображаются также коды.

Английский не мой родной язык. Если кто-то хочет исправить ошибки во встроенной справке, он приветствуется;).

ваша.

Роберт
источник
Помимо того, что ваш сценарий более или менее непригоден для использования кем-то, кто не знает французского языка, он, кажется, требует gawkчего-то, что не является частью стандартной установки OS X.
Nohillside
@patrix: Спасибо за ваш отзыв. Я сделаю описание на английском и переведу интегрированную справку (в настоящее время на французский). gawk: на самом деле, я забыл, спасибо. Я столкнулся с некоторыми проблемами локализации (десятичная запятая или десятичная точка) с awk. Они исчезли, не зная почему. Я вернулся в awk вместо gawk. Мне нужно немного времени, чтобы все настроить, я сделаю репост, когда он будет готов. С уважением.
Роберт
1
Простая замена gawk на awk работала для меня без проблем.
nohillside
2

Это работает на моем $ PS1:

https://github.com/vigo/dotfiles-universal/blob/master/prompts/free_memory

(Рубиновая версия: https://github.com/vigo/dotfiles-universal/blob/master/prompts%2Ffree_memory.rb )

виго
источник
1
Ответы на разные вопросы должны быть чем-то большим, чем просто ссылка. Это нормально, чтобы включить ссылку, но, пожалуйста, суммируйте или извлеките ее в ответе. Идея состоит в том, чтобы сделать ответ самостоятельно.
nohillside
1

vm_stat показывает вам в килобайтах.

Ниже приведен пример в мегабайтах:

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

Возвращает:

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
rubynorails
источник
1

В этом случае вы используете fishxhell на osx вместе с менеджером пакетов fisher.

Я написал следующее расширение: https://github.com/fisherman/free

Это полное повторение бесплатной команды для OSX. Смотрите сами

> 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
Оливье Рефало
источник
Приятно. Сразу же зарезал его.
PeterVP
-1

top или htop также могут помочь решить проблему.

Дай Кайсян
источник
Добро пожаловать, чтобы спросить другому. Пожалуйста, предоставьте больше информации о том, как команды, на которые вы ссылаетесь, отвечают на вопрос.
tubedogg