但是,当我最后退出时在应用程序中,释放了2GB的RAM,但是仍然使用相同的交换空间。例如,现在,在关闭VirtualBox大约两个小时后,我有1.6GB的可用RAM,但仍然有770MB的空间。 swap。
如何告诉Ubuntu停止使用该交换并恢复使用RAM?
#1 楼
仅因为分配了交换,并不意味着它已被“使用”。尽管诸如系统监视器和top之类的程序将显示您分配的一些交换空间(在您的示例中为770MB),但这并不意味着系统正在积极地进行切入/切出。查找是否有任何东西正在换入/换出,您可以使用
vmstat
命令。让它运行几秒钟以稳定下来,并观察si
(交换)和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
评论
“不用担心”,直到我继续使用换出的某些应用程序为止。然后所有的地狱都松散了。
–törzsmókus
2014年5月13日在12:14
这篇文章没有回答这个问题。
–emchristiansen
2014年6月25日20:45在
问题的前提是基于误解。这篇文章解决了误解。
– Popey
2014年6月26日上午10:11
我没有看到误解,我对“已用”的含义存在分歧。您的意思是“已使用”是指主动换入/换出,而原始问题似乎与“已使用”一起提出,表示有一些数据已被换出,以后可能需要换回。有充分的理由想在发生交换大量其他内存的事件后刷新交换,实际上是抢占了用户知道的稍后会发生的主动交换(特别是如果稍后发生“交换”的同时磁盘由于其他原因而处于加载状态)。
– drfrogsplat
2014年10月10日下午2:09
运行占用大量内存的应用程序后,切换到其他应用程序时,它们不会出现干扰,这可能是由于被交换了。告诉系统取消交换尽可能多的数据的一种方法(随后是喝咖啡休息时间)比每次我Alt + Tab都要等待20秒更好。
– Mark K Cowan
2014年11月1日在11:18
#2 楼
Ubuntu底层的Linux内核会根据需要自动将这些页面从磁盘“交换”到RAM,因此通常我会说让它自然发生。但是,如果您真的觉得需要强制它(我可以看到一个场景,您可能想知道系统稍后会响应),您可以暂时禁用并重新启用swap
sudo swapoff -a
sudo swapon -a
OR或者作为单行
sudo swapoff -a; sudo swapon -a
请谨慎执行此操作,因为这可能会使系统不稳定,尤其是在RAM上已经很低的情况下。
评论
达到目的的是,交换被复制到ram。我猜您只需要确保在运行swapoff之前至少要有一定数量的swap用作免费ram,对吗?
– jfoucher
10年8月6日在8:22
交换未复制到RAM。它只是被禁用。在执行此操作之前,您应确保盒子没有交换。如果这样做,则内核将看到内存消失,并且OOM-Killer可能会开始任意终止应用程序。您没有理由需要像这样“清理”掉交换。 (请参阅我的其他评论):)
– Popey
10年8月6日在10:06
实际上,基本上可以将交换复制到ram中,或更准确地说,是可以在禁用交换之前将页面从磁盘交换回RAM中。
– SpamapS
2010年8月7日15:00
仅在某些进程仍需要页面时,才将页面复制到RAM。有时,交换页面属于一个已经完成的进程,内核并不希望立即从交换中删除这些页面。
– BrunoJCM
2013年12月30日14:57
这应该是正确的答案,因为这是将交换的页面返回到RAM然后清空交换内存的方法
–阿方索·吉门尼斯(AlfonsoJiménez)
16年5月5日在8:58
#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.7 GB的7.1,我使用的交换仅为576KB。 952MB以及所有系统都运行正常!
从Ubuntu SwapFAQ:
swappiness参数控制内核将进程移出物理内存的趋势。到交换磁盘上。因为磁盘比RAM慢得多,所以如果进程过于主动地移出内存,这可能导致系统和应用程序的响应时间变慢。
swappiness = 100告诉内核积极地将进程从物理内存中交换出去并将它们移到交换缓存中
以下是检查交换性,清空交换并将交换性更改为0的基本说明:
要检查交换性值:
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会使它转身完全关闭,如果您想要最低的交换算法,建议设置为1。来源:https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/
评论
我刚刚更新了答案,以包括设置交换性的永久方法。不确定如何获得如此高的评价,我猜没有人对其进行过测试。
–伊利亚·林恩(Elijah Lynn)
15年7月1日在13:23
在这个答案中对交换性的更多阅读=> askubuntu.com/a/103916/11929
–伊利亚·林恩(Elijah Lynn)
15年7月1日在13:24
我不确定当作者最初发布答案时该功能是否可用,但是对于ubuntu服务器安装而言,swappiness值设置为“ 60”,因为该环境具有一组不同的性能规范。 help.ubuntu.com/community/…
– Frito
16年6月6日在14:10
此设置对于控制交换大小非常有效。我的系统有16G RAM和16G交换。有时我正在运行虚拟机,而我的一些应用程序被换出了。关闭虚拟机时,RAM使用率下降,但是交换使用率保持不变,并且在更改应用程序时系统滞后。更改可交换性对我来说提高了性能。
– kapad
18年8月9日在5:46
这确实应该是公认的答案。对该问题及其解决方案,链接和保留交换内存的解决方案进行了详尽的解释,但首先要使它保持受控状态。很棒的东西。谢谢。 :)
– Jack_Hu
19年7月24日在22:28
#4 楼
我发现清空交换对磁盘速度慢和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 }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"
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
评论
太棒了,我一直在寻找这样的东西。为了更加安全起见,您可以提出一些数字和百分比,然后再问一下,以确保绝对安全。
–花药
17年1月27日,0:09
我已经更新了代码并创建了基于gist的要点.github.com / Jekis / 6c8fe9dfb999fa76479058e2d769ee5c
–杰基斯
17年8月24日在8:06
这是我在阅读所有技巧后得出的结论,例如应该在终止交换之前以某种方式确保确实有足够的RAM。谢谢您,先生,精彩的剧本。默认情况下应包含在Ubuntu中(不是在开玩笑,这确实是必须的。)
– Apache
17年8月28日在18:55
除非您在关闭交换时并且在重新启动之前运行任何新事物,否则它将没有足够的内存。
– barteks2x
17年11月2日在16:38
这取决于您有多少可用内存。如果有足够的可用内存来容纳所有交换和新进程,则没有问题。如果没有,那你是对的。
–斯科特遣散费
17年11月3日,12:56
#5 楼
经过几天的交换调整后,我得出的结论是内核应该留给自己的设备使用。它知道它在做什么,并且已经过优化,可以为您带来最佳体验。除非您有一个很好的理由要该磁盘,否则我会保留。
评论
我在交换中有一些东西,vmstat向我显示交换和交换发生了,Chrome延迟了,而我的CPU几乎没有用。足够好的理由,不是吗?
– Xerus
18年5月6日在15:27
肯定在某些情况下,某些在台式机上的交换会使它变得迟钝。 (不是在交换时,而是在有足够的RAM之后,很长一段时间之后)。因此,最好的答案是主观经验,在某些情况下会发生。
–克雷
19-09-26在20:02
#6 楼
如果交换空间已占用,则不会影响性能。唯一的性能损失是东西进出交换。如果什么都没有交换/交换,那么您不必担心任何事情。评论
是的,但是如果交换了某些内容,则会影响性能,因此会出现这个问题。
–定量
2015年2月3日在22:18
这确实是胡说八道,通常在HDD上或通常在比RAM慢的设备上进行大的后备交换-如果空间用完-交换现有的东西-例如互联网浏览器-然后您实际上是在速度较慢的设备上使用它的...
–jave.web
19年8月13日在13:22
通常在RAM空间用完之前交换内存。这由vm.swappiness参数控制。一旦交换空间被占用,当访问已换出到磁盘的内存页面时,将对性能产生影响。
– Lanoxx
20 Mar 16 '20 at 16:40
评论
最简单的方法是重新启动设备并节省应对ram和免费ram的时间,从而节省了笔记本电脑的功耗和CPU温度大的假设是,重新填充计算机上的所有内容所花费的时间要少于此。
至少,Ubuntu 16.04可以在需要交换很长时间之后就继续使用交换,因此即使不再需要交换依赖文件,也可以通过依赖交换文件来降低系统数量级。因此,手动干预可能是有用的。重新启动并非总是一种选择。