最近发现一台服务器的交换分区使用率过高。为了应对这一情况,我翻阅了之前的笔记,对交换分区进行了扩容操作。随后对原有的笔记进行了补充调整。现将这部分内容分享给大家,希望能够对遇到类似问题的朋友们有所帮助。
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
-
- [root@localhost ~]# mkswap /swapfile
- Setting up swapspace version 1, size = 1048572 KiB
- no label, UUID=fa7367c1-6089-46a6-ba36-a01d5f2a86a4
-
- [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
-
- # 内容
- /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
-
- [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
-
- /dev/sdb1 none swap defaults 0 0
-
虽然增加swap空间可以在一定程度上提高系统稳定性,但过多的swap空间可能会导致系统频繁地将内存页面交换到磁盘,从而降低性能。如果系统经常出现高swap使用率,但实际物理内存使用率并不高,这可能意味着swap空间过大,导致不必要的磁盘I/O操作。在这种情况下,建议适当减少swap空间可以改善系统性能。
思路:通过创建启用一个较小的swap文件替换原有的swap分区。
- [root@localhost ~]# swapoff -a
-
- 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
-