当我打开一个占用大量 RAM 的应用程序(VirtualBox 设置为 2GB RAM)时,通常会使用一些交换空间,具体取决于我当时打开的其他内容。
然而,当我退出最后一个应用程序时,2GB 的 RAM 被释放,但交换空间使用量仍然相同。
例如,现在,关闭 VirtualBox 大约两个小时后,我有 1.6GB 的可用 RAM 并且仍有 770MB 的交换空间。
我怎样才能告诉 Ubuntu 停止使用该交换并恢复使用 RAM?
答案1
Ubuntu 底层的 Linux 内核将根据需要自动将这些页面从磁盘“交换”到 RAM,所以一般来说,我认为让它自然发生就好。
但是,如果你真的觉得需要强制执行,(我可以看到你想知道系统稍后是否会响应的情况)你可以暂时禁用并重新启用交换
sudo swapoff -a
sudo swapon -a
或者作为一行
sudo swapoff -a; sudo swapon -a
执行此操作时要小心,因为这可能会使系统不稳定,尤其是在 RAM 不足的情况下。请确保系统中有足够的可用 RAM,否则您可能无法释放交换空间,并且 OOM-Killer 最终会终止您的某些进程。
请注意,这swapoff
可能需要一段时间。如果您有大量交换空间需要交换,则尤其如此。
答案2
分配了交换空间并不意味着它正在被“使用”。虽然系统监视器和 top 等程序会显示部分交换空间已被分配(在您的示例中为 770MB),但这并不意味着系统正在积极地进行交换。
要查看是否有任何内容正在交换,您可以使用该vmstat
命令。让它运行几秒钟,然后观察si
(swapin) 和so
(swapout) 列。如果没有发生任何事情,则无需担心。
这是运行的输出vmstat 1
,您可以看到我的机器根本没有交换。
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 78588 230788 9596 72196 0 0 0 0 543 652 12 6 78 0
0 0 78588 230780 9596 72196 0 0 0 0 531 410 1 0 99 0
0 0 78588 230796 9596 72196 0 0 0 0 300 335 1 1 97 0
1 0 78588 230788 9608 72224 0 0 40 0 737 762 4 4 84 8
5 0 78588 230788 9608 72224 0 0 0 0 415 385 9 3 84 0
0 0 78588 230540 9616 72224 0 0 0 44 611 556 55 5 31 0
0 0 78588 230532 9616 72224 0 0 0 0 574 662 1 6 89 0
然而在这里top
你可以看到我已经分配了交换空间:-
Mem: 475236k total, 245076k used, 230160k free, 9720k buffers
Swap: 491512k total, 78588k used, 412924k free, 72476k cached
答案3
您还可以将“swappiness”值从默认值 60 改为其他值,这样交换量一开始就不会变得太大。为什么推荐值为 10,而运输默认值却设置为 60,这让我很困惑。来自 Ubuntu SwapFAQ:
Ubuntu 中的默认设置是 swappiness=60。降低 swappiness 的默认值可能会提高典型 Ubuntu 桌面安装的整体性能。建议使用 swappiness=10,但请随意尝试。
通过将此值更改为 10 甚至 0,您可以为驱动器较慢的旧系统增加显著且可察觉的速度提升。将此值设置为 0 不会关闭 Linux 内核 3.4 及以下版本的交换,但对于 3.5+ 版本,它会关闭交换,因此如果您想将其保持在最低设置,则需要使用值 1*。
我认为没有理由不将其设置为 0,因为任何访问磁盘的东西都比 RAM 慢。我有 8 个虚拟核心、一个快速 SSD 和 8 GB 内存,我的交换设置为 0。截至目前,我有 3 个虚拟机正在运行,我的内存使用量为 7.1 GB(共 7.7 GB),我使用的交换仅为 576KB(共 952MB),所有系统运行顺畅!
swappiness 参数控制内核将进程从物理内存移出并移至交换磁盘的趋势。由于磁盘比 RAM 慢得多,因此如果进程过于频繁地移出内存,这会导致系统和应用程序的响应时间变慢。
- swappiness 的值可以在 0 到 100 之间
- swappiness=0 告诉内核尽可能避免将进程交换出物理内存
- swappiness=100 告诉内核积极地将进程从物理内存中交换出来,并将其移至交换缓存
以下是检查交换能力、清空交换能力以及将交换能力更改为 0 的基本说明:
要检查 swappiness 值:
cat /proc/sys/vm/swappiness
要暂时将交换设置为 0(根据 SpamapS 的建议):
这将清空您的交换并将所有交换转移回内存。首先通过查看 gnome-system-monitor 的资源选项卡确保您有足够的可用内存,您的可用内存应该大于您使用的交换。此过程可能需要一段时间,请使用 gnome-system-monitor 监视并验证进度。
sudo swapoff --all
要将新值设置为 0:
sudo sysctl vm.swappiness=0
要重新打开交换:
sudo swapon --all
要将 swappiness 永久设置为 0:
sudoedit /etc/sysctl.conf
- 添加此行
vm.swappiness = 0
sudo shutdown -r now
# 重启系统
* 在内核版本 3.5+ 中,将 swappiness 设置为 0 会将其完全关闭;如果您想要最低的 swappiness 算法,建议将其设置为 1。来源:https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/
答案4
在搞砸了交换性几天来,我得出的结论是,内核应该由它自己决定。它知道自己在做什么,并且经过优化,可以为您提供最佳体验。
除非你真的有充分的理由想要回那个磁盘,否则我会把它留在那里。