我想编写一个脚本来定期检查我的 RAM 使用情况,然后计算其最大值。
要计算使用的内存,我有两个选择,通过neofetch
或free -m
输出结果为$ free -m
:
total used free shared buff/cache available
Mem: 15839 4169 7630 794 4039 10555
Swap: 2047 0 2047
因此,我将输出通过管道传输为,$ free -m | grep Mem | awk '{print ($3/1024)}'
结果是4.07324
。
现在,如果我执行类似于$neofetch
输出的操作,$ neofetch | grep -i Memory | awk '{print ($2/1024)}'
我会得到如下输出4.84668
因此,这两个输出不匹配,在检查实际 RAM 使用情况时应考虑哪一个?如果这很重要,我有一台运行 Nvidia 驱动程序的 4gb GTX1650,53MB
通过以下方式检查时会消耗 RAM$ nvidia-smi
我能想到的一种可能的情况是,$ neofetch
给出已用内存和共享内存,因为
$ free -m | grep Mem | awk '{print (($3+$5)/1024)}'
和
$ neofetch | grep -i Memory | awk '{print ($2/1024)}'
彼此非常接近(4.85547
并且4.86035
)
但我的问题仍然存在,哪些记忆值值得信任?
答案1
我建议使用free -m
或cat /proc/meminfo
作为内存使用量的来源。这些数字直接来自内核。
这里,使用的内存数量的计算方式如下:
# used = total - free - buffers/cache
Neofetch 从 计算内存使用情况cat /proc/meminfo
,正如您所猜测的,它显示已使用的内存,包括“共享”部分:(源代码,第 2679 行):
# MemUsed = Memtotal + Shmem - MemFree - Buffers - Cached - SReclaimable
我认为来自的数字free
是最可靠的。但由于内存使用情况可能很复杂,因此没有简单的答案。您必须询问 Neofetch 的开发人员为什么他们这样计算。
答案2
您应该只查看free
输出的“可用”部分。Linux 系统上的大量 RAM 被各种工具(包括 neofetch)显示为“已使用”,因为它用于缓存,但只要任何程序需要它,它就会被释放(这显示在“buff/cache”中)。因此,虽然从技术上讲不是“空闲的”,但这些内存是可用的,并且那是你真正想知道的:系统有多少可用内存。
因此,请将您的解析更改为:
free -m | awk '$1=="Mem:"{print $7}'
这将为您提供您真正想要的数字available
。另一方面,Neofetch 似乎只报告“已使用”+“共享”,但这并未正确报告系统中新进程当前可用的内存量。
有用的参考资料: