使用两块或多块硬盘来加快交换分区的速度

众所周知Linux通常使用交换分区做为虚拟内存,只需要在硬盘上开辟一块swap格式的分区,就可以让Linux使用这块分区来做为物理内存的补充。交换分区可以有几个,如果有多块硬盘的话,可以在每块硬盘上都开辟一块交换分区,让Linux同时使用两块硬盘上的交换分区。在硬件上看来,两块硬盘是可以并行存取的,如果同时使用两块硬盘上的交换分区,理论上就能加快交换分区的速度。

除了使用硬盘,我还考虑过使用U盘,在两块硬盘和一个U盘上同时开辟3个交换分区,这样会不会让交换分区的性能得到很大提升?为了验证这一点,我进行了一个测试。

测试说明

为了测试交换分区的性能,我先使用程序甲将系统的物理内存占满,然后使用程序乙申请内存。在甲内存申请了正好填满物理内存的数据后,由于Linux内存管理的设计,此时物理内存应该是几乎填满的,而交换分区上则会有很少的数据。接下来运行乙程序,乙程序申请内存时,Linux就会将甲程序已经申请的内存放入交换分区,以腾出物理内存供乙程序使用。由于物理内存的速度远大于硬盘,于是就可以把乙程序申请到足够内存所花的时间做为评价交换分区性能的指标。

测试开始前,我尽可能关闭了没必要的程序,然后计算剩余多少物理内存,使用甲程序填满这些空闲的物理内存。接着,使用一个脚本进行10次如下的操作:

  1. 停用交换分区
  2. 启用交换分区
  3. 运行乙程序,并记录乙程序的运行时间

最后就得到10个数据,运行时间越小,交换分区的效率就越高。在我的测试中让乙程序申请的内存是720MB。

对以下的交换分区设置方案分别进行一次测试:

  • 只在硬盘乙上启用交换分区
  • 在硬盘乙和硬盘甲上同时启用交换分区
  • 在硬盘乙、硬盘甲以及U盘上启用交换分区
  • 在硬盘乙和U盘上启用交换分区

测试结果

先来看只在硬盘乙上启用交换分区和同时在硬盘甲和硬盘乙上启用交换分区的测试结果截图:

可以看到,只使用一块硬盘时,乙程序执行时间大约是13秒,而使用两块硬盘的时候,执行时间就缩短到了大约8.7秒,效率提升了33%.使用两块硬盘确实可以提升交换分区的效率。可以推知,如果使用三块硬盘,应该可以获得更快的交换分区性能。

接下来对同时使用U盘的测试结果就让我失望了,在U盘上使用交换分区后,交换分区的性能跌得很厉害,于是还没有等完成10次测试我就手动停止了剩余的测试。下面是结果:

同时在U盘上启用交换分区后,交换分区的效率反而比只使用硬盘还低。究其原因,应该是Linux并不会根据存储设备的繁忙程度来给其分配交换分区任务,而是简单地将交换分区的任务平分给几个交换分区。由于U盘的速度比硬盘慢很多,而又分到了和硬盘一样多的交换分区任务,所以在同时在U盘上使用交换分区时,整个交换分区的效率就会变得还不如使用单块硬盘了。

测试得到的结论

  • 不要在速度相差很大的设备上并行使用交换分区
  • 只有在速度相差不大的设备上并行使用交换分区,才能提升交换分区的性能

在多块硬盘上并行使用交换分区的设置方法

首先当然要在每块硬盘上都开辟一块交换分区,接下来,需要修改/etc/fstab,指定以相同的优先级来使用这几个交换分区。指定交换分区优先级需要使用pri参数,就像下面这样的:

# <file system> <mount point> <type> <options> <dump> <pass>
/dev/sdb10  none  swap  sw,pri=1  0  0
/dev/sda8  none  swap  sw,pri=1  0  0

这样两个交换分区将以相同的优先级1被使用。对于相同优先级的交换分区,Linux将会并行地使用它们。如果优先级不同,Linux会先使用优先级高的交换分区,待优先级高的交换分区满了之后,再去使用优先级低的交换分区。我们的目的是要让Linux同时使用两个交换分区,所以需要把两个交换分区设为相同的优先级。

重启之后,就可以获得比使用单块硬盘更快的交换分区速度了。

本文发表于 技术向,并添加了 , , , , 标记。保存永久链接到书签。

发表评论

电子邮件地址不会被公开。