在进行一些基准测试工作之前,如何释放 Linux 内核为其缓冲区和缓存消耗的内存 (RAM)?
请注意,这主要用于基准测试。清空缓冲区和缓存会降低性能!如果你在这里是因为你认为释放缓冲区和缓存是一件好事,那就去读一读Linux 吃了我的 RAM!. 简短的故事:空闲内存是未使用的内存是浪费的内存。
我认为这不是一个不常见的问题:一个进程分配了大量内存(可能是由于内存泄漏错误,因为您尝试处理一个不可行的大输入文件,或者其他什么)。RAM 已满,在某些时候 Linux 必须切换到交换。好吧,有时这只是最后的手段:如果我有一个昂贵的计算,我不想在最后我用完 RAM 时丢失数据。
然而,更常见的是(根据我的经验),内存消耗是不受限制的,通过一个流氓,也许是有缺陷的过程。即,我不仅最终将一些不太急需的数据移动到交换,而且操作系统被迫紧急交换数据负载。不幸的是,这不仅严重破坏了违规过程,而且可以使整个系统几乎陷入停顿(在带有 SSD 的机器上它不再那么糟糕了,但是 OTOH 它让我担心是否可以写入千兆字节和千兆字节的垃圾数据长期损害闪存单元)。
直到我发现问题并手动终止进程(实际上花了几分钟才让我自己登录到虚拟终端!),我的一半运行会话处于交换状态,我需要等待一段时间直到系统运行平稳再次。
这个问题有一个强大的解决方案:强制执行硬内存限制。但是在系统范围内执行此操作有时会杀死我仍然需要的进程,并且如果我必须ulimit在启动违规进程之前手动执行...好吧,我经常会忘记,直到为时已晚。
我会更满意的可能解决方案类型:
SIGSTOPped,所以我有时间弄清楚下一步该做什么。有没有办法获得这种行为或类似行为?
我知道这是一个蹩脚的问题,但我想了解为什么 CentOS 在某些进程停止时会消耗我的物理内存。假设我打开了一个 10GB 的文件,当我完成该过程并关闭文件时,它消耗了 10GB 的内存和缓冲区,然后 CentOS 仍然保留了我的 10GB 内存。
当我运行free命令时,它给了我以下详细信息:
11.4 GB are used
in buffers: 6336
in cached: 49168
-/+ buffers/cache: 11.4GB used
Run Code Online (Sandbox Code Playgroud)
当我尝试使用以下解决方案释放内存时:
设置 /proc/sys/vm/drop_caches 以清除缓存
-/+ 缓冲区/缓存:仍保留 11.4 GB。