Linux系统中是否有Mac OS X Terminal的“免费”命令版本?


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的Terminal中输入时,它似乎不存在。还有其他选择吗?

Answers:


92

如@khedron所说,您可以在活动监视器中看到此信息。

如果您想在命令行中使用它,可以使用以下代码编写的Python脚本(或者可能是从别人的代码修改而来,我不记得了,它已经很老了),向您显示Wired,Active,Inactive和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 ))

如您所见,vm_stat尽管它以4kB页计,但您只能从命令行进行调用,因此脚本可以转换为MB。

该脚本还会计算所有正在运行的进程的“实际内存”使用情况以进行比较(这与总内存统计信息中的任何特定值都不匹配,因为内存是一个复杂的野兽)。


这是我的系统上脚本输出的示例:

[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上的选项卡大小;)


使用此脚本的最佳方法是什么?
iddober 2011年

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" }'
Vault

70

您需要的命令vm_stat-与传统的Unix工具类似,vmstat但有一些MACH特定的差异。手册页写得很好。


2
什么是“页面”?
DilithiumMatrix

8
@zhermes-系统可使用的最小内存单位...对于x86和PPC Mac,这是4k。可用页数是可用内存的4k单位数。
RI沼泽扬基队2013年

2
在iOS中页面也是4K。
smci 2014年

54

看来它之所以缓慢,是因为top -l 1刷新完成后总是延迟一秒钟,这是刷新之间的标准延迟。在命令中添加-s 0使其立即完成:

top -l 1 -s 0 | grep PhysMem

另外,为清楚起见,我喜欢在其行上显示每个mem组件,因此我在sed替换字符串中添加了9个空格以与'PhysMem:'对齐:

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

1
太慢了,要好用得多vm_stat
mgol

3
是的,查询top要比调用慢得多,vm_stattop提取的详细程度要低得多,单位是兆字节而不是页。至更不冗长换行符可以被移除并且awk可以被替换为grep导致top -l 1 | grep ^PhysMem
Stefan Schmidt

2
考虑所有事情,这是最好的答案。不会在无用的page单元中产生结果/需要某种骇人听闻的后处理才能使所述单元可解释。
ijoseph

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

25

如果您只对交换使用非常感兴趣(输出的最后一行是什么free):

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

我一直在寻找thanx :)
onalbi,2016年

20

有一个类似于freeMac OS X 的终端命令...被称为top

有关更多信息,您可以查看此Apple支持文档。

Mac OS X:如何使用“ top”实用程序查看内存使用情况


24
严格来说,OS X上的“ top”与Linux的“ top”命令更为相似,当然:)
calum_b

6
比顶部更好:htop
nXqd

3
@nXqd HTOP:找不到命令
itsazzad

4
@SazzadTusharKhan brew install htop(如果您已安装brew)
nXqd 2014年

2
从技术上讲,它们根本不相似,因为免费版在命令行上可以打印出精美且整洁的内容,而top是您积极查看的内容。
anon58192932 '16

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

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

仅适用于Unix专家:

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

1
在现代macOS中,这不再返回任何结果。
马特·塞弗顿

使用top -l1 | awk '/PhysMem/ {print $2}'在MacOS> =海伊谢拉
JDS

不返回使用的内存
theillien

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

1
该命令的当前版本不适用于tcsh(默认设置)或中sh。该命令是否特定于Shell?
Graham Perrin

是的,这是bashksh具体的。在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

另一个问题来看,我认为您已经找到了使用活动监视器实用程序来查看内存状态的方法,对吗?仅作记录,它在/ Applications / Utilities / Activity Monitor.app中。


7

没有与Mac OS X一起发布的完全等效的方法,但是还有其他几种获取信息的方法:

  1. system_profiler -在外壳中显示所有Mac的系统配置文件信息
  2. sysctl -a | grep memsysctl hw.memsize(总内存)

+1,在“恢复”模式下在终端机上工作(启动时使用cmd-r)
Steve Kehlet

7

allmemory如果要使用命令行工具报告非常详细的内存使用情况,则可以尝试使用该命令。


1
一个功能强大的工具,但是它占用大量处理器(大约是MacBookPro5中2个CPU的95%),并且如果使用了大量内存:一次简单的运行allmemory可能会出乎意料的长-对于我来说,今天每次运行需要四分钟, YMMV。allmemoryfor 的运行sysdiagnose可能需要更长的时间。
Graham Perrin

6

上面的代码对我来说太费力了,并且假设您也已经完成了完整的安装...如果您是从Mac OS X启动盘启动的,则上述所有解决方案显然都行不通。 ..只需使用命令“ hostinfo”,这是我在2012年中运行Mavericks(10.9.1)的MBAir的输出:

 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是否在以前的任何操作系统上都存在...


4
如何hostinfo显示已内存?
nohillside

3
此命令(至少在OS 10.6.8中为此命令)仅显示物理上可用的内存,而不显示当前使用的内存量
MostlyHarmless 2015年

这意味着它实际上并没有回答所提出的问题,因为它明确指出它需要“空闲和已使用的内存”。
b4hand


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

输出中的该availablefree仅来自MemAvailable/proc/meminfo。在具有的系统上/proc/meminfopsutil也仅使用它来估计可用内存。

但MacOS的没有/proc/meminfo,所以估计在这种情况下,可用内存, psutil采用Linux上用来计算相同的算法MemAvailable进行/proc/meminfo


3

您可以尝试使用该memory_pressure命令。查看我的系统的输出(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

对于Mac OSX,Bash命令“免费喜欢”。

这是该帖子的第二次重发。起初,我有两个-1。一种是因为我没有用英语描述,所以已将其更正。另一个因为我曾经使用过gawk(这不是标准OS X安装的一部分),所以它也已得到纠正,我现在使用awk。在-2仍然存在;-)。现在最好的办法就是自己测试和评估命令?

我回顾了我的第一个想法,即仅通过友好且高度可配置的显示构建仅一个面向最终用户的命令,我做了两个:

  • free-like.sh 始终面向“最终用户”的脚本,具有更高的准确性,“友好的”和可配置的显示方式,但计算量和资源消耗却更多,

  • free-like-raw.sh,现在是面向命令的开发人员,系统管理员等,具有较少的计算和资源消耗,但精度较低,显示的“友好”程度也较低。

从命令的结果中提取物理内存的数据vm_stat(该结果以块大小返回)。转换产生的不精确性(以字节为单位)(number_of_blocks * block_size,计算的默认值)将在0 <块的大小之间。虚拟内存的数据来自top命令。这里的不精确度与top命令的参考单位相关联:千,兆,千兆。

使用awk四舍五入的方面(相对于bc)进行计算。awk也比快bc。您可以在此处查看测试脚本:http : //myblog.robert.sebille.name/article29.html#awk-bc

如果以free-like.sh为单位,并且以mega ou giga为单位显示,则可以查看命令的结果(以字节为单位)(默认),以千,兆或千兆为单位,带有x小数位。

这些脚本对于发布来说太长了,但是您可以在我的博客文章中找到它们:http : //myblog.robert.sebille.name/article29.html

本文为法文,但以英语显示了每个命令及其集成帮助(./free-like.sh -h./free-like-raw.sh -h)的显示示例。这些帮助完全描述了命令。该文章还显示代码。

英语不是我的母语。如果有人要纠正集成帮助中的错误,欢迎他;)。

你的。


除了对法语一无所知的人几乎不能使用之外,您的脚本似乎还要求gawk不是标准OS X安装的一部分。
nohillside

@patrix:谢谢您的反馈,我将用英语进行描述,还将翻译集成的帮助(当前为法语)。高克:实际上,我忘了,谢谢。我用awk遇到了一些本地化问题(小数逗号或小数点)。他们不知道为什么消失了。我回到awk,而不是gawk。我需要一些时间来调整内容,准备就绪后会重新发布。你的
罗伯特

1
用awk替换gawk对我毫无问题。
nohillside


1

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


-1

top或htop也可以帮助解决问题。


欢迎询问不同。请提供有关您引用的命令如何回答问题的更多信息。
tubedogg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.