在linux上,我应该如何根据/ proc/mem中的信息计算可用内存量?

kdt*_*kdt 5 linux memory

/ proc/mem中有很多字段:我知道我不能只使用"MemFree",因为实际上缓存了大量内存.所以问题是,我如何计算可用内存量?

假设:

  • 系统配置为没有交换空间.
  • 我对"空闲内存"的定义是当malloc达到零时malloc开始失败.

And*_*lum 7

如果你说系统配置没有交换空间,那么可以通过添加/ proc/meminfo中的"MemFree","Buffers"和"Cached"值来计算可用内存量.

这正是命令'free -m'在' - /+ buffers/cache'行中的'free'下显示的内容.

在Python中,我将按如下方式实现:

 with open('/proc/meminfo', 'rt') as f:
        vals = {}
        for i in f.read().splitlines():
            try:
                name, val = i.split(':')
                vals[name.strip()] = int(val.split()[0])
            except:
                pass

 memfree = vals['MemFree'] + vals['Buffers'] + vals['Cached']
Run Code Online (Sandbox Code Playgroud)

这将给出以千字节为单位的值.

正如其他人所说,malloc不太可能永远返回null.Linux将进行全面分配,当您开始使用真正无法找到的页面时,OOM杀手将会开始.


sou*_*rge 5

我感觉你走错了路.你想用这些信息做什么?你想看看你是否可以为下一次操作分配足够的内存?如果是这样,您可以调用malloc并检查其返回值.如果它返回null,则内存不可用.

请注意,内存是一种高度动态的资源.即使您打开/关闭/proc文件系统的行为也可能导致内存开销.即使以某种方式做管理,让你可以与分配量malloc(),没有人可以保证的相同内存容量可在分秒尝试分配它.


chi*_*tom 4

使用卢克源!

free.c ——“free”命令行实用程序
sysinfo.c的源代码——请参阅方法 meminfo() 以获取如何读入 /proc/meminfo 的示例。

虽然读取 /proc 非常简单,但能够预测 malloc 是否会失败却并不容易。正如其他人提到的问题,例如过度使用、混乱的问题。标准的方法是尝试分配你需要的东西,如果你不能让它优雅地失败或者用更少的东西工作。

如果你有足够的时间,这个系列的文章值得一读:每个程序员都应该了解的内存知识。