很多人都用ps_mem.py脚本以了解进程使用了多少 RAM。在这种情况下,脚本的结果是这样的:
---------------------------------
278.4 MiB
=================================
所以整个系统使用 278.4 MiB,但free
表达的内容却完全不同:
# free
total used free shared buff/cache available
Mem: 1.8G 756M 980M 57M 131M 1.0G
Swap: 2.5G 11M 2.5G
Total: 4.3G 767M 3.4G
所以这里系统使用756M。这不是缓存,也不是因为临时文件。
我也尝试过:
# echo "3" > /proc/sys/vm/drop_caches
为了看看是否会有什么不同,但什么都没有改变。
那么如何释放由于某种原因被占用的页面呢?我不知道什么以及为什么使用该空间,也不知道如何恢复它。目前唯一的选择是重新启动机器。
这是一张照片,您可以在其中看到剩下的进程。您能据此解释一下 RAM 利用率吗?
答案1
由于虚拟内存管理的复杂性(所有这些都是为了使用尽可能少的内存量),实际上不可能确定实际使用了多少 RAM。看这个链接。
因此,无论您的 python 脚本报告什么,它都不会反映实际状态。
缓存的内容实际上是免费的,不用担心(删除缓存实际上并不会释放任何内容,它只是刷新内核在需要时将重用的页面)。
免费报告的是内核对系统的了解。这不可能是错的,因为内核是为内存提供服务的。但它并不等于每个单独进程已用内存的总和,因为有多种机制:共享内存(库)、写时复制内存(分叉后,只有所触及的页面实际上是重复的)、未初始化(归零) out)页面,加载的程序代码(也是共享的),与RAM不对应的虚拟内存,换出页面,进程间共享内存,内核内存(由内核模块保留),内核内存(主内核本身,包括页表),等等...
重点是...如果内核报告页面已使用,则它们必须用于某些用途。如果你想释放一些内存,它必须来自某个地方:每个正在运行的进程、模块和内核本身可能有机制来释放一些他们现在可能不需要的内存,并且稍后会重新加载(这取决于应用程序编写者是否看到需要实现所需的复杂性来做到这一点)。但如果你确实需要新的内存,内核会处理它。如果您请求更多内存,它会删除文件系统缓存,如果您正在使用它,它会推送陈旧的页面进行交换,如果您使用 zram 或类似的东西,它会压缩页面......最后,如果您确实空间用完了,OOM Killer会找kill一些东西来防止系统死机。但这个过程太复杂了,你无法认为自己比内部发生的事情更了解。