当我打开一个占用大量RAM的应用程序(VirtualBox设置为2GB RAM)时,通常会使用一些交换空间,具体取决于我当时打开的内容。
但是,当我退出上一个应用程序时,将释放2GB的RAM,但是保留了相同的交换空间。
例如,现在,在关闭VirtualBox大约两个小时后,我有1.6GB的可用RAM和770MB的可用交换空间。
如何告诉Ubuntu停止使用该交换并恢复使用RAM?
当我打开一个占用大量RAM的应用程序(VirtualBox设置为2GB RAM)时,通常会使用一些交换空间,具体取决于我当时打开的内容。
但是,当我退出上一个应用程序时,将释放2GB的RAM,但是保留了相同的交换空间。
例如,现在,在关闭VirtualBox大约两个小时后,我有1.6GB的可用RAM和770MB的可用交换空间。
如何告诉Ubuntu停止使用该交换并恢复使用RAM?
Answers:
仅因为分配了交换,并不意味着它已被“使用”。尽管诸如系统监视器和top之类的程序将显示分配了一些交换空间(在您的示例中为770MB),但这并不意味着系统正在积极地进行交换。
要查明是否有任何内容要换入/换出,可以使用vmstat
命令。让它运行几秒钟以稳定下来,观察si
(swapin)和so
(swapout )列。如果什么也没有发生,那么就没有理由担心了。
这是running的输出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内核会根据需要自动将这些页面从磁盘“交换”到RAM,因此总的来说,我想让它自然发生。
但是,如果您确实需要强制执行此操作(我可以看到一种情况,您可能想知道系统稍后会响应),则可以暂时禁用并重新启用交换
sudo swapoff -a
sudo swapon -a
或者作为一行
swapoff -a; swapon -a
请小心执行此操作,因为这可能会使系统不稳定,尤其是在RAM不足的情况下。
您还可以将默认值“ 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.7 GB的7.1,我使用的交换仅为576KB。 952MB,所有系统运行正常!
swappiness参数控制内核将进程移出物理内存并移入交换磁盘的趋势。因为磁盘要比RAM慢得多,所以如果进程过于主动地移出内存,则可能导致系统和应用程序的响应时间变慢。
- swappiness的值可以在0到100之间
- swappiness = 0告诉内核尽可能避免将进程从物理内存中交换出来
- swappiness = 100告诉内核从物理内存中积极地进行进程交换,并将它们移至交换缓存
以下是检查交换性,清空交换并将交换性更改为0的基本说明:
要检查swappiness值:
cat /proc/sys/vm/swappiness
要将swap临时设置为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/
我发现清空交换对磁盘速度慢且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