我正在尝试在我的 C 代码中监视 Linux 系统的可用内存,以处理接近内存不足的情况,我尝试这样做
long available_mem = sysconf(_SC_AVPHYS_PAGES) * pagesize;
但看起来,如果我重复运行相同的代码,该值与
sysinfo()
报告的可用内存匹配,而不是 MemAvailable
中的 /proc/meminfo
报告的可用内存。这是预期的吗? (如果我实际上尝试使用接近 available_mem
的内存,系统将进行大量交换,因此看起来与实际可用内存不匹配。)
有没有办法在不解析
MemAvailable
中的字符串的情况下获取 /proc/meminfo
的当前值(或接近实时近似值)?
事实证明,GNU libc 文档是谎言......根据 libc 文档
sysconf (_SC_AVPHYS_PAGES)
_SC_AVPHYS_PAGES 返回的值是应用程序在不妨碍任何其他进程的情况下可以使用的内存量(假设 没有其他进程会增加其内存使用量)。返回值 _SC_PHYS_PAGES 或多或少是工作集的硬限制。 如果所有应用程序一起不断使用超过该数量 记忆系统有问题。
sysconf()
的实际源代码说
636 case _SC_AVPHYS_PAGES:
637 return __get_avphys_pages ();
__get_avphys_pages()
的定义为
328 long int
329 __get_avphys_pages (void)
330 {
331 struct sysinfo info;
332
333 __sysinfo (&info);
334 return sysinfo_mempages (info.freeram, info.mem_unit);
335 }
很明显,返回的值不是“应用程序在不妨碍任何其他进程的情况下可以使用的内存量”,它与
MemAvailable
中的 /proc/meminfo
匹配,而是来自内核系统调用 .freeram
中的 sysinfo()
量。
所以最终结果不是根据文档预期的,而是根据实际实现的预期。