![难以置信的不情愿交换](https://linux22.com/image/1090965/%E9%9A%BE%E4%BB%A5%E7%BD%AE%E4%BF%A1%E7%9A%84%E4%B8%8D%E6%83%85%E6%84%BF%E4%BA%A4%E6%8D%A2.png)
我的笔记本电脑运行 Ubuntu 16.04 时出现了一个奇怪的问题。我有 8 GiB RAM 和 10 GiB 交换区。它运行正常,程序从 SSD 快速交换,交换的内存主要是内存泄漏,而且忘记了 mmap……但后来有东西破坏了它。我不知道是什么,我没有立即注意到它。但现在,它交换的次数非常少。
交换空间几乎是空的,我的 RAM 使用率可以达到 95%,而交换空间只占了 5%。如果 RAM 满了,它很少会交换出任何东西,而是会冻结,有时它会在终止程序后恢复,但太频繁了,我不得不进行硬重置。
我已经检查了 swappiness 属性,但它被设置为 60,而将其设置为 100 则没有任何变化。我将 Ubuntu 升级到 17.04 版本,但没有帮助。
如果我运行一个占用大量内存并积极使用它的进程,它似乎会换出这个进程的内存(刚刚分配了内存!),使进程很快再次冻结,然后很快取回内存,陷入永无止境的循环。几乎没有任何换出的内存会长时间保持换出状态,尽管我很确定有足够的泄漏内存和未使用的程序可以交换。
知道可能哪里出了问题吗?
答案1
已检查sysctl -a | grep swappiness
确保交换性按要求设置,并且swapon
确保交换分区已安装,但仍有可能由于某种原因交换分区被不正确格式化。
可以通过以下方法纠正
sudo swapoff -a
sudo /sbin/mkswap /dev/hda8
sudo swapon -a
其中/dev/hda8
应该替换为怀疑有损坏的分区或交换文件。
该答案的来源包括https://help.ubuntu.com/community/SwapFaq在“为什么我的交换分区未被使用?”部分中,以及未使用交换区
答案2
事实证明,问题完全不同。一个始终在运行的程序泄漏了共享内存。共享内存无法交换,因此泄漏的内存始终位于 RAM 中。
该内存属于图形环境运行所需的某个程序(可能是英特尔显卡驱动程序),因此它始终在运行,并且只在重新启动时清除。这导致泄漏的共享内存累积,该共享内存附加到从未重新启动的程序,无法交换,只留下很少的内存用于可以交换的其他程序。
由于这个问题是某个关键软件包中的错误,因此无法以任何好的方式妥善修复。Ubuntu 18.04 一发布我就安装了它,问题没有出现,所以它可能已经修复了。