swap
我对和有疑问physical memory
。我经常运行需要大量内存的程序,结果我可以看到一些数据从 复制到physical memory
。swap
但是,一旦程序终止,并且 被physical memory
释放,我仍然可以看到 上大量的数据,swap
这会严重降低系统速度,令人烦恼!
这背后的原因是什么?操作系统如何决定哪部分数据应该被释放swap
?这些数据应该在那里保留多长时间?如何“释放”这些数据?
答案1
我正在简化事情,但只有两种情况,交换中的分页内存被复制回物理RAM:
- 出现页面错误(应用程序尝试调用映射到交换的内存)。
- 您使用
sudo swapoff -a
(et al) 来关闭交换。
任何其他事情都往往是浪费时间。交换中的内存往往是相对未使用的、流量较低的内容。Linux 使用的将内容放入交换的算法是最小可用单元(最近最少使用)。如果您发现自己正处于磁盘垃圾和应用程序因页面错误而停滞的情况,那么问题很容易解决:您需要更多 RAM。
内存只是放在交换区中不会减慢计算机的速度。只有当某些东西必须放在交换区中并使用时才会产生这种影响。
注意:正如我所说,我在这里简化了事情。内存管理是一个绝对巨大主题和我写的几段文字并没有公正地描述这些算法、它们的设计者或实现者。多年来,我也曾与 Linux 内存和缓存管理有过斗争,但到目前为止,我学到了一点:内核开发人员比我懂得更多。他们设置这些事情是有原因的。
答案2
如果您经常遇到由于页面交换而导致的速度减慢,则可能需要更多内存。关闭未使用或低优先级的服务并进行其他减少内存的调整可以作为临时的权宜之计。
这背后的原因是什么?操作系统如何决定哪部分数据应该进行交换?
当您的内存占用很大的进程运行时,内存管理会换出页面,为您的进程腾出空间。这通常是根据最近最少使用的情况进行的。(程序通常有一些内存页面曾经需要,但现在不再需要了。)
如果您有多个设备,您可以通过删除该交换分区来中断页面映射。这将强制将页面放入内存(尽管它们可能会很快被换出)。
这些数据应该保留多长时间以及如何“释放”它们?
一旦映射到交换,页面可能会保持映射到交换的状态,直到进程终止,此时页面被“释放”。映射到交换空间的页面可能位于内存中。页面管理器可能会维护映射,以防止在需要再次交换页面时重新映射页面。
当页面交换到内存中时,速度可能会有所减慢。根据内存需求和程序调度,使用交换会显著降低性能。
使用sar
或munin
监视页面输入/输出活动应该能够让您看到将活动页面映射到内存需要多长时间。一旦它们被交换回内存,只要内存可用,它们就会一直留在那里。
一些可能会提高交换性能的东西。
- 专用交换分区位于经常访问的分区旁边。这可减少需要交换时的磁头延迟。
- 使用位于最频繁使用的分区上的交换文件。这可以减少磁头延迟。
- 交换分区的专用驱动器。应用了许多 I/O 性能改进。
- 使用 SSD 作为交换空间。I/O 比磁盘快得多。(快速 USB 驱动器的性能可能也比磁盘更好,但请先测量 I/O 速率。)
可以在正在运行的系统中添加和删除交换文件和分区。可以给交换设备赋予不同的优先级,以控制首先使用哪个设备。