云网牛站
所在位置:首页 > Linux教程 > Linux交换空间详解

Linux交换空间详解

2018-01-29 23:13:58作者:linuxdashen稿源:Linux大神

交换空间

Linux把物理内存(physical RAM)分成一块一块的小内存,每一块内存被称为页(page)。当内存资源不足时,Linux把某些页的内容转移至硬盘上的一块空间上,以释放内存空间。硬盘上的那块空间叫做交换空间(swap space),而这一过程被称为交换(swapping)。物理内存和交换空间的总容量就是虚拟内存的可用容量。

交换空间的必要性体现在两个方面。第一,当系统需要的内存大于可用物理内存时,Linux内核把物理内存中不常用的页面内容交换出去(swap out),并把腾出来的内存页面分配给当前需要内存的程序或进程。第二,一个程序启动时有很多内存页面只是用来初始化程序的,之后程序的运行再也不需要这些内存页面。Linux可以把这些内存页面交换出去,腾出空间给其他的程序或作为磁盘缓存。

然而交换也有它的不足之处。硬盘的存取速度相对于内存来说是非常慢的。内存的速度可以用纳秒(nanoseconds)来衡量,而硬盘的速度是用毫秒(milliseconds)衡量的。尽管固态硬盘比机械硬盘在性能上有了大幅提升,但与RAM相比还是要慢很多。另外,在固态硬盘上分出一个交换空间并不是一个好主意。

交换空间(swap space)通常是一个磁盘分区,但也可以是一个文件。我们称前者为交换分区(swap partition),称后者为交换文件(swap file)。用户可以在安装Linux发行版时创建交换空间,也可以安装完成后在任何时间创建。如果用户电脑的物理内存(physical RAM)在1G以下,那么交换空间的创建就很有必要。对于不愁物理内存的用户,比如安装了16G内存,交换空间的创建就属于个人偏好了。需要指出的是,Linux发行版的休眠功能是要用到交换空间的。当Linux执行挂起操作(suspend)时,当前系统的状态保存到内存。而执行休眠操作(hibernate)时,系统的状态保存到交换空间。所以如果用户不创建交换空间,就相当于禁用了休眠。

查看当前系统交换空间的状态,我们可以在终端中输入命令: swapon –show

Linux交换空间详解

上图是我的ubuntu系统交换空间状态,第一栏是交换空间的名字;第二栏表明交换空间是以分区的形式存在的;第三栏是交换空间大小;第四栏显示系统已经用了多少交换空间;第五栏是这个交换空间的优先级。

查看交换空间状态的另外一个命令是: free -h

Linux交换空间详解

在Linux系统上,所有的东西都被视作文件。Everything is a file on Linux. 所以不管是交换分区还是交换文件,它们都被当作一个文件来处理。交换分区和交换文件在性能上不存在差异。

 

交换分区(swap partition)

交换分区是硬盘上的一块独立的空间,它只是用来交换的。交换分区内不可以像其他分区一样存放文件。如果硬盘上挂载了两个交换分区,而且它们的优先级相同,那么Linux内核将交替地使用它们地进行交换操作,这将大大改善交换性能。大多数Linux分区工具如fdisk,cfdisk,parted,gparted都可以创建交换分区。如下图,交换分区的ID通常都是82。

Linux交换空间详解

要新建一个交换分区,我们可以使用mkswap命令,例如: sudo mkswap /dev/sdb3

Linux交换空间详解

mkswap将会擦除指定分区上的所有数据,并为新的交换分区生成一个UUID。如果想要自己指定一个UUID,那么可以使用 -U选项。

sudo mkswap -U custom_UUID /dev/sdb3

用swapon命令启用新的交换分区,如下图。Linux系统开机启动脚本经常调用swapon -a命令来挂载/etc/fstab文件里列出的所有交换空间。

Linux交换空间详解

设置开机自动挂载交换分区,编辑/etc/fstab文件。在文件末尾添加如下记录。注意fstab文件要用tab键将各项分开,不要用空格键。如果你的Linux发行版使用systemd,那么不需要在/etc/fstab添加这条记录。

Linux交换空间详解

检查交换分区是否会开机自动挂载,我们可以先用swapoff -a命令来关闭所有交换空间,然后用swapon -a命令来挂载所有/etc/fstab文件记录的交换空间,最后执行swapon –show命令。

再次用fdisk命令读取分区表时,你可能会发现新建的交换分区被标注的类型是83,然而82才是交换分区的类型。在这种情况下,我们需要用fdisk工具的 t 命令来修改分区类型。

 

交换文件

交换空间的另外一个实现方法是交换文件。交换文件的大小可以随时改变,它的删除更加容易。我们可以在交换分区以外的任意一个分区创建交换文件。如果磁盘空间有限,那么交换文件是一种更加可取的实现方法。需要注意的是,Btrfs文件系统并不支持交换文件。

 

交换文件的创建

以root权限使用fallocate命令来创建一个文件,文件的大小可以由用户任意指定,例如:

Linux交换空间详解

我们也可以用dd工具来创建文件,如下图。不过dd的速度比fallocate要慢,而且命令语法也比fallocate的命令语法更复杂。

Linux交换空间详解

然后为文件设置正确的权限。执行命令: sudo chmod 600 /swapfile

Linux交换空间详解

将文件格式化成交换文件: sudo mkswap /swapfile

Linux交换空间详解

启用交换文件: sudo swapon /swapfile

Linux交换空间详解

最后,在/etc/fstab文件中为交换文件添加如下记录: /swapfile  none  swap  defaults  0  0

Linux交换空间详解

 

删除交换文件

要删除交换文件,首先要把它关闭。命令: sudo swapoff -a 这条命令在执行的时候,会先将交换空间里的所有页面换入物理内存,以保证程序的运行不受影响。

然后将它删除。命令: sudo rm -f /swapfile

 

swappiness

有时候你会发现,虽然电脑内存还有非常多的剩余空间,但系统仍然在使用交换空间。这是由于swappiness的设置。swapppiness是Linux内核的一个参数,它控制Linux内核将进程从物理内存中交换出去的频繁度。swappiness的值可以在0到100之间。较低的swappiness值使Linux内核尽量避免进行交换操作,而较高的值则使内核尽量使用交换空间。swappiness的默认值是60。如果值为0,那么内核不进行交换操作,除非物理内存已经用完。如果值为100,那么内核将频繁地进行交换操作。若用户的物理内存充足,那么推荐把swappiness值设为10以提高程序的响应性。

查看当前的swappiness值: cat /proc/sys/vm/swappiness

Linux交换空间详解

临时更改swappiness值: sysctl vm.swappiness=10

Linux交换空间详解

要永久地更改swappiness值,我们需要编辑一个sysctl配置文件。命令:sudo nano /etc/sysctl.d/99-sysctl.conf

在这个文件中添加记录 vm.swappiness=10

 

交换公式(swap formula)

交换公式可以用于计算系统在什么时候会开始使用交换空间。交换公式如下:

剩余内存 <= 总物理内存/ 100 *swappiness

假设你的电脑有4G内存,swappiness的值为60,4G / 100 * 60 = 2457.6MB,那么当剩余内存小于或等于60%即2457.6MB时,系统将开始使用交换空间。

 

优先级

如果你的系统上不只有一个交换分区或交换文件,那么你应当考虑为每个交换空间设置一个优先级。例如,你有两个硬盘,一个快一个慢,那么应该为快硬盘的交换空间设置高优先级,为慢硬盘的交换空间设置低优先级。我们可以使用swapon命令的 -p 参数来设置优先级。

Linux交换空间详解

如果两个交换空间的优先级相同,那么它们将依次轮流地被内核使用。

 

相关主题

Ubuntu增加(swap)交换分区

精选文章
热门文章