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

В 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. Есть ли альтернатива?

Ответы (21)

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

Если вы хотите это в командной строке, вот скрипт 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;)

Уму непостижимо, что нужно написать скрипт, чтобы получить эту базовую информацию на Mac.
@meyerson, я думаю, что это немного преувеличено, вам не нужно писать скрипт, чтобы получить эту информацию, этот скрипт просто сопоставляет интересный набор информации вместе в удобочитаемом формате, отдаленно похожем на «бесплатный» для Linux. команда. 'vm_stat' уже дает вам основную информацию, как и 'top'.
просто мои 2 цента:ps -caxm -orss= | awk '{ sum += $1 } END { print "Resident Set Size: " sum/1024 " MiB" }'
что такое проводная память?
Ух ты. Это назад. С тем же успехом они могли бы просто удалить приложение Terminal.
Привет! спасибо за этот скрипт! Я столкнулся с проблемой: ` Файл "show-memory-stats.py", строка 32: печать "Проводная память:\t\t%d МБ" % ( vmStats["Страницы подключены"]/1024/1024) ` Терминал указывает на первую одинарную кавычку перед Wired.

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

Что такое «страницы»?
@zhermes - Наименьшая единица памяти, используемая системой ... в случае x86 и PPC Mac это 4 КБ. Свободные страницы — это количество свободных 4k единиц памяти.
Страницы также 4K в iOS.
Но нам нужны байты, МБ, ГБ, ТБ... эта команда не кажется полезной.
@rjurney: 4kB * number_of_pages возможно? Затем разделите на 1024, чтобы получить МБ, ГБ и т. д., как вам угодно.
Я думаю, что это на самом деле 16 КБ на Apple Silicon.

Кажется, причина его медленности в том, что 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'
Это собака медленная, гораздо лучше использовать vm_stat.
Да, запросы выполняются topзначительно медленнее, чем вызовы, vm_statно topизвлечение гораздо менее подробное, а единицей измерения являются мегабайты, а не страницы. Чтобы быть еще менее подробным, разрывы строк могут быть удалены и awkзаменены grepна top -l 1 | grep ^PhysMem.
Учитывая все обстоятельства, это лучший ответ. Не дает результатов в бесполезных pageединицах / требует какой-то хакерской постобработки, чтобы сделать указанные единицы интерпретируемыми.

Вот простой однострочный код, чтобы сделать весь 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

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

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

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

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

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

Вы можете попробовать 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%
Это почти то, что я хотел: способ увидеть нагрузку памяти на систему. Это не так легко / просто увидеть, как график давления, который показывает монитор активности, но пока это лучшее, что я мог найти в Терминале.

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

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

Просто возьмите решение от @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
free="$(( $(vm_stat | awk '/free/ {gsub(/\./, "", $3); print $3}') * 4096 / 1048576)) MiB free"
Текущая версия этой команды не работает для меня в 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.
#!/bin/bash
top -l 1 | grep PhysMem: | awk '{print $10}'

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

top -l 1 | awk '/PhysMem:/ {print $10}'
Это больше не возвращает никакого результата в современной macOS.
использовать top -l1 | awk '/PhysMem/ {print $2}'на macos >= High Sierra
Не возвращает использованную память

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

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

в идеале, если вам просто нужна оперативная память, выполните:

$ hostinfo | grep memory

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

Как hostinfoпоказать используемую память?
эта команда (по крайней мере, здесь, в ОС 10.6.8) показывает только физически доступную память, но не то, сколько ее используется в данный момент
Это означает, что на самом деле это не отвечает на заданный вопрос, поскольку в нем конкретно указано, что ему требуется «свободная и используемая память».

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

Мощный инструмент, но он интенсивно использует процессор (около 95% одного из двух процессоров на моем MacBookPro5,2), и если используется много памяти: простой запуск allmemoryможет быть неожиданно долгим — для меня сегодня более четырех минут за запуск, YMMV. Выполнение allmemoryfor sysdiagnoseможет занять значительно больше времени.
top -l 1 -s 0 | awk ' /Processes/ || /PhysMem/ || /Load Avg/{print}'

Это должно хорошо сработать :)

Я думаю, что в наши дни 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/meminfopsutil также просто использует его для оценки доступной памяти.

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

Команды Bash «бесплатно» для Mac OSX.

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

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

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

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

Данные для физической памяти извлекаются из результатов выполнения команды vm_stat(которая возвращает результаты в виде блоков). Неточность, возникающая в результате преобразования в байтах (число_блоков * размер_блока, значение по умолчанию для вычислений), будет находиться в пределах 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.
@patrix: Спасибо за ваш отзыв, я сделаю описание на английском языке, а также переведу встроенную справку (в настоящее время на французском языке). gawk: на самом деле, я забыл, спасибо. Я столкнулся с некоторыми проблемами локализации (десятичная запятая или десятичная точка) с awk. Они исчезли, не зная почему. Я вернулся к awk вместо gawk. Мне нужно немного времени, чтобы настроить вещи, я сделаю репост, когда он будет готов. Ваш.
Простая замена gawk на awk у меня сработала без проблем.
Ответы на Ask Different должны быть чем-то большим, чем просто ссылка. Можно включить ссылку, но, пожалуйста, подведите итог или выделите ее в ответе. Идея состоит в том, чтобы сделать ответ самостоятельным.

Если вы используете fishshell на 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
Хороший. Сразу сфоткал.
ссылка не активна
активная ссылка github.com/orefalo/free/blob/master/functions/free.fish Спасибо, Оливер!

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

Oneliner ниже показывает в мегабайтах:

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

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

Добро пожаловать, чтобы спросить разные. Предоставьте дополнительную информацию о том, как команды, на которые вы ссылаетесь, отвечают на вопрос.