最近发现一台服务器的交换分区使用率过高。为了应对这一情况,我翻阅了之前的笔记,对交换分区进行了扩容操作。随后对原有的笔记进行了补充调整。现将这部分内容分享给大家,希望能够对遇到类似问题的朋友们有所帮助。
swap分区是操作系统用于管理内存的一种机制,它允许系统将部分内存数据临时存储到硬盘上的一个特殊区域,从而扩展可用的内存资源。
swap分区的作用主要是为了扩展物理内存和提高系统稳定性。当物理内存(RAM)不足时,操作系统会将一些不常用的数据移到swap分区,释放RAM供更重要的进程使用,实际上就是swap分区提供额外的缓冲,减少系统崩溃的风险。甚至某些操作系统在休眠时会将所有内存状态保存到 swap 分区,以便快速恢复。
- Swap分区:在硬盘上划分出的一个专用分区,通常在系统安装时创建。
- Swap文件:在文件系统中创建的一个文件,可以动态调整大小,适用于已经分配完所有分区的情况。
[root@localhost ~]# swapon --show # swapon -s
NAME TYPE SIZE USED PRIO
/dev/sda2 partition 1.5G 0B -2
# 解释显示内容
- NAME (/dev/sda2): 表示swap设备的名称。也就是说将这个分区指定为swap分区。
- TYPE (partition): 表示swap设备的类型。partition 表示这是一个硬盘分区。其他可能的类型包括 file(表示swap文件)。
- SIZE (1.5G): 表示这个swap分区的总大小为1.5GB。这通常是根据系统的需求和硬盘的可用空间来设置的。
- USED (0B): 表示当前没有任何数据被交换到这个swap分区。这通常意味着系统有足够的物理内存(RAM),不需要使用swap。
- PRIO (-2): 表示这个swap分区的优先级为-2。优先级可以是0到32767之间的整数,数值越大,优先级越高。负值表示较低的优先级。系统会优先使用优先级较高的swap设备。
# 或者通过free -m的方式
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 517 95 7 359 312
Swap: 1535 0 1535
扩展swap分区可以帮助提高系统的稳定性和性能,特别是在内存资源紧张的情况下,对swap交换分区进行适度扩充能够解决部分问题。但是因为硬盘的访问速度远低于内存,过度依赖swap可能会导致系统性能下降。所以真正遇到这种情况,还是要增加物理内存来缓解压力。
在进行扩充分区操作前需要注意:在高负载的情况下,避免进行 swap 文件的操作,以免影响系统性能,再者就是建议备份重要数据,以防万一。
# 此处扩展交换分区1G大小
# 使用 dd 命令来创建交换文件:
dd if=/dev/zero of=/swapfile bs=1G count=1
# dd命令:复制文件、转换文件、格式化文本的功能
# if:从指定文件中读取
# of:写入指定的文件
# bs:一次读写的字节数
# count:指定复制的Block块数
# /dev/zero:0字符设备,可产生特殊的数据流,生成的文件为特殊个数的数据文件。相当于什么都没有。
[root@localhost ~]# dd if=/dev/zero of=/swapfile bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 10.2164 s, 105 MB/s
fallocate -l 1G /swapfile
也可以用来创建分区文件。-l
选项指定要分配的空间大小。但是实际使用时,在一些系统上无法使用fallocate
(比如CentOS 7),所以依然使用dd
命令进行创建。
[root@localhost ~]# chmod 600 /swapfile
[root@localhost ~]# ls -l /swapfile
-rw------- 1 root root 1073741824 Dec 26 18:00 /swapfile
mkswap
命令将文件格式化为交换文件。[root@localhost ~]# mkswap /swapfile
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=fa7367c1-6089-46a6-ba36-a01d5f2a86a4
swapon
命令启用交换文件并进行验证。[root@localhost ~]# swapon /swapfile
[root@localhost ~]# swapon --show
NAME TYPE SIZE USED PRIO
/dev/sda2 partition 1.5G 60.5M -2
/swapfile file 1024M 0B -3
/etc/fstab
文件中。# 内容
/swapfile none swap sw 0 0
# 参数解释
- /swapfile: 设备标识符。指定要挂载的交换文件的路径。
- none: 挂载点,对于交换文件,这里通常是 none。
- swap: 文件系统类型。表示这是一个交换文件。
- sw: 挂载选项。表示这是一个交换文件。
- 0: 备份选项,表示不备份。
- 0: 文件系统检查顺序,表示不检查。
[root@localhost ~]# swapon --show
NAME TYPE SIZE USED PRIO
/dev/sda2 partition 1.5G 0B -2
fdisk
工具来创建一个新的分区,将分区类型设置为 Linux swap(82)。[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
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
Building a new DOS disklabel with disk identifier 0x4ee527e8.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759): +1G
Partition 1 of type Linux and of size 1 GiB is set
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.
创建了一个1G大小的分区。
[root@localhost ~]# mkswap /dev/sdb1
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=a6161b2c-8804-44b5-a054-89b4d8e0fb38
[root@localhost ~]# swapon /dev/sdb1
[root@localhost ~]# swapon --show
NAME TYPE SIZE USED PRIO
/dev/sda2 partition 1.5G 0B -2
/dev/sdb1 partition 1024M 0B -3
/etc/fstab
文件进行固化/dev/sdb1 none swap defaults 0 0
虽然增加swap空间可以在一定程度上提高系统稳定性,但过多的swap空间可能会导致系统频繁地将内存页面交换到磁盘,从而降低性能。如果系统经常出现高swap使用率,但实际物理内存使用率并不高,这可能意味着swap空间过大,导致不必要的磁盘I/O操作。在这种情况下,建议适当减少swap空间可以改善系统性能。
思路:通过创建启用一个较小的swap文件替换原有的swap分区。
[root@localhost ~]# swapoff -a
创建一个新的较小的swap文件,如果想将将swap空间减少到1GB,可以创建一个新的1GB的swap文件。这一部分参考swap扩充空间的方法一。
删除旧的swap分区。如果确认新的swap文件已经正常工作,可以删除旧的swap分区。
swapoff /dev/sda2
有时执行这一步会报错,重启一下服务器重试一下看看。
[root@localhost ~]# swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -3
思路:通过创建启用一个较小的swap分区替换原有的swap分区。
这里对前面用到的 swapon
和 swapoff
命令进行简单说明。
swapon 命令用于启用一个或多个交换分区或交换文件。
# 基本语法:
swapon [选项] [设备]
# 启用单个交换分区
swapon /dev/sda2
# 启用所有列出的交换分区
sudo swapon -a
# 显示当前激活的交换分区
swapon -s
# 设置交换分区的优先级
swapon -p 10 /dev/sda2
swapoff 命令用于禁用一个或多个交换分区或交换文件。
# 基本语法
swapoff [选项] [设备]
# 禁用单个交换分区
swapoff /dev/sda2
# 禁用所有列出的交换分区
swapoff -a