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

评论

请共享以下命令/文件的内容或输出,以更好地帮助我们解决您的问题(此答案中的说明):free -m,top -b 1

明天将使用这些命令的pastebins更新问题。现在是凌晨12点:(

我应该编辑标题以添加“ ...但是我现在很困,无法照顾,所以你们也要小睡”:P

#1 楼

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

从Ubuntu的Swap常见问题解答:


什么是swappiness,如何更改它?

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

swappiness = 0指示内核避免尽可能长的时间从物理内存中交换进程。对于内核版本3.5及更高版本,它会禁用交换功能。
swappiness = 100告诉内核从物理内存中积极地进行进程交换,并将其移至交换缓存中。

Ubuntu中的默认设置为swappiness = 60降低swappiness的默认值可能会提高典型Ubuntu桌面安装的整体性能。建议将swappiness的值设置为10,但可以随时尝试。注意:Ubuntu服务器安装对台式机系统具有不同的性能要求,默认值60可能更适合。

检查交换值

cat /proc/sys/vm/swappiness

更改swappiness值可以使用swbripness值进行10的临时更改(重新引导时丢失)。

sudo sysctl vm.swappiness=10

要永久更改,使用您喜欢的编辑器编辑配置文件:

gksudo gedit /etc/sysctl.conf

搜索vm.swappiness并根据需要更改其值。如果vm.swappiness不存在,则将其添加到文件末尾,如下所示:

vm.swappiness=10

保存文件并重新启动。


还可以查看以下网址:https://askubuntu.com/a/103916/54187

评论


闲置推测:这实际上可能对性能有所帮助-可以将一段时间内未访问的页面复制到交换空间,这使OS可以在需要内存的情况下将其快速撤出,但页面内容仍保留在内存中。

–西蒙·里希特(Simon Richter)
2012年6月30日下午0:52

@SimonRichter是的,就是这个主意。但是,在现代系统上,Swappiness值60可能太激进了,因为这意味着当您仍然有几GB的可用内存时,您就开始交换了。

–布伦丹·朗(Brendan Long)
2012年6月30日的1:31

编辑文件以应用更改后,运行sudo sysctl --load = / etc / sysctl.conf

–deFreitas
18年1月1日在6:51

#2 楼

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

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

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

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

理想情况下,您有足够的内存来容纳所有应用程序,并且还有数百Mb的空间用于缓存。在这种情况下,只要您的应用程序不增加内存使用量,并且系统不会为获取足够的缓存空间而苦苦挣扎,就无需进行任何交换。

一旦应用程序要求更多RAM,它只是进入缓存使用的某些空间,从而缩小了缓存。取消分配缓存既便宜又容易,只需简单地实时完成-位于缓存中的所有内容只是磁盘上已有内容的第二个副本,因此可以立即释放,或者我们可以无论如何都必须在接下来的几秒钟之内刷新到磁盘。

这不是Linux特有的情况-所有现代操作系统都以这种方式工作。不同的操作系统可能只是以不同的方式报告可用内存:有些操作系统将高速缓存作为他们认为“可用”的一部分,而有些则可能没有。

当您谈论可用内存时,对于include缓存,因为它实际上是免费的-任何应用程序都可以使用它。在Linux上,free命令同时报告两种情况-第一行在“使用的RAM”列中包含缓存,第二行在free列中包括缓存(和缓冲区)。

Linux如何使用swap(更加简化)

一旦您用完了足够的内存以至于没有足够的内存来平滑运行的缓存,Linux可能会决定从RAM重新分配一些未使用的应用程序内存以进行交换。

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

您的系统具有“波动”设置,可帮助您调整“压力”的计算方式。通常不建议完全更改它,我也不建议您更改它。交换总体而言是一件非常好的事情-尽管在某些极端情况下,交换会损害性能,但是如果您查看系统的整体性能,则对许多任务来说都是净收益。如果减少交换性,则可以使高速缓存的存储量比原先的压缩量稍微减少一点,即使它可能确实有用。对于您在交换时遇到的任何问题,这是否是一个足够好的折衷方案,完全取决于您自己。您应该只知道自己在做什么,仅此而已。

有一种众所周知的情况,即交换确实会损害台式机系统上的感知性能,即在长时间闲置并且IO的后台进程繁重之后,应用程序能够以多快的速度再次响应用户输入。隔夜备份)运行。这是一个非常明显的呆滞,但不足以证明完全关闭交换是合理的,并且在任何操作系统中都很难避免。关闭交换,备份/病毒扫描后这种最初的缓慢现象可能不会发生,但是系统可能会整天运行缓慢。这也不限于Linux。

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

如果您的系统中有大量的RAM(在编写本文时,8GB对于典型的Linux发行版),那么您将很少遇到根本需要交换的情况。您甚至可以尝试关闭交换。我从不建议这样做,但这只是因为您不知道何时有更多的RAM可以使您避免某些应用程序崩溃。但是,如果您知道不需要它,就可以这样做。

但是,交换如何提高我的系统速度?

将数据从RAM传输到交换是一种缓慢的操作,但是只有当内核完全确定整体收益将超过此收益时,才会采取这种操作。例如,如果您的应用程序内存增加到几乎没有缓存的状态,并且由于这个原因您的I / O效率很低,那么您实际上可以通过释放一些内存来提高系统速度,甚至交换数据以释放数据的最初费用后。

如果您的应用程序实际请求的内存比您实际拥有的更多,这也是最后的选择。在这种情况下,必须进行交换以防止出现内存不足的情况,这种情况通常会导致应用程序崩溃或被强制终止。

交换仅与系统执行的时间有关之所以糟糕,是因为它有时发生在可用RAM耗尽时,即使您没有交换,这也会减慢系统运行速度(或使其不稳定)。因此,为了简化起见,发生交换是因为您的系统陷入了瘫痪,而不是相反。

一旦交换了数据,什么时候它会再次出现?

从交换中转移数据(至少对于传统硬盘而言)与将数据放入交换中一样耗时。因此可以理解的是,您的内核将不愿从交换中删除数据,尤其是在未实际使用(即读取或写入)的情况下。如果您有数据在交换中并且没有被使用,那么保留在交换中实际上是一件好事,因为它为正在使用的其他事物留出了更多的内存,有可能加速您的系统。

评论


+1详细说明。我还喜欢在计算机上保留2GiB交换。如果出现问题(例如内存泄漏等),则可以看到交换上升,并在出现内存不足之前查找问题。它既是安全网又是性能工具。

–乔
2012年7月4日在18:48

在只有2GB RAM的上网本上,我保留了4GB的交换空间。这是因为我使用上网本的目的远不止于此,并且我的程序经常需要超过2GB的内存。由于Linux在内存不足的情况下表现很差,因此我更喜欢拥有大型安全网。而且我有足够的磁盘空间。

–斯科特遣散费
2012年7月5日在2:15

@neon_overload:根据HP,我应该注意,我的上网本的最大RAM为1GB。我现在有2GB的存储空间,互联网资源显示2GB是实际的最大存储空间。因此,需要这些解决方法。

–斯科特遣散费
2012年7月5日在11:07

@thomasrutter:对于大型服务器,您的答案有何变化?我的其中一个拥有1TB(是一个完整的TB)的ram,但仍在使用swap;您将建议什么交换设置和什么大小的交换分区?

– Christinmtown
2015年4月3日15:08



我建议首先对该服务器上正在使用的1TB内存进行更多分析,然后再解决更多问题。交换是潜在问题(很好,内存不足)的征兆,而不是原因,而在这种情况下调整交换性就像在泰坦尼克号上重新布置躺椅一样。在某些情况下需要进行交换是明智的,但是如果您通常在服务器上看到许多GB的交换,那是不对的。对于负载相对均匀的服务器,您的目标是实际使用的交换很少或根本没有交换。

–胸骨
2015年4月8日,0:30

#3 楼

设置swappiness值并非在每种情况下都有效。如果它对您有用,那就太好了。如果没有,我编写了一个脚本,通过将其关闭然后重新打开来定期清除掉交换。

如果不注意,切换交换会有些冒险。如果您没有足够的可用RAM来容纳RAM中的所有内容以及交换中的所有内容,则尝试禁用交换将导致系统无响应。我的脚本首先检查是否有足够的可用RAM(这需要做一些事情,因为实际可用RAM的数量与free报告为可用的数量不同),然后仅在切换交换时才这样做。但是,如果您的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 }')"
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)"

# 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不足,它将拒绝切换交换。我使用这个脚本已经将近五年没有问题了。

评论


为脚本+1。您可能需要通过将输出中的MB更改为MiB来对其进行一些现代化。我写了一个类似的脚本,但没有包含所有(良好)安全测试。在我的旧笔记本电脑上,该笔记本电脑经常使用交换功能,这需要一段时间才能运行-一两分钟,但丝毫不伤人。偶尔会失败,因为没有足够的可用内存来运行它,但这并没有引起任何其他问题。发生这种情况时,我必须重新启动以清除问题。它与传输中看似内存泄漏的原因有关(我相信,自从修复以来,它只有2GiB内存)。

–乔
2012年7月4日在18:36

如果将某些东西移到交换区中并保留在交换区中,那通常是一件好事-这意味着数据实际上并未被使用,并且它释放了部分RAM用于其他东西,从而潜在地提高了速度。是什么让您相信该数据不应该交换,而应该占用更多宝贵的RAM?通常,内核非常擅长知道哪些未使用,哪些可以安全地保留在交换中以释放RAM。

–胸骨
2012年7月6日在0:37



@neon:请记住,我的机器分别具有2GB和3GB的RAM,这些天来已经很少了。证据在表现。例如,由于交换,调出菜单或切换程序的速度可能很慢,Compos visoal效果也是如此。通过切换交换可以消除这种缓慢性,因此证明至少在某些情况下内核的优化算法不是最佳的。我再也无法反驳。

–斯科特遣散费
2012年7月6日4:31



ew!这只是使交换率降到了0%。...我没有太多时间研究这个完整的问题及其答案,但是我喜欢在有空闲时间时阅读它。

– AzzM
2014年4月12日上午10:25

当然可以,但是这并没有解决一旦释放了内存并且尽管现在有足够的可用内存仍在交换东西时该怎么办的问题。内核在需要之前不会将其退出交换,这可能会导致系统响应性出现重大问题。 (考虑何时将系统菜单全部换出:在您单击菜单按钮之前,它不会被换回,这意味着您突然需要等待一段时间才能弹出菜单。)这就是为什么手动将其拉出适时进行交换可以提高系统响应速度。

–斯科特遣散费
16-2-10在2:53



#4 楼

我编辑了Scott Severance的脚本以匹配已经包含总可用内存字段的免费版的较新版本。

 #!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print }')"
used_swap="$(free | grep 'Swap:' | awk '{print }')"

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
 


#5 楼

通常,在当今的系统上,交换未使用。以我的经验,长时间运行而无需大量操作的进程被linux转换为交换。
它使一些受影响的程序运行缓慢。
如果有很多可用的ram,则可以通过运行以下命令来关闭交换:swapoff -av(需要sudo的权限。)

如果您不喜欢交换掉,您可以使用对称命令:swapon -av(再次要求sudo)将其打开。

评论


完全关闭交换是过大的做法,因为swapiness = 0会做同样的事情,但是更安全(如果最终内存过多,则会在交换中抛出某些错误)。

–布伦丹·朗(Brendan Long)
2012年6月30日的1:33

@BrendanLong公平的点..谢谢教我。 :)

–drake01
2012年6月30日7:26

#6 楼

一旦将交换用于程序,在程序的整个生命周期中它往往会保持映射状态。许多程序都有很少使用的代码(和数据)。一旦内存被换出,就不太可能被换入。

强制这些页面进入内存的一种方法是关闭内存。交换设备。如果有两个,则可以关闭其中一个,然后重新打开,然后关闭第二个。如果确实需要交换,它将在设备之间移动。您可以只关闭交换设备(或文件),但是如果您确实需要交换空间,则可能会发生一些麻烦的事情。

除了内存中的正常情况外,tempfs还使用交换空间,并且将像交换一样其余的内存。如果您运行需要大量临时磁盘的内容,则可能会强制换出页面。一旦创建,临时文件可能会在几分钟后不再使用,并且很适合移动到交换设备。

紧急情况下,您可以将文件用作交换设备。如果您暂时需要额外的交换空间,这将很有用。