释放交换空间


10

有时,即使有足够的可用物理内存,而我正在使用firefox,内核似乎也打算保持例如firefox处于交换状态:

robert@rm:~> free -m
             total       used       free     shared    buffers     cached
Mem:          3009       1904       1104          0        109        679
-/+ buffers/cache:       1116       1892
Swap:         4102        885       3216

是否有命令指示内核放弃交换空间并使用可用的空闲内存?


更新:尽管短期内我使用了swapon / swapoff,但现在我设置了

sudo sysctl vm.swappiness=30

如另一个回应中所建议,并获得很好的结果。

Answers:



15

您可以按照nik的建议进行操作,并使用swapoff。但是,还有另一种更优雅的方式来调整“波动性”,即内核在运行2.6内核的系统中如何积极地将程序换出到磁盘。

在linux内核邮件列表上,关于内核应该遵循的交换行为政策引起了激烈的争论。结果是,我们现在在2.6内核中有一个补丁,可让我们在很大程度上调整此行为。

请注意,您需要具有root特权才能执行此操作,就像运行swapoff / swapon命令一样。

可以在/ proc / sys / vm / swappiness文件中或通过运行以下sysctl命令来检查“ swappiness”的当前值:

sudo sysctl vm.swappiness

“ swappiness”值的范围可以从0(不交换)到100(尽可能交换到磁盘)。Ubuntu出厂时默认的swappiness设置为60。

要为会话更改此设置,请再次调用sysctl并向其传递一个swappiness值以使用:

sudo sysctl vm.swappiness=30

除了免费之外,您当然可以通过出色的htopiotop实用程序监视执行此操作的效果。

如果您喜欢所看到的内容,并且希望在重新启动后保留该值,只需将“ vm.swappiness = 30”放在/etc/sysctl.conf文件中。

$ sudo sysctl vm.swappiness
vm.swappiness = 30
$ sudo sysctl vm.swappiness=40
vm.swappiness = 40
$ sudo sysctl vm.swappiness
vm.swappiness = 40
$ sudo tail /etc/sysctl.conf 
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#
# The contents of /proc/<pid>/maps and smaps files are only visible to 
# readers that are allowed to ptrace() the process
# kernel.maps_protect = 1
vm.swappiness=30

您可以使用不同的值,直到找到需要在机器上进行可接受的交换级别的值。


sysctl +1。当尝试不同的交换值时,可以直接写入proc文件(回显“ 30”> / proc / sys / vm / swappiness)。此更改是临时的,不会写入/etc/sysctl.conf。对设置满意后,请使用sysctl进行“永久”更改。
肖恩·金

6

请记住,交换中的内容放置在比现在更忙的时间。

您可能会发现数据位于RAM中-已重新加载以供使用,但未从交换中清除。内核这样做是为了节省下一个繁忙时间的时间-如果已经将数据复制到那里,它可以释放它正在使用的RAM,而不必先进行磁盘写入。因此,除非您知道该机器在不久的将来不再需要进行交换,否则强制释放交换空间可能无济于事,除非下次需要进行交换时要放慢速度。

这是在写时删除的基础上进行管理的,因此,如果更新RAM中的副本,则会释放交换中的块。

如果交换空间还需要其他空间,那么由于您有足够的空闲空间,当前将不需要交换空间,因此当然会释放该空间。

在的输出中,您看不到处于此状态的数据量(既位于交换区的基于磁盘的页面中,又位于RAM中)free。您可以通过/proc特殊的文件系统查看它。看看输出cat /proc/meminfoSwapCached计数。

当显然有备用内存时,使用交换的另一个两个原因是

  • 当I / O负载很重时,内核决定可以更好地交换未使用过的页面,以便可以将RAM用于高速缓存/缓冲区,尽管看着您的free输出在这里可能不是这种情况具有大量真正未分配的RAM以及IO高速缓存/缓冲区所使用的RAM。
  • 由于某种原因,这些页面被换出了,从那以后就不再需要了-也许这是一段时间以来处于非活动状态的进程正在使用的内存。在这种情况下,释放交换(以便将页面加载回RAM)可以在下次需要执行除睡眠以外的其他操作时改善该进程的响应时间,但是如果它已经处于非活动状态一段时间了,则可能不需要无论如何,在不久的将来。

1
+1是一个很好的解释。仅供参考,vmstat可以让您通过/ proc / meminfo数据查看全部数据。

1

请记住,这free只是内存使用情况的快照。您看到的结果可能暗示,在过去的某个时候,系统内存不足,因此换出了RAM驻留的材料。从那时起,RAM变得空闲了,但是不需要交换材料,因此仍然保留在交换上,而不仅仅是使RAM混乱。如果是这样,关闭交换将是一个坏主意。自上次重新加载以来,是否有任何进程可能需要如此大量的RAM?

另外,您可能要检查是否对通过ulimit设置的最大驻留大小没有限制(通常在/ etc / profile中,但可能随发行版而有所不同,并且可以按进程设置(例如,在启动脚本中)) )。

最后,在Microsoft Windows上,有关于Firefox被换出到磁盘的特定问题的报告,例如最小化时(例如 http://joeabiraad.com/mozilla-firefox/control-your-firefox-ram-usage/113)。我在GNU / Linux系统上还没有听说过,但是可能值得探索。


感谢您的回答。我的问题不是正在使用交换,而是将其用于活动程序,例如Firefox和Thunderbird,它们感觉很慢。掉期/交换使他们再次感到活泼。
罗伯特·蒙提亚努
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.