1. 引言:
Swap是存储设备上的一块空间(分区),操作系统可以在这里暂存一些内存里放不下的东西。这从某种程度上相当于增加了服务器的可用内存。虽然从swap读写比内存慢,但总比没有好,算是内存不足时一种比较不错的解决方案。如果没有swap,则服务器一旦内存不足,就会开始终止应用以释放内存,甚至会崩溃,这会让你丢失一些还没来得及保存的数据,或者造成宕机。有些应用明确要求系统配置swap以确保数据访问的可靠性。比如说ORACLE数据库。
2. 什么是swap
2.1 Linux对于swap的定义
在 Linux 系统中,Swap(交换空间)是一种磁盘空间,它被用作计算机物理内存(RAM)的补充。当系统的物理内存不够用的时候,内核会将内存中暂时不用的数据块交换到磁盘上的 Swap 空间中,为当前正在运行的程序腾出足够的物理内存,等到需要这些数据时,再将它们从 Swap 空间读回到内存。
2.2 工作原理
基于分页(paging)机制。内存和磁盘上的 Swap 空间都被划分成固定大小的页面(通常是 4KB)。当物理内存不足时,Linux 内核中的内存管理子系统(MMU - Memory Management Unit)会选择一些内存页面,将它们复制到磁盘上的 Swap 区域,同时更新内存页面表(page table),以反映这些页面已经被换出。
例如,假设有一个正在运行的大型数据库应用程序,它占用了大量的内存。当系统同时启动了其他内存密集型程序(如视频编辑软件)时,物理内存可能会不够用。此时,内核会将数据库应用程序中暂时不使用的部分数据页面(比如缓存的数据)交换到 Swap 空间,让视频编辑软件能够获得足够的物理内存来正常运行。
2.3 swap的主要作用
应对内存峰值:对于一些偶尔会出现内存使用高峰的系统,比如 Web 服务器在遭受流量高峰冲击时,Swap 空间可以防止系统因为内存不足而崩溃。即使物理内存已经耗尽,系统仍然可以借助 Swap 空间来维持基本的运行,避免进程被强制终止。
支持大内存需求的程序:一些大型的专业软件(如 3D 建模软件、科学计算软件)可能需要大量的内存来加载数据和执行复杂的运算。当物理内存无法满足其全部需求时,Swap 空间可以作为一种辅助手段,使得这些程序能够在内存受限的系统上运行。
2.4 配置和管理
- 创建 Swap 分区或文件:可以在安装 Linux 系统时创建 Swap 分区,也可以在系统安装后通过命令行工具创建 Swap 文件。例如,使用dd命令创建一个指定大小的文件,再通过mkswap命令将其格式化为 Swap 文件,最后使用swapon命令启用它。
- 调整大小:根据系统的实际需求,可以调整 Swap 空间的大小。如果系统经常因为内存不足而大量使用 Swap 空间,可能需要增加 Swap 大小;反之,如果 Swap 空间很少被使用,可以适当减小它,以节省磁盘空间。后续会详细介绍调整swap分区。
- 监控使用情况:可以使用工具如free -m/free -h命令来查看内存和 Swap 空间的使用情况。free -m会以兆字节(MB)为单位显示系统的内存(包括物理内存和 Swap 空间)总量、已使用量、空闲量等信息。例如,输出结果可能如下:
3. 调整swap分区的大小
3.1 在有未分配磁盘空间的情况下扩展 Swap 分区(针对基于分区的 Swap)
- 步骤一:检查磁盘空间和分区情况
使用fdisk -l命令来查看磁盘分区信息,包括磁盘大小、分区类型和大小等。例如,输出可能会显示出磁盘/dev/sda有多个分区,其中一个是 Swap 分区/dev/sdaX(X 为具体分区号),并且可以看到磁盘上是否还有未分配的空间: - 步骤二:卸载 Swap 分区
在调整大小之前,需要先卸载 Swap 分区。使用swapoff命令,例如,如果 Swap 分区是/dev/sda3,则命令为swapoff /dev/sda3。这一步很重要,因为正在使用的分区是无法进行大小调整的。 - 步骤三:使用分区工具调整大小
可以使用fdisk或parted工具来调整分区大小。
–使用 fdisk 调整:
启动fdisk工具,如fdisk /dev/sda,进入交互式界面。
按d键删除原来的 Swap 分区(这里只是删除分区信息,数据还在磁盘上),记录下分区的起始和结束扇区信息。
按n键创建新的分区,选择分区类型为Linux swap,并根据需要设置起始和结束扇区来扩大分区大小,确保新分区的大小符合要求。
按w键保存并退出fdisk。
–使用 parted 调整:
启动parted工具,如parted /dev/sda。
输入print命令查看分区信息。
输入resizepart命令,然后指定要调整的 Swap 分区编号,按照提示输入新的分区大小(可以使用百分比或具体的大小单位,如 GB、MB 等)。
退出parted工具。 - 步骤四:重新格式化和启用 Swap 分区
分区调整完成后,需要重新格式化新的分区为 Swap 格式。使用mkswap命令,如mkswap /dev/sdaX(X 为调整后的 Swap 分区号)。 - 最后,使用swapon命令启用新的 Swap 分区,如swapon /dev/sdaX。
3.2 通过添加 Swap 文件来增加 Swap 空间(适用于基于文件的 Swap)
- 步骤一:创建新的 Swap 文件
选择一个有足够磁盘空间的位置,例如在/var目录下。使用dd命令创建一个新的文件,如要创建一个大小为 2GB(2048MB)的 Swap 文件,可以使用命令dd if = /dev/zero of = /var/new_swap_file bs = 1M count = 2048。这里if表示输入文件(/dev/zero提供无限的空字节流),of表示输出文件(新的 Swap 文件路径),bs是块大小,count是块的数量。 - 步骤二:设置文件权限和格式化
设置文件权限,使用chmod命令,如chmod 600 /var/new_swap_file,这是为了确保只有 root 用户可以访问该文件。
然后使用mkswap命令格式化文件为 Swap 格式,如mkswap /var/new_swap_file。 - 步骤三:启用新的 Swap 文件
使用swapon命令启用新的 Swap 文件,如swapon /var/new_swap_file。
若要在开机时自动启用这个新的 Swap 文件,可以编辑/etc/fstab文件,添加一行:
/var/new_swap_file swap swap defaults 0 0
3.3 减小 Swap 分区或文件大小(有一定风险,可能导致数据丢失)
- 基于分区的 Swap 减小:
基本步骤与扩展类似,但在使用分区工具(如fdisk或parted)时,是减小分区的大小,并且需要格外小心,因为减小分区大小可能会导致数据丢失。在删除原来的 Swap 分区并创建新的较小分区后,同样要重新格式化(mkswap)和启用(swapon)。 - 基于文件的 Swap 减小:
这相对复杂一些,没有直接减小文件大小的简单方法。一种可能的做法是先创建一个新的较小的 Swap 文件,启用它,然后将数据从原来较大的 Swap 文件迁移到新文件(这可能需要一些复杂的脚本或工具来实现),最后删除原来的大文件。这种操作也有数据丢失的风险,并且在操作过程中要确保系统有足够的内存和 Swap 空间来维持正常运行。
4. swap分区大小设置和物理内存的关系
4.1 基本原则
一般来说,在 Linux 系统中,Swap 分区大小的设置与物理内存大小有关。传统的经验法则是,Swap 分区大小应该是物理内存大小的 1 - 2 倍。例如,如果系统的物理内存是 4GB,那么 Swap 分区可以设置为 4GB - 8GB。这种设置可以为系统在内存使用高峰时期提供足够的 “缓冲” 空间。
4.2 不同物理内存大小下的考虑
- 小内存系统(小于 4GB 物理内存)
对于物理内存较小的系统,如 2GB 或更少,相对较大的 Swap 分区可能更有帮助。可以考虑将 Swap 分区设置为物理内存的 2 倍左右。这是因为小内存系统更容易出现内存不足的情况,较大的 Swap 分区可以在内存紧张时,让更多的进程有地方 “暂存”,避免系统因内存耗尽而频繁崩溃。例如,对于一个具有 1GB 物理内存的系统,设置 2GB 的 Swap 分区可以在一定程度上缓解内存压力。 - 中等内存系统(4GB - 16GB 物理内存)
当物理内存在这个范围内时,Swap 分区大小可以设置为与物理内存相当或略大一些。例如,对于一个 8GB 物理内存的系统,设置 8GB - 12GB 的 Swap 分区是比较合理的。这样的设置可以在系统遇到突发的内存需求增长(如同时打开多个大型应用程序)时,提供一定的补充空间,同时不会因为 Swap 分区过大而占用过多的磁盘空间。 - 大内存系统(大于 16GB 物理内存)
对于具有大量物理内存的系统,如 32GB 或更多,Swap 分区的大小可以相对小一些。可以将 Swap 分区设置为物理内存的 0.5 - 1 倍。这是因为大内存系统通常运行内存密集型的大型应用程序,这些程序对内存的需求很高,但在正常运行时,物理内存足以应对大部分情况。不过,即使是大内存系统,设置一定大小的 Swap 分区仍然是有必要的,主要用于处理一些特殊情况,如程序的内存泄漏或者系统启动时加载大量程序导致的瞬间内存高峰。 - 特殊用途系统的考虑
a. 服务器系统
对于服务器,特别是 Web 服务器、数据库服务器等,Swap 分区的设置要根据服务器的具体用途来确定。如果服务器主要运行的是内存密集型的应用程序(如大型数据库管理系统),并且希望在内存紧张时系统仍能维持基本的服务,那么可以适当增大 Swap 分区。同时,要考虑到服务器磁盘 I/O 性能对 Swap 操作的影响。如果服务器的磁盘 I/O 速度较慢,过大的 Swap 分区可能会导致系统性能下降,因为频繁的 Swap 操作会增加磁盘 I/O 负载。
b. 桌面系统
在桌面系统中,用户可能会同时运行多个应用程序,包括办公软件、浏览器、多媒体软件等。根据用户的使用习惯和物理内存大小来设置 Swap 分区。如果用户经常同时运行多个大型应用程序,如视频编辑软件和 3D 游戏,那么需要设置一个足够大的 Swap 分区来应对可能出现的内存不足情况。
4.个人经验
结合本人多年的工作经验,对swap大小设置建议如下表所示:
5. swap拓展1:可以把 Swap 空间设置到内存盘吗?
可以把 Swap 空间设置到内存盘,但这种做法有利有弊,并且需要根据具体的使用场景和需求来谨慎考虑。
5.1 优点:
- 快速读写:内存盘的读写速度比传统机械硬盘甚至固态硬盘都要快得多。把 Swap 空间设置到内存盘上,可以大大提高 Swap 空间的读写性能,减少因 Swap 操作导致的系统延迟,在一定程度上能够提升系统的整体运行速度。例如,对于一些对内存需求较大且对性能要求较高的应用程序,将 Swap 空间设置到内存盘可以减少因内存不足而进行 Swap 操作时的性能损失。
- 灵活配置:内存盘是基于内存创建的虚拟磁盘,可以根据需要灵活地调整大小和设置参数,方便用户根据系统的实际情况来配置 Swap 空间。
5.2 缺点:
- 内存占用:内存盘本身会占用一部分物理内存,而把 Swap 空间设置到内存盘上又会进一步占用内存资源。如果系统的物理内存本来就比较紧张,这种做法可能会导致可用物理内存更少,反而会影响系统的性能。
- 数据易失:内存盘的数据是存储在内存中的,一旦系统断电或重启,内存盘中的数据将会丢失。如果 Swap 空间中的数据没有及时回写到物理磁盘上,可能会导致数据丢失或损坏,影响系统的稳定性和数据的安全性。
总之,如果系统有足够的物理内存,并且对性能要求较高,可以考虑将 Swap 空间设置到内存盘上,但需要注意做好数据备份和系统管理工作;如果系统的物理内存有限,或者对数据的安全性和稳定性要求较高,那么不建议将 Swap 空间设置到内存盘上。
6. swap拓展2:如何在 Linux 系统中将 Swap 空间设置到内存盘?
- 创建内存盘
使用 mount 命令结合 tmpfs 文件系统来创建内存盘。例如,创建一个大小为 1GB 的内存盘并挂载到 /mnt/memdisk 目录下,可以执行以下命令:
sudo mkdir /mnt/memdisk
sudo mount -t tmpfs -o size=1G tmpfs /mnt/memdisk
上述命令中,-t tmpfs 指定文件系统类型为 tmpfs,-o size=1G 表示设置内存盘的大小为 1GB,tmpfs 是要挂载的文件系统名称,/mnt/memdisk 是挂载点。
- 创建 Swap 文件
在创建好的内存盘目录下,使用 dd 命令创建一个 Swap 文件。例如,创建一个 2GB 大小的 Swap 文件 /mnt/memdisk/swapfile,可以执行以下命令:
sudo dd if=/dev/zero of=/mnt/memdisk/swapfile bs=1M count=2048
此命令中,if=/dev/zero 表示从 /dev/zero 这个虚拟设备读取数据,of=/mnt/memdisk/swapfile 指定输出文件为 /mnt/memdisk/swapfile,bs=1M 表示每个数据块的大小为 1MB,count=2048 表示数据块的数量为 2048 个,这样总的文件大小就是 2048MB(即 2GB)。
-
设置 Swap 文件权限
为了确保安全,需要设置 Swap 文件的权限,只允许 root 用户访问。执行以下命令:
sudo chmod 600 /mnt/memdisk/swapfile -
格式化 Swap 文件
使用 mkswap 命令将创建的文件格式化为 Swap 空间:
sudo mkswap /mnt/memdisk/swapfile -
启用 Swap 文件
使用 swapon 命令启用 Swap 文件:
sudo swapon /mnt/memdisk/swapfile -
设置开机自动挂载
为了使 Swap 文件在系统重启后仍然有效,需要将其添加到 /etc/fstab 文件中。在文件末尾添加以下行:
/mnt/memdisk/swapfile swap swap defaults 0 0
完成以上步骤后,Swap 空间就成功设置到了内存盘上。
**注意事项:**将 Swap 空间设置到内存盘可以提高性能,但由于内存盘的数据在系统重启后会丢失,所以这种设置方式可能不适合需要持久保存 Swap 数据的场景。
本篇完结
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。