Linux Swap 交换分区

2021-08-16  本文已影响0人  BeeBee生信

交换分区是内核直接访问的硬盘空间,在内存不足时系统将部分内存置于交换分区,由于是硬盘访问速度会比物理内存慢。下图是推荐的物理内存和 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

上一篇下一篇

猜你喜欢

热点阅读