一、背景
在Linux下可以使用 free 命令来方便的查看内存占用情况,如 free -g、free -m等,但MacOS下没有这个命令。
既然如此,那么MacOS里是否有类似的工具呢?
而我们又该如何查看整个PC的内存占用情况,及指定进程的内存占用情况呢?
别急,带着这些疑问请往下看:
二、方案
1、通过 top 命令来替代 free 命令
A). 查看全部进程的内存占用大小
top -l 1 | head -n 10 | grep PhysMem
PhysMem: 31G used (2485M wired), 223M unused.
B). 查看指定进程的内存占用大小
top -pid 72267 -l 1 | tail -n 1 | awk '{print $8}'
1039M
2、通过 GUI 工具 “活动监视器” 查看内存
三、实验
3.1 查看系统总内存占用情况
先总体看看:
➜ libexec git:(stable) top -l 1 | head -n 10
Processes: 643 total, 2 running, 641 sleeping, 4233 threads
2023/06/07 11:03:11
Load Avg: 3.16, 2.53, 2.48
CPU usage: 4.66% user, 10.83% sys, 84.49% idle
SharedLibs: 698M resident, 117M data, 167M linkedit.
MemRegions: 859023 total, 10G resident, 372M private, 3227M shared.
PhysMem: 31G used (2485M wired), 223M unused.
VM: 289T vsize, 3778M framework vsize, 2603873(0) swapins, 4151090(0) swapouts.
Networks: packets: 189125397/149G in, 154096002/51G out.
Disks: 49163482/907G read, 64642095/1086G written.
PID COMMAND %CPU TIME #TH #WQ #PORTS MEM PURG CMPRS PGRP PPID STATE BOOSTS %CPU_ME %CPU_OTHRS UID FAULTS COW MSGSENT MSGRECV SYSBSD SYSMACH CSW PAGEINS IDLEW POWER INSTRS CYCLES USER #MREGS RPRVT VPRVT VSIZE KPRVT KSHRD
99759 DiskUnmountWatch 0.0 00:00.15 2 1 33 1745K 0B 1488K 99759 1 sleeping 0[0] 0.00000 0.00000 501 2912 78 174 491 4112 1205 1239 2 17 0.0 0 0 xxxxxxxx N/A N/A N/A N/A N/A N/A
98953 zsh 0.0 00:00.82 1 0 21 6449K 0B 6096K 98953 87986 sleeping *0[1] 0.00000 0.00000 501 15809 2691 193 91 252427 201 1058 58 0 0.0 0 0 xxxxxxxx N/A N/A N/A N/A N/A N/A
再过滤出总内存占用这部分数据:
top -l 1 | head -n 10 | grep PhysMem
PhysMem: 31G used (2485M wired), 223M unused.
3.2 查看指定进程占用情况
在这个实验中,我们检查一下运行在 MacOS上(通过brew方案安装)的 Hadoop 3.3.1 (伪分布式)各个进程的占用情况。
Hadoop 集群总共包含以下几类进程:
➜ libexec git:(stable) jps -ml
72267 org.apache.hadoop.hdfs.server.namenode.NameNode
72369 org.apache.hadoop.hdfs.server.datanode.DataNode
72504 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
72779 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
72878 org.apache.hadoop.yarn.server.nodemanager.NodeManager
根据各自进程ID查询其内存占用大小:
top -pid 72267 -l 1 | tail -n 1 | awk '{print $8}' #1039M
top -pid 72369 -l 1 | tail -n 1 | awk '{print $8}' #788M
top -pid 72504 -l 1 | tail -n 1 | awk '{print $8}' #957M
top -pid 72779 -l 1 | tail -n 1 | awk '{print $8}' #495M
top -pid 72878 -l 1 | tail -n 1 | awk '{print $8}' #500M
重要说明:
1、关于命令行参数:
【-l 1】只执行1次
【tail -n 1】取最后一条结果
2、关于内存计算方式在Linux与MacOS上的区别
MacOS与Linux在计算内存方式上还是不太一样的:
A). 对于Linux系统, 如果要查看某个进程的内存使用情况,通常有两种统计方式:
(1)实际使用内存;
(2)实际使用内存 + cache使用内存。
B). 对于 MacOS系统, 在统计内存使用时,一般还有个交换内存SwSS的概念,即"Swap" Set Size,指交换内存的大小。
虚拟内存指的是一个程序程序运行时,使用的内存空间。
虚拟内存的大小一般使用 VSS(Virtual Set Size)表示。
.
它的大小一般这样计算:
.
VSS = RSS + LSS + SwSS
.
- RSS 的全称为:Resident Set Size,表示当前程序进程实际使用的内存大小。
- LSS 的全称为:“Lazy” Set Size,表示系统同意给程序进程分配的,但是还没分配完成的内存大小。
- SwSS 的全称为:“Swap” Set Size,指交换内存的大小,与 MacOS 不同,iOS 没有交换内存(一般Mobile device的实际存储空间比较有限)。
3.3 通过MacOS内置的GUI工具“活动监视器”查看指定进程占用情况
这里可以看出,GUI工具检测出的内存占用,与命令行里查出来的内存大小,在数据上保持着高度的一致。