it-swarm.cn

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

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

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

例如,现在,在关闭VirtualBox大约两个小时之后,我有1.6GB的空闲RAM和仍然是770MB的交换。

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

304
jfoucher

仅仅因为分配了交换,并不意味着它被“使用”。虽然系统监视器和顶部等程序会显示一些交换空间被分配(在您的示例中为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
163
popey

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

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

Sudo swapoff -a
Sudo swapon -a

或者作为单个命令

swapoff -a && swapon -a

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

401
SpamapS

您还可以将默认值设置为“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.1 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来监控和验证进度。

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/

140
Elijah Lynn

我发现清空交换对于磁盘速度慢且RAM有限的系统有很大帮助。当然,正如已经提到的,执行此操作的方法是运行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
52
Scott Severance

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

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

26
Erigami

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

0
Rory