有关 Linux Swap

前言

Linux 将物理内存划分为内存页(分页)。交换是将一页内存数据复制到硬盘中的预设空间(交换区),用以释放该页内存。物理内存和交换区的总大小便是虚拟内存可用总量。 —— All about Linux swap space

看到上述有关交换区的概念大家可能会有些混淆,这里简单介绍一下。

虚拟内存(Virtual memory

虚拟内存是一种内存管理技术,它把程序使用的内存地址(虚拟地址)映射为计算机内存中的物理地址。虚拟内存有几个优点:

  1. 解放应用程序,使其不需要管理共享的内存空间;
  2. 内存隔离,从而提升安全性;
  3. 能利用分页技术使用比物理更多的内存。

分页(Paging

分页是虚拟内存技术中的重要部分。它把内存中的数据分成固定大小的区块(页),并将不活跃的页由主存(内存)移动到辅助内存(通常是磁盘),若需要时再取回到内存中。这也是为什么系统能通过这个技术来使用比物理内存更多的内存。一般情况下,系统会采用最近最少使用算法来提升分页效率。

如果没有分页

当我们系统已经打开了很多活跃程序,企图再打开一个更大的程序时,系统会因为没有更多的物理内存而提示我们「内存不足」,这时候只能关闭其他不需要的程序来释放内存,以便可以打开这个大程序。

交换区(Swap space

交换区是在硬盘中配置的一块区域,可以是文件或分区(在 Linux 2.6 以前更推荐将交换区设为一个磁盘分区,因为这样会更快些),对于小内存的服务器,极力推荐设置交换区。(分页中用到辅助内存便是交换区)

交换区大小可遵循下面的方案:

// 伪代码,GB 为单位
if (RAM < 2) {  
  Swap = RAM * 2
} else if (RAM < 32) {
  Swap = RAM + 2
} else {
  Swap <= RAM * 1
  // 视服务器承载的业务情况而定
}

系统有时候很「卡」

我们经常会遇到在运行一个很占内存的程序之后,系统会变得很「卡」,此时你的 RAM 不足以承载更多的活跃数据,系统会把不活跃的数据分页并移动到交换区中,释放部分 RAM,以便大程序可以快速运行。系统「卡」的真正原因是硬盘的数据交换速度和内存相比实在是太慢了,关闭不常用的程序,扩充物理内存,换固态硬盘可以缓解「卡」的问题。

查看 Swap space 大小

free - Display amount of free and used memory in the system
显示系统的空闲和已用内存

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        1.0G         89M         88K        674M        584M  
Swap:          4.0G         55M        3.9G  

swapon - enable devices and files for paging and swapping
启用设备和文件来进行分页与交换

$ swapon -s
文件名            类型      大小  已用  权限
/home/swap       file    4194300 57108   -1

设置 Swap space

因为在 Linux 2.6+ 系统上,交换分区和交换文件速度差距不大,所以这里用灵活性更高的交换文件来做示例。

首次创建交换文件

fallocate - preallocate space to a file
创建预分配大小的文件

dd - convert and copy a file
用指定大小的块复制一个文件,并在复制的同时进行指定的转换。

mkswap - set up a Linux swap area
可将磁分区或文件设为 Linux 的交换区。

1. 创建空文件
$ fallocate -l 4G /home/swap
# 直接分配 4GB 区域给 /home/swap,立即完成
$ dd if=/dev/zero of=/home/swap bs=1M count=4096
# 用空字符(`0x00`)写入 `/home/swap` 文件
# 每次写入 1M bytes,共 4096 次。即生成一个 4GB 的空白文件。
# 完成需要一定时间,去决定于硬盘性能

注意:fallocate 在某些文件系统(如 F2FS/XFS)中会有问题,所以用 dd 来代替,只不过有些慢。
查看分区文件系统可用 df -lhT

2. 修改交换文件的权限
$ chmod 600 /home/swap

交换文件权限过高的话不安全,因此要设置为 600 —— 只有所有者(root)可读写。

3. 建立并启用交换区
$ mkswap /home/swap
$ swapon /home/swap

# 检查交换区启用情况
$ swapon -s
$ free -h
4. 修改 /etc/fstab,挂载交换文件
$ vi /etc/fstab
# 增加如下内容,并保存
/home/swap none swap defaults 0 0

fstab 可将交换文件在机器重启后自动挂载

修改正在使用的交换文件大小

swapoff - disable devices and files for paging and swapping
禁用指定设备和文件的交换功能

1. 禁用 Swap 文件
$ swapoff /home/swap
2. 创建空白 Swap 文件
$ fallocate -l 4G /home/swap

用空字符(0x00)写入 /home/swap 文件,每次写入 1M bytes,共 4096 次。即生成一个 4GB 的空白文件。

3. 建立并启用交换区
$ mkswap /home/swap
$ swapon /home/swap

删除交换文件

# 禁用所有交换区
$ swapoff -a
# 删除交换文件
$ rm -rf /home/swap

调整交换性能

sysctl 的 swappiness 参数代表 Linux 内核对交换空间的利用程度,0 - 100,值越低内存交换的频次越少,(物理内存充足的情况下)系统响应速度会更高。

# 查看 swappiness 值
$ cat /proc/sys/vm/swappiness
# 临时修改
$ sysctl vm.swappiness=30
# 永久修改
$ vi /etc/sysctl.d/99-sysctl.conf
# 修改并保存
vm.swappiness=30  

参考

正在加载 Disqus 评论组件...