释放交换空间

释放交换空间

有时内核似乎有意将 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

正如另一个回复所建议的那样,并获得了非常好的结果。

答案1

你可以做一个swapoff——将需要root权限,
但是,我猜这对你来说不是问题。

答案2

你可以按照 nik 的建议使用交换但是,还有另一种更优雅的方式来调整“swappiness”,或者在运行 2.6 内核的系统中内核将程序交换到磁盘的积极程度。

关于内核应该遵循的政策,在 Linux 内核邮件列表中一直存在激烈的争论交换行为。结果是我们现在有一个修补在 2.6 内核中,我们可以在很大程度上调整这种行为。

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

您可以在/proc/sys/vm/swappiness文件,或者运行此系统控制命令:

sudo sysctl vm.swappiness

“swappiness” 值的范围是 0(无交换)到 100(尽可能多地交换到磁盘)可能)。Ubuntu 默认的 swappiness 设置为 60。

要为会话更改此设置,请再次调用 sysctl 并传递要使用的 swappiness 值:

sudo sysctl vm.swappiness=30

除了自由的,你当然可以通过优秀的顶部或者iotop公用设施。

如果你喜欢所看到的内容,并希望在重新启动后保留此值,只需放置“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

您可以尝试不同的值,直到找到一个可以在您的机器上进行可接受的交换的值。

答案3

请记住,交换的东西是在比现在更繁忙的时候放在那里的。

你可能会发现数据在 RAM 中 - 已被加载回来使用但并未从交换中清除。内核这样做是为了在下一个繁忙时段节省时间 - 如果数据已经复制到那里,它可以直接释放它正在使用的 RAM,而不必先进行磁盘写入。因此,除非你知道该机器在不久的将来不需要再次进行交换,强制释放交换空间可能不会起到任何作用,只会在下次需要交换时使速度变慢一些。

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

如果交换空间有其他用途,而由于您有足够的可用空间,因此目前不会有这样的用途,当然会释放交换空间用于该用途。

在 的输出中,您无法看到处于这种状态的数据量(既存在于交换区域中的磁盘页面中,也存在于 RAM 中)free。不过,您可以通过/proc特殊文件系统看到它。查看 的输出cat /proc/meminfo以了解SwapCached数量。

在有空闲内存的情况下使用交换空间的另外两个原因是

  • 当 I/O 负载很重时,内核决定最好将长时间未使用的页面换出,以便它可以将 RAM 用于缓存/缓冲区,但查看您的free输出,情况可能并非如此,因为您有一块真正未分配的 RAM 以及 IO 缓存/缓冲区使用的 RAM。
  • 这些页面之前因为某种原因被换出,之后就不再需要了——可能是某个进程已经一段时间没有使用内存了。在这种情况下,释放交换(将页面重新加载到 RAM)可能会改善该进程下次需要执行除睡眠之外的其他操作时的响应时间,但如果该进程已经一段时间没有使用内存,那么在不久的将来可能就不需要了。

答案4

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

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

最后,在 Microsoft Windows 上,有报告称 Firefox 被交换到磁盘时存在特定问题,例如最小化时(例如http://joeabiraad.com/mozilla-firefox/control-your-firefox-ram-usage/113)。我还没有听说过 GNU/Linux 系统上有这种功能,但也许值得探索一下。

相关内容