释放交换空间

Rob*_*anu 10 memory linux swap

有时内核似乎有意将 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
Run Code Online (Sandbox Code Playgroud)

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


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

sudo sysctl vm.swappiness=30
Run Code Online (Sandbox Code Playgroud)

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

小智 15

您可以按照 nik 的建议进行操作并使用swapoff。然而,还有另一种更优雅的方法来调整“交换”,或者内核将程序交换到运行 2.6 内核的系统中的磁盘的积极程度。

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

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

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

sudo sysctl vm.swappiness
Run Code Online (Sandbox Code Playgroud)

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

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

sudo sysctl vm.swappiness=30
Run Code Online (Sandbox Code Playgroud)

除了free,您当然可以通过出色的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
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*ett 7

请记住,swap 中的东西是在比现在更忙的时候放在那里的。

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

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

如果其他东西需要交换空间,因为你有足够的空闲时间,它目前不会,它当然会被释放用于该用途。

free. 你可以通过/proc特殊的文件系统看到它。看看输出cat /proc/meminfoSwapCached计数。

当明显有空闲内存时使用交换的另外两个原因是

  • 当在 I/O 负载繁重的情况下,内核决定将很久没有使用的页面更好地换出,这样它就可以将 RAM 用于缓存/缓冲区,尽管查看您的free输出可能并非如此有一大块真正未分配的 RAM 以及 IO 缓存/缓冲区使用的 RAM。
  • 由于某种原因,这些页面早些时候被换出,并且从那时起就不再需要了——也许它是一个已经不活动一段时间的进程正在使用的内存。在这种情况下,释放交换(因此将页面加载回 RAM)可能会在下次需要执行睡眠以外的其他操作时提高该进程的响应时间,但如果它已经不活动一段时间了,则可能不需要它无论如何,在不久的将来的任何时候。


nik*_*nik 2

您可以执行swapoff- 需要 root 权限,
但是,我想这对您来说不是问题。