如果有空闲RAM,如何清空交换?

当我打开一个RAM密集型应用程序(VirtualBox设置为2GB的RAM)时,通常会使用一些交换空间,具体取决于我当时打开的其他内容。

但是,当我退出最后一个应用程序时,2GB的RAM被释放,但仍然使用相同的交换空间。

例如,现在,关闭VirtualBox大约两个小时后,我有1.6GB的可用内存,仍然有770MB的交换空间。

如何告诉Ubuntu停止使用该交换并恢复使用RAM?

仅仅因为交换被分配,并不意味着它被“使用”。 虽然像system monitor和top这样的程序会显示你分配的一些交换空间(在你的例子中为770MB),这并不意味着系统正在主动交换。

要查明是否有任何内容正在进行交换,您可以使用vmstat命令。 让它运行几秒钟以稳定并观察si (swapin)和so (swapout)列。 如果什么也没发生,那就没有理由担心。

这是运行vmstat 1的输出,在那里你可以看到我的机器根本没有交换。

 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- rb 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 

Ubuntu底层的Linux内核会根据需要自动将这些页面从磁盘“交换”到RAM中,所以一般来说我会说让它自然发生。

但是,如果你真的觉得你需要强制它,(我可以看到你想知道系统将在稍后响应的场景)你可以暂时禁用并重新启用交换

 sudo swapoff -a sudo swapon -a 

或者作为单个命令

 swapoff -a && swapon -a 

小心这样做,因为你可能会使系统不稳定,特别是如果RAM已经很低。

您还可以将默认值设置为“swappiness”值,这样交换开始时就不会变得如此之大。 当推荐值为10时,为什么出货默认设置为60,这让我很困惑。 来自Ubuntu SwapFAQ :

Ubuntu中的默认设置是swappiness = 60。 减少swappiness的默认值可能会提高典型Ubuntu桌面安装的整体性能。 建议使用swappiness = 10的值 ,但可以随意进行实验。

通过将此值更改为10或甚至0,您可以为具有慢速驱动器的旧系统添加显着且可感知的速度提升。 将此值设置为0不会为Linux内核3.4及更低版本关闭交换,但如果要将其保持在最低设置*,则需要使用3.5+。

我认为没有理由不将其设置为0,因为任何击中磁盘的东西都比RAM慢。 我有8个虚拟内核,一个快速SSD和8 GB内存,我的交换设置为0.到目前为止,我有3个虚拟机在运行,我的内存使用量为7.7 GB,我使用的交换仅为576KB 952MB,所有系统都运行顺畅!

来自Ubuntu SwapFAQ :

swappiness参数控制内核将进程从物理内存移出到交换磁盘上的趋势。 因为磁盘比RAM慢得多,所以如果进程过于积极地从内存中移出,这可能会导致系统和应用程序的响应时间变慢。

  1. swappiness的值可以介于0到100之间
  2. swappiness = 0告诉内核尽可能长时间地避免将进程从物理内存中交换出来
  3. swappiness = 100告诉内核积极地将进程交换出物理内存并将它们移动到交换缓存

以下是检查swappiness,清空交换以及将swappiness更改为0的基本说明:

要检查swappiness值:

 cat /proc/sys/vm/swappiness 

要暂时将交换设置为0( 如SpamapS所示 ):

这将清空您的交换并将所有交换转移回内存。 首先通过查看gnome-system-monitor的资源选项卡确保您有足够的可用内存,您的可用内存应该大于您使用的交换。 此过程可能需要一段时间,请使用gnome-system-monitor监视和validation进度。

 sudo swapoff --all 

要将新值设置为0:

 sudo sysctl vm.swappiness=0 

要重新打开交换:

 sudo swapon --all 

要将swappiness永久设置为0:

  1. sudoedit /etc/sysctl.conf
  2. 添加此行vm.swappiness = 0
  3. sudo shutdown -r now #re restart system

*使用内核版本3.5+设置swappiness为0确实完全关闭它,如果你想要最低的swappiness算法,建议设置为1。 来源: https : //www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

我发现清空交换对于磁盘速度慢且RAM有限的系统有很大帮助。 当然,正如已经提到的,执行此操作的方法是运行sudo swapoff -a; sudo swapon -a sudo swapoff -a; sudo swapon -a 。 这里的问题是,如果没有足够的RAM,这样做会导致各种问题。

我写了一个脚本,我称之为toggle_swap ,这对我来说已经有好几年了。 在实际禁用交换之前,它会检查足够的可用RAM。 这里是:

 #!/bin/bash free_data="$(free)" mem_data="$(echo "$free_data" | grep 'Mem:')" free_mem="$(echo "$mem_data" | awk '{print $4}')" buffers="$(echo "$mem_data" | awk '{print $6}')" cache="$(echo "$mem_data" | awk '{print $7}')" total_free=$((free_mem + buffers + cache)) used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')" echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)" if [[ $used_swap -eq 0 ]]; then echo "Congratulations! No swap is in use." elif [[ $used_swap -lt $total_free ]]; then echo "Freeing swap..." sudo swapoff -a sudo swapon -a else echo "Not enough free memory. Exiting." exit 1 fi 

在使用swappiness几天后,我得出的结论是内核应该留给它自己的设备。 它知道它在做什么,并且它经过优化,可以为您提供最佳体验。

除非你有充分的理由想要恢复该磁盘,否则我会留下它。

如果您的交换空间被占用,它不会影响性能。 唯一的性能损失是进入/退出交换的东西。 如果没有交换/换出任何东西,那么你不必担心任何事情。