交换分区是内核直接访问的硬盘空间,在内存不足时系统将部分内存置于交换分区,由于是硬盘访问速度会比物理内存慢。下图是推荐的物理内存和 swap 比例。
swappiness
系统有个 swappiness 值设置,决定内核向 swap 移动内存的大小和频率,默认值为 60. 可设置范围是 0-100 值越大使用 swap 越多。
# 查看设置
$ cat /proc/sys/vm/swappiness
60
下面命令修改 swappiness 值,其中 x 为 0-100 数值。
sudo sysctl vm.swappiness=x
释放 swap 空间
如果 swap 空间比较小,容易物理内存使用很少但是 swap 却满了,造成系统卡顿。这时候先关闭 swap 等待一段时间再打开,能手动释放 swap 空间。因为关闭 swap 时系统会将 swap 数据转移到物理内存。
# 关闭
$ sudo swapoff -a
# 然后等待一段时间
# 再打开
$ sudo swapon -a
添加 swap 分区
swap 空间太小系统容易卡顿,增加 swap 空间的好方法是买个新硬盘,并在新硬盘划一个分区用于 swap. 此外,LVM 逻辑卷和 swap file 也能用于增加 swap 空间。
下面将用未分区的 "/dev/sdb" 硬盘,示范添加 swap 分区步骤。
# 未分区硬盘
$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 10.71 TiB, 11756399230976 bytes, 22961717248 sectors
Disk model: ST12000NM009G
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
# 已分区硬盘
$ sudo fdisk -l /dev/sda
Disk /dev/sda: 10.71 TiB, 11756399230976 bytes, 22961717248 sectors
Disk model: ST12000NM0158
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: DA8570AB-053A-44D8-B034-5653F8BE1D03
Device Start End Sectors Size Type
/dev/sda1 2048 20000767 19998720 9.5G EFI System
/dev/sda2 20000768 22961715199 22941714432 10.7T Linux filesystem
用 fdisk 命令进行硬盘分区操作,需要有 sudo 权限,先查看命令的帮助。
$ sudo fdisk /dev/sdb
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
The size of this disk is 10.7 TiB (11756399230976 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).
Created a new DOS disklabel with disk identifier 0x8f39e4ad.
Command (m for help):
运行 fdisk 命令进入交互模式,按 m 命令并回车显示帮助。可见 n 命令添加新的分区,t 命令修改分区类型。
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
用 n 命令添加新分区,分区类型选择 p(主分区);分区第一个磁道用默认的 2048,结束磁道使用 "+32G" 表示设置分区大小为 32Gb。因为是用来做 swap 的,用 t 命令将分区类型修改为 82.最后 w 命令保存修改。
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-4294967295, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-4294967295, default 4294967295): +32G
Created a new partition 1 of type 'Linux' and of size 32 GiB.
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
此时查看硬盘,新添加的分区已自动命名为 "/dev/sdb1".
$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 10.71 TiB, 11756399230976 bytes, 22961717248 sectors
Disk model: ST12000NM009G
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x8f39e4ad
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 67110911 67108864 32G 82 Linux swap / Solaris
用 mkswap 命令将其变为 swap 空间。其中 -L
设置标签。
$ sudo mkswap -L swapA /dev/sdb1
Setting up swapspace version 1, size = 32 GiB (34359734272 bytes)
LABEL=swapA, UUID=cad6ddce-6dcf-4abb-9cca-3854e7b880d0
修改 /etc/fstab
文件,添加新 swap 分区信息。
/dev/sdb1 swap swap defaults 0 0
打开新添加的 swap 空间。
$ sudo swapon -L swapA
查看可见已经打开,现在有 2 个 swap 空间。多个 swap 空间时会按照优先度使用,优先度高的 swap 空间满了,再用更低优先度 swap 空间。
$ swapon -s
Filename Type Size Used Priority
/swapfile file 2097148 0 -2
/dev/sdb1 partition 33554428 0 -3
或者,移除不想要的 swap 空间。先关闭对应 swap 空间。
$ sudo swapoff /swapfile
关闭后在 /etc/fstab
文件将对应条目删除。并删除 swapfile 文件。
$ sudo rm -rf /swapfile
参考资料
Chapter 7. Swap Space Red Hat Enterprise Linux 5 | Red Hat Customer Portal
How to clear swap memory in Linux | Enable Sysadmin
How to add swap space in linux – The Geek Diary
10 fdisk Commands to Manage Linux Disk Partitions
5.3. Removing Swap Space