检查 Linux 中的可用内存

ron*_*456 9 python ram free

我正在编写一个 Python 脚本,它下载4K视频并根据要求播放它们。当我的设备内存超过 7.2 GB 时,它会删除观看次数最少的视频。

使用free命令或top命令可以获得内存信息。但具体来说,我如何获得使用的总内存?这样我就可以将其返回给 Python 函数以与内存阈值进行比较。

mur*_*uru 19

您还可以阅读free的信息来源,/proc/meminfo

~ head /proc/meminfo
MemTotal:        4039168 kB
MemFree:         2567392 kB
MemAvailable:    3169436 kB
Buffers:           81756 kB
Cached:           712808 kB
SwapCached:            0 kB
Active:           835276 kB
Inactive:         457436 kB
Active(anon):     499080 kB
Inactive(anon):    17968 kB
Run Code Online (Sandbox Code Playgroud)

Python 中,例如:

with open('/proc/meminfo') as file:
    for line in file:
        if 'MemFree' in line:
            free_mem_in_kb = line.split()[1]
            break
Run Code Online (Sandbox Code Playgroud)

将在free_mem_in_kb变量中以 KB 为单位为您提供可用内存。对于总内存类似的东西,您可以减去这些值(或将缓冲区、缓存等相加)。

您还可以创建文件中值的字典:

from collections import namedtuple
MemInfoEntry = namedtuple('MemInfoEntry', ['value', 'unit'])

meminfo = {}
with open('/proc/meminfo') as file:
    for line in file:
        key, value, *unit = line.strip().split()
        meminfo[key.rstrip(':')] = MemInfoEntry(value, unit)
Run Code Online (Sandbox Code Playgroud)

meminfo['MemAvailable'].value例如,然后使用 检索值。

  • @FedericoPoloni 请注意,`/proc/meminfo` 并不适用于人类(可以应对输出格式的变化),而是适用于其他程序(可能会因更改而中断)。就像 muru 笔记一样,Linux 内核开发人员努力不使用文档化的 API(其中 [/proc/meminfo](https://www.kernel.org/doc/Documentation/filesystems/proc.txt) 就是其中之一)破坏用户空间。此外,`/proc/meminfo` 的格式或多或少是键值对,因此可以在不破坏向后兼容性的情况下添加新字段。突破性的变化_可能_仍然发生,但我确实认为它们比“免费”的可能性要小。 (6认同)
  • +1 - 使用 /proc/meminfo 比尝试解析“free”的输出要优雅得多。诚然,free 的输出格式现在不太可能改变,但我最近有一个可怕的脚本中断并使服务无法运行,因为它依赖于 awking 不同命令的人类可读输出,其格式因实用程序而略有变化正在更新。 (4认同)
  • @carcer 为什么从长远来看,`/proc/meminfo` 的输出比 `free` 更不容易改变?选择似乎是在解析一个或另一个之间。 (4认同)
  • @FedericoPoloni 因为 Linus 讨厌破坏用户空间的更改,并且 `/proc/meminfo` 已经暴露给用户很长时间了。 (4认同)
  • @Carcer _“诚然,免费的输出格式现在不太可能改变......”_ - 实际上,正是 [发生在大约 4 年前](https://bugzilla.redhat.com/show_bug.cgi?id=1158828 )。如果可以的话,不要依赖解析这些工具的输出。 (3认同)

Rin*_*ind 10

已用内存百分比(不包括缓冲区和缓存):

free | awk 'FNR == 3 {print $3/($3+$4)*100}'
Run Code Online (Sandbox Code Playgroud)

对于您添加的问题:“7.2 GB 以上”,但我认为百分比可能更灵活。


为了扩展这一点,同样可以用于“可用内存百分比”:

free | awk 'FNR == 3 {print $4/($3+$4)*100}'
Run Code Online (Sandbox Code Playgroud)

awk是一个带有大量参数的模式扫描工具。FNR 是当前输入文件中的输入记录号。基本上是当前正在处理的行。因此,FNR 将扫描您想要的数字的第三行。$3 和 $4 指向第 3 和第 4 列。如果您想要数字本身,请使用:

free | awk 'FNR == 3 {print $3}'
free | awk 'FNR == 3 {print $4}'
Run Code Online (Sandbox Code Playgroud)

例子:

$ free
             total       used       free     shared    buffers     cached
Mem:      16419996   16144316     275680          0     447220   12589412
-/+ buffers/cache:    3107684   13312312
Swap:     16761852      38532   16723320
~$ free | awk 'FNR == 3 {print $3}'
3109056
~$ free | awk 'FNR == 3 {print $4}'
13311240
Run Code Online (Sandbox Code Playgroud)

如果你想要缓冲区和缓存:FNR=2。如果你想要交换,FNR=4。