Answers:
您可以尝试更改“ swappiness”值:
什么是交换性,我该如何更改?
swappiness参数控制内核将进程移出物理内存并移入交换磁盘的趋势。因为磁盘要比RAM慢得多,所以如果进程过于主动地移出内存,则可能导致系统和应用程序的响应时间变慢。
swappiness的值可以在0到100之间
swappiness = 0指示内核尽可能避免将进程从物理内存中交换出去。对于内核版本3.5和更高版本,它将禁用可交换性。
swappiness = 100告诉内核从物理内存中积极地进行进程交换,并将它们移至交换缓存
Ubuntu中的默认设置为swappiness = 60。降低swappiness的默认值可能会提高典型Ubuntu桌面安装的整体性能。建议将swappiness的值设置为10,但可以随时尝试。注意:Ubuntu服务器安装对桌面系统的性能要求不同,默认值60可能更合适。
检查交换值
cat /proc/sys/vm/swappiness
更改swappiness值可以进行临时更改(重新引导时丢失),其值为10。
sudo sysctl vm.swappiness=10
要使更改永久生效,请使用您喜欢的编辑器编辑配置文件:
gksudo gedit /etc/sysctl.conf
搜索vm.swappiness并根据需要更改其值。如果vm.swappiness不存在,则将其添加到文件末尾,如下所示:
vm.swappiness=10
保存文件并重新启动。
您也可以签出:https : //askubuntu.com/a/103916/54187
sudo sysctl --load=/etc/sysctl.conf
在编辑文件以应用更改后运行
您的问题有几个不同方面。
首先,您对“免费”的定义是什么。实际上,它并不像在Linux(或任何现代操作系统)中听起来那样简单。
Linux如何使用RAM(非常简化)
每个应用程序都可以使用您的一些内存。Linux将所有其他未占用的内存(最后几个Mb除外)用作“缓存”。这包括页面缓存,inode缓存等。这是一件好事-它有助于加快堆的速度。缓存可以极大地加快写入磁盘和从磁盘读取的速度。
理想情况下,您有足够的内存来存储所有应用程序,并且仍然需要数百Mb的缓存空间。在这种情况下,只要您的应用程序不增加其内存使用量,并且系统不为获取足够的缓存空间而努力,就无需进行任何交换。
一旦应用程序要求更多的RAM,它就会进入缓存使用的某些空间,从而缩小缓存。取消分配缓存既便宜又容易,只需简单地实时完成-位于缓存中的所有内容只是磁盘上已有内容的第二个副本,因此可以立即释放,或者我们可以无论如何,不得不在接下来的几秒内刷新到磁盘。
这不是Linux特有的情况-所有现代操作系统都以这种方式工作。不同的操作系统可能仅以不同的方式报告可用的RAM:有些操作系统将缓存作为他们认为“空闲”的一部分,而有些则可能没有。
当您谈论空闲RAM时,包含缓存会更有意义,因为它实际上是免费的-如果任何应用程序请求它,它就可用。在Linux上,该free
命令同时以两种方式报告它-第一行在“使用的RAM”列中包括缓存,第二行在free列中包括缓存(和缓冲区)。
Linux如何使用交换(甚至更简化)
一旦您用完了足够的内存以至于没有足够的内存来平滑运行的缓存,Linux可能会决定从RAM重新分配一些未使用的应用程序内存以进行交换。
它不会根据明确的界限执行此操作。这不是您达到一定的分配比例,然后Linux开始交换。它具有相当“模糊”的算法。它考虑了很多事情,最好用“内存分配有多少压力”来描述。如果分配新内存的压力很大,那么将增加交换一些内存以腾出更多空间的机会。如果“压力”较小,则将减少这些机会。
您的系统具有“ swappiness”设置,可帮助您调整“压力”的计算方式。通常不建议您完全更改它,我也不建议您更改它。交换总体而言是一件好事-尽管在某些极端情况下,交换会损害性能,但是如果您查看系统的整体性能,则对许多任务来说都是净收益。如果您减少了交换性,则可以使高速缓存的存储量比原先的压缩量稍微减少一点,即使它可能确实有用。对于您在交换时遇到的任何问题,这是否是一个足够好的折衷方案,完全取决于您自己。您应该只知道自己在做什么,仅此而已。
有一种众所周知的情况,即交换确实会损害台式机系统上的感知性能,即在长时间闲置并在IO中处理大量后台进程(例如,隔夜备份)运行。这是非常明显的迟缓,但不足以证明完全关闭交换是合理的,并且在任何操作系统中都很难防止。关闭交换,可能不会发生备份/病毒扫描后这种最初的缓慢现象,但系统可能会整天运行缓慢。这也不是仅限于Linux的情况。
在选择要交换到磁盘的内容时,系统会尝试选择实际未使用的内存-读取或写入。它有一个非常简单的算法来计算此参数,大多数情况下,算法效果很好。
如果您有一个拥有大量RAM的系统(在撰写本文时,对于典型的Linux发行版来说8GB是一个巨大的数量),那么您将很少遇到根本需要交换的情况。您甚至可以尝试关闭交换。我从不建议这样做,只是因为您不知道什么时候有更多的RAM可以使您免于某些应用程序崩溃的麻烦。但是,如果您知道自己将不需要它,则可以做到。
但是如何交换可以加快我的系统速度?难道不减慢速度吗?
将数据从RAM传输到交换的操作很慢,但是只有在内核完全确定总体收益将超过此收益时才采取此操作。例如,如果您的应用程序内存已增加到几乎没有缓存的状态,并且由于这个原因您的I / O效率非常低,那么实际上通过释放一些内存,甚至可以使系统速度大大提高,甚至交换数据以释放数据的初始费用后。
如果您的应用程序实际请求的内存比您实际拥有的更多,这也是最后的选择。在这种情况下,必须进行交换以防止出现内存不足的情况,这种情况通常会导致应用程序崩溃或被强制终止。
交换仅与系统性能不佳的时间相关,因为它发生在可用RAM耗尽的时候,即使没有交换,这也会减慢系统速度(或使其不稳定)。因此,为了简化起见,发生交换是因为您的系统陷入了瘫痪,而不是相反。
交换数据后,什么时候可以再次输出?
从交换中传输数据(至少对于传统硬盘而言)与将数据放入交换中一样耗时。因此,可以理解的是,您的内核将不愿从交换中删除数据,尤其是在未实际使用(即读取或写入)的情况下。如果您有数据在交换中并且没有被使用,那么保留在交换中实际上是一件好事,因为它为正在使用的其他事物留出了更多的内存,有可能加速您的系统。
free -m
。
设置swappiness值并非在每种情况下都有效。如果它适合您,那就太好了。如果没有,我编写了一个脚本,通过将其关闭然后重新打开来定期清除交换。
如果不小心,切换交换会有点冒险。如果你没有足够的可用内存来保存在RAM中的一切再加上一切都在交换,试图禁用掉会导致系统停止响应。我的脚本首先检查是否有足够的可用RAM(这需要做一些事情,因为实际的可用RAM数量与free
报告为可用的空闲RAM不同),然后仅在切换交换时才进行切换。但是,如果您的RAM不足,请不要在脚本运行时启动另一个主要进程。这里是:
#!/bin/bash
# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8
# Calculate how much memory and swap is free
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)"
# Do the work
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
echo "Freeing swap..."
swapoff -a
swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi
您必须以root用户身份运行此脚本(例如,使用sudo
)。该脚本不会使您的系统无响应;如果您的RAM不足,它将拒绝切换交换。我已经使用该脚本将近五年没有问题了。
通常,在当今的系统上,交换未使用。以我的经验,长时间运行而无需大量操作的进程被linux转换为交换。
这会使一些受影响的程序运行缓慢。
:如果你有大量的RAM的自由,你可以通过运行命令切换交换关闭
swapoff -av
(你需要sudo
的权利吧。)
如果你不喜欢掉了,你可以打开它,使用对称的命令:
swapon -av
(再次sudo
要求)。
一旦将交换用于程序,在程序的整个生命周期中它往往会保持映射状态。许多程序具有很少使用的代码(和数据)。一旦内存被换出,就不太可能被换入。
强制这些页面进入内存的一种方法是关闭交换设备。如果有两个,则可以关闭其中一个,然后重新打开,然后关闭第二个。如果确实需要交换,它将在设备之间移动。您可以只关闭交换设备(或文件),但是如果您确实需要交换空间,则可能会发生麻烦。
除了内存中的常规内容外,tempfs还使用交换空间,并且将像其余的内存一样交换出去。如果您运行需要大量临时磁盘的内容,则可能会强制换出页面。一旦创建,临时文件可能会在几分钟后不再使用,并且很适合移动到交换设备。
您可以在紧急情况下将文件用作交换设备。如果您暂时需要额外的交换空间,这将很有用。
我编辑了Scott Severance的脚本以匹配较新的free版本,其中已经包含总可用内存字段。
#!/bin/bash
free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"
echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
echo "Freeing swap..."
sudo swapoff -a
sudo swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi
free -m
,top -b 1