我启动了一些占用大量内存的程序,现在一切都变得非常滞后。我猜所有应用程序的内存都已交换,以便为内存密集型进程释放一些空间,现在访问时所有内容都会缓慢返回到 RAM。
有没有办法明确地将所有可能的数据从交换移回 RAM?或者可能不是全部,而是某些特定进程的数据?
答案1
我建议允许在实际使用的内容中进行正常的 Linux 内存控制交换,就像它们被使用一样。
我唯一能想到的就是关闭交换,然后再打开
sudo swapoff -a
sudo swapon -a
这假设您有足够的备用物理内存来包含交换中的所有内容......
答案2
你可以调整它,使其回显 0 到 100 之间的某个数字/proc/sys/vm/swappiness
。
此控件用于定义内核交换内存页面的积极程度。值越高,积极程度就越高,较低的值会减少交换量。0 值指示内核在可用页面和文件支持页面的数量低于区域中的高水位标记之前不启动交换。
默认值为 60。
答案3
Linux 在内存管理方面做得很好,你不应该妨碍它。vm.swappiness 设置(前面提到过)不会妨碍它。如果你以其他方式做事,你更有可能遇到奇怪的问题。
您启动了什么程序,导致内存占用如此之大?可以调整吗?如果它没有自己的内存限制指令,您也可以查看 ulimit。
答案4
如果您有足够的内存供所有应用程序使用,可以将 swappiness 设置为 0,这样就不会交换出内容。例如,qemu-kvm 是 VMM 交换出的一个主要目标,因为它“似乎”大部分时间都处于空闲状态。我曾看到 qemu-kvm 内存中高达 80% 的内存被写入交换。在 qemu-kvm 中运行的 VM 将变得几乎无响应,因为它们的交换空间不足(尽管客户机不知道发生了什么)。客户机 VM 会认为它的性能非常出色,尽管实际上它运行得非常糟糕。当我将一堆 VM“唤醒”并开始执行操作时,即使在具有足够快速内存和磁盘的企业级硬件上,它也可以将平均负载飙升至 30 以上。我猜这是开箱即用的 qemu-kvm 设计的一个缺陷。
希望这对某人有帮助。