即使我有足够的可用内存,为什么要使用交换?

我认为交换的全部内容是当RAM已满时充当临时存储安全网但我的交换分区一直被使用,即使我有时有3GB的可用RAM。 这是正常的吗?

您可以尝试更改“swappiness”值:

从Ubuntu的交换常见问题解答 :

什么是swappiness,我该如何改变它?

swappiness参数控制内核将进程从物理内存移出到交换磁盘上的趋势。 因为磁盘比RAM慢得多,所以如果进程过于积极地从内存中移出,这可能会导致系统和应用程序的响应时间变慢。

  1. swappiness的值可以介于0到100之间

  2. swappiness = 0告诉内核尽可能长时间地避免将进程从物理内存中交换出来

  3. swappiness = 100告诉内核积极地将进程交换出物理内存并将它们移动到交换缓存

Ubuntu中的默认设置是swappiness = 60。 减少swappiness的默认值可能会提高典型Ubuntu桌面安装的整体性能。 建议使用swappiness值= 10,但可以随意进行实验。 注意:Ubuntu服务器安装对桌面系统有不同的性能要求,默认值60可能更合适。

检查swappiness值

cat /proc/sys/vm/swappiness

更改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

您的问题有几个不同的方面。

首先,你对“自由”的定义是什么。 它实际上并不像在Linux(或任何现代操作系统)中听起来那么简单。

Linux如何使用RAM(非常简化)

每个应用程序都可以使用你的一些内存。 Linux使用所有其他未占用的内存 (除了最后几个Mb)作为“缓存”。 这包括页面缓存,inode缓存等。这是一件好事 – 它有助于加快堆积速度。 写入磁盘和从磁盘读取都可以通过缓存极大地加速。

理想情况下,您有足够的内存用于所有应用程序,并且仍有数百Mb用于缓存。 在这种情况下,只要您的应用程序不增加其内存使用并且系统没有努力获得足够的缓存空间,就不需要任何交换。

一旦应用程序声称拥有更多RAM,它就会进入缓存使用的一些空间,缩小缓存。 取消分配缓存既便宜又简单,只需实时完成 – 缓存中的所有内容只是已经存在于磁盘上的第二个副本,因此可以立即解除分配,或者我们会这样做不管怎样,不得不在接下来的几秒内冲到磁盘上。

这不是特定于Linux的情况 – 所有现代操作系统都以这种方式工作。 不同的操作系统可能只是以不同的方式报告自由RAM:一些包括缓存作为他们认为“免费”的一部分而有些可能不是。

当你谈论免费RAM时, 包含缓存更有意义,因为它实际上是免费的 – 如果任何应用程序请求它,它是可用的。 在Linux上, free命令以两种方式报告 – 第一行包括使用的RAM列中的缓存,第二行包括空闲列中的缓存(和缓冲区)。

Linux如何使用swap(更简化)

一旦你耗尽了足够的内存,没有足够的内存用于平滑运行的缓存,Linux可能会决定从RAM重新分配一些未使用的应用程序内存到交换。

根据明确的截止日期,它不会这样做。 这不像你达到一定比例的分配,然后Linux开始交换。 它有一个相当“模糊”的算法。 它需要考虑很多事情,最好用“内存分配的压力”来描述。 如果分配新内存有很多“压力”,那么它将增加一些交换机会以腾出更多空间。 如果“压力”较小,则会减少这些机会。

您的系统具有“swappiness”设置,可帮助您调整计算“压力”的方式。 通常不建议改变这一点,我不建议你改变它。 交换总体上是一件非常好的事情 – 虽然有一些边缘情况会损害性能,但如果你看一下整体系统性能,那么它对于各种任务来说都是一个净利益。 如果你减少了swappiness,你可以让缓存内存量缩小一点,即使它真的很有用。 对于你所交换的任何问题,这是否足够好,取决于你。 你应该知道你在做什么,就是这样。

有一个众所周知的情况,交换确实损害了桌面系统上的感知性能,这就是应用程序在长时间闲置并且IO背景进程繁重后再次响应用户输入的速度(例如隔夜备份)运行。 这是一个非常明显的缓慢,但不足以certificate在所有操作系统中一起关闭交换是非常困难的。 关闭交换,备份/病毒扫描后的初始缓慢可能不会发生,但系统可能会整天运行一点点慢。 这也不是限于Linux的情况。

选择要交换到磁盘的内容时,系统会尝试选择实际未使用的内存 – 读取或写入。 它有一个非常简单的计算算法,可以在大多数情况下选择。

如果你的系统中有大量的RAM(在编写本文时,8GB对于典型的Linux发行版来说是一个巨大的数量),那么你很少会遇到需要交换的情况。 您甚至可以尝试关闭掉掉。 我从不建议这样做,但只是因为你永远不知道什么时候有更多的RAM可以帮助你避免一些应用程序崩溃。 但如果你知道你不需要它,你就可以做到。

但是如何交换加速我的系统? 不会减慢交易速度吗?

将数据从RAM传输到交换的操作是一个缓​​慢的操作,但只有当内核非常确定整体收益将超过这个时才会采取这种做法。 例如,如果您的应用程序内存已经上升到几乎没有剩余缓存并且I / O因此而效率非常低的情况下,您实际上可以通过释放一些内存从系统中获得更高的速度,甚至在交换数据的初始费用之后,以便将其释放。

如果您的应用程序实际请求的内存比您实际拥有的内存多,那么这也是最后的手段。 在这种情况下,交换是必要的,以防止内存不足的情况,这往往会导致应用程序崩溃或必须被强制杀死。

交换仅与系统性能不佳的时间相关联 ,因为它会在您的可用RAM耗尽时发生,这会降低系统速度(或使其不稳定),即使您没有交换。 因此,为了简化事情,交换发生是因为您的系统陷入困境,而不是相反。

一旦数据处于交换状态,它何时再次出现?

从交换中传输数据(至少对于传统硬盘而言)就像将其放入那里一样耗时。 可以理解的是,你的内核同样不愿意从交换中删除数据,特别是如果它实际上没有被使用(即读取或写入)。 如果你有交换中的数据并且它没有被使用,那么它仍然存在于交换中是一件好事,因为它为正在使用的其他东西留下了更多的内存,可能会加速你的系统。

设置swappiness值在每种情况下都不起作用。 如果它适合你,那很好。 如果没有,我写了一个脚本,通过关闭并重新打开来定期清除交换。

如果你不小心,切换交换有点冒险。 如果没有足够的可用RAM来保存RAM中的所有内容以及交换中的所有内容,则尝试禁用交换将导致系统无响应。 我的脚本首先检查是否有足够的空闲RAM(这需要做一些事情,因为实际的空闲RAM数量与free报告的空闲数据不同),然后只切换交换,如果是这样的话。 但是,如果你的内存有点短缺,那么在脚本运行时不要启动另一个主要进程。 这里是:

 #!/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