当前位置: 首页>>技术问答>>正文


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

, , ,

问题描述

当我打开RAM-intensive应用程序(VirtualBox设置为2GB的RAM)时,通常会使用一些交换空间,具体取决于当时我还打开了哪些内容。

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

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

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

最佳解决方法

只是因为交换分配,并不意味着它是’used’。虽然像系统监视器和顶部的程序会显示一些正在分配的交换空间(在您的示例中为770MB)并不意味着系统正在主动交换输入/输出。

要确定是否有任何内容交换,可以使用vmstat命令。让它运行几秒钟以安定下来并观察si(swapin)和so(换出)列。如果什么都没有发生,那么没有理由担心。

这里是运行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

次佳解决方法

Ubuntu底层的Linux内核会根据需要自动将”swap in”这些页面从磁盘传输到RAM,所以一般而言,我会说让它自然发生。

但是,如果您真的觉得需要强制执行它,(我可以看到一个您想知道系统将在以后作出响应的情况),您可以暂时禁用并re-enable交换

sudo swapoff -a
sudo swapon -a

或者作为单个命令

swapoff -a && swapon -a

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

第三种解决方法

您也可以将您的”swappiness”值设置为默认值60,这样交换不会增长太大。为什么当推荐值为10时,运输默认值设置为60让我感到困惑。 From the Ubuntu SwapFAQ

The default setting in Ubuntu is swappiness=60. Reducing the default value of swappiness will probably improve overall performance for a typical Ubuntu desktop installation. A value of swappiness=10 is recommended, but feel free to experiment.

通过将此值更改为10甚至0,您可以为缓慢驱动的较旧系统添加显著且可感知的速度提升。将此值设置为0不会为Linux内核3.4和更低版本关闭交换,但是如果您希望将其保留在其最低设置*上,则它将使用值1。

我没有理由不把它设置为0,因为任何碰到磁盘的东西都比RAM慢。我有8个虚拟内核,一个快速SSD& 8 GB的内存和我的交换设置为0.截至此刻,我有3个虚拟机正在运行,我的内存使用率是7.7 GB的7.1,我使用的交换只有在576KB的952MB,并且所有系统运行平稳!

From the Ubuntu SwapFAQ

The swappiness parameter controls the tendency of the kernel to move processes out of physical memory and onto the swap disk. Because disks are much slower than RAM, this can lead to slower response times for system and applications if processes are too aggressively moved out of memory.

  1. swappiness can have a value of between 0 and 100
  2. swappiness=0 tells the kernel to avoid swapping processes out of physical memory for as long as possible
  3. swappiness=100 tells the kernel to aggressively swap processes out of physical memory and move them to swap cache

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

要检查swappiness值:

cat /proc/sys/vm/swappiness

临时设置交换为0(as suggested by SpamapS):

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

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#重启系统

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

第四种方法

我发现,清空交换对于磁盘速度慢,内存有限的系统有很大的帮助。当然,如前所述,执行此操作的方法是运行sudo swapoff -a; sudo swapon -a。这里的问题是,如果内存不足,那么会造成各种问题。

我写了一个脚本,我称之为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几天之后,我得出结论认为内核应该留给自己的设备。它知道它在做什么,并且它已经过优化,可以为您提供最佳体验。

除非你有一个非常好的理由要求恢复这个磁盘,否则我会放弃它。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/146.html,未经允许,请勿转载。