《Linux从小白到高手》综合应用篇:深入详解Linux swap及其调整优化

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 配置和管理

  1. 创建 Swap 分区或文件:可以在安装 Linux 系统时创建 Swap 分区,也可以在系统安装后通过命令行工具创建 Swap 文件。例如,使用dd命令创建一个指定大小的文件,再通过mkswap命令将其格式化为 Swap 文件,最后使用swapon命令启用它。
  2. 调整大小:根据系统的实际需求,可以调整 Swap 空间的大小。如果系统经常因为内存不足而大量使用 Swap 空间,可能需要增加 Swap 大小;反之,如果 Swap 空间很少被使用,可以适当减小它,以节省磁盘空间。后续会详细介绍调整swap分区。
  3. 监控使用情况:可以使用工具如free -m/free -h命令来查看内存和 Swap 空间的使用情况。free -m会以兆字节(MB)为单位显示系统的内存(包括物理内存和 Swap 空间)总量、已使用量、空闲量等信息。例如,输出结果可能如下:
    在这里插入图片描述

3. 调整swap分区的大小

3.1 在有未分配磁盘空间的情况下扩展 Swap 分区(针对基于分区的 Swap)

  1. 步骤一:检查磁盘空间和分区情况
    使用fdisk -l命令来查看磁盘分区信息,包括磁盘大小、分区类型和大小等。例如,输出可能会显示出磁盘/dev/sda有多个分区,其中一个是 Swap 分区/dev/sdaX(X 为具体分区号),并且可以看到磁盘上是否还有未分配的空间:
  2. 步骤二:卸载 Swap 分区
    在调整大小之前,需要先卸载 Swap 分区。使用swapoff命令,例如,如果 Swap 分区是/dev/sda3,则命令为swapoff /dev/sda3。这一步很重要,因为正在使用的分区是无法进行大小调整的。
  3. 步骤三:使用分区工具调整大小
    可以使用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工具。
  4. 步骤四:重新格式化和启用 Swap 分区
    分区调整完成后,需要重新格式化新的分区为 Swap 格式。使用mkswap命令,如mkswap /dev/sdaX(X 为调整后的 Swap 分区号)。
  5. 最后,使用swapon命令启用新的 Swap 分区,如swapon /dev/sdaX。

3.2 通过添加 Swap 文件来增加 Swap 空间(适用于基于文件的 Swap)

  1. 步骤一:创建新的 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是块的数量。
  2. 步骤二:设置文件权限和格式化
    设置文件权限,使用chmod命令,如chmod 600 /var/new_swap_file,这是为了确保只有 root 用户可以访问该文件。
    然后使用mkswap命令格式化文件为 Swap 格式,如mkswap /var/new_swap_file。
  3. 步骤三:启用新的 Swap 文件
    使用swapon命令启用新的 Swap 文件,如swapon /var/new_swap_file。
    若要在开机时自动启用这个新的 Swap 文件,可以编辑/etc/fstab文件,添加一行:
/var/new_swap_file swap swap defaults 0 0

3.3 减小 Swap 分区或文件大小(有一定风险,可能导致数据丢失)

  1. 基于分区的 Swap 减小:
    基本步骤与扩展类似,但在使用分区工具(如fdisk或parted)时,是减小分区的大小,并且需要格外小心,因为减小分区大小可能会导致数据丢失。在删除原来的 Swap 分区并创建新的较小分区后,同样要重新格式化(mkswap)和启用(swapon)。
  2. 基于文件的 Swap 减小:
    这相对复杂一些,没有直接减小文件大小的简单方法。一种可能的做法是先创建一个新的较小的 Swap 文件,启用它,然后将数据从原来较大的 Swap 文件迁移到新文件(这可能需要一些复杂的脚本或工具来实现),最后删除原来的大文件。这种操作也有数据丢失的风险,并且在操作过程中要确保系统有足够的内存和 Swap 空间来维持正常运行。

4. swap分区大小设置和物理内存的关系

4.1 基本原则

一般来说,在 Linux 系统中,Swap 分区大小的设置与物理内存大小有关。传统的经验法则是,Swap 分区大小应该是物理内存大小的 1 - 2 倍。例如,如果系统的物理内存是 4GB,那么 Swap 分区可以设置为 4GB - 8GB。这种设置可以为系统在内存使用高峰时期提供足够的 “缓冲” 空间。

4.2 不同物理内存大小下的考虑

  1. 小内存系统(小于 4GB 物理内存)
    对于物理内存较小的系统,如 2GB 或更少,相对较大的 Swap 分区可能更有帮助。可以考虑将 Swap 分区设置为物理内存的 2 倍左右。这是因为小内存系统更容易出现内存不足的情况,较大的 Swap 分区可以在内存紧张时,让更多的进程有地方 “暂存”,避免系统因内存耗尽而频繁崩溃。例如,对于一个具有 1GB 物理内存的系统,设置 2GB 的 Swap 分区可以在一定程度上缓解内存压力。
  2. 中等内存系统(4GB - 16GB 物理内存)
    当物理内存在这个范围内时,Swap 分区大小可以设置为与物理内存相当或略大一些。例如,对于一个 8GB 物理内存的系统,设置 8GB - 12GB 的 Swap 分区是比较合理的。这样的设置可以在系统遇到突发的内存需求增长(如同时打开多个大型应用程序)时,提供一定的补充空间,同时不会因为 Swap 分区过大而占用过多的磁盘空间。
  3. 大内存系统(大于 16GB 物理内存)
    对于具有大量物理内存的系统,如 32GB 或更多,Swap 分区的大小可以相对小一些。可以将 Swap 分区设置为物理内存的 0.5 - 1 倍。这是因为大内存系统通常运行内存密集型的大型应用程序,这些程序对内存的需求很高,但在正常运行时,物理内存足以应对大部分情况。不过,即使是大内存系统,设置一定大小的 Swap 分区仍然是有必要的,主要用于处理一些特殊情况,如程序的内存泄漏或者系统启动时加载大量程序导致的瞬间内存高峰。
  4. 特殊用途系统的考虑
    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 优点:

  1. 快速读写:内存盘的读写速度比传统机械硬盘甚至固态硬盘都要快得多。把 Swap 空间设置到内存盘上,可以大大提高 Swap 空间的读写性能,减少因 Swap 操作导致的系统延迟,在一定程度上能够提升系统的整体运行速度。例如,对于一些对内存需求较大且对性能要求较高的应用程序,将 Swap 空间设置到内存盘可以减少因内存不足而进行 Swap 操作时的性能损失。
  2. 灵活配置:内存盘是基于内存创建的虚拟磁盘,可以根据需要灵活地调整大小和设置参数,方便用户根据系统的实际情况来配置 Swap 空间。

5.2 缺点:

  1. 内存占用:内存盘本身会占用一部分物理内存,而把 Swap 空间设置到内存盘上又会进一步占用内存资源。如果系统的物理内存本来就比较紧张,这种做法可能会导致可用物理内存更少,反而会影响系统的性能。
  2. 数据易失:内存盘的数据是存储在内存中的,一旦系统断电或重启,内存盘中的数据将会丢失。如果 Swap 空间中的数据没有及时回写到物理磁盘上,可能会导致数据丢失或损坏,影响系统的稳定性和数据的安全性。
    总之,如果系统有足够的物理内存,并且对性能要求较高,可以考虑将 Swap 空间设置到内存盘上,但需要注意做好数据备份和系统管理工作;如果系统的物理内存有限,或者对数据的安全性和稳定性要求较高,那么不建议将 Swap 空间设置到内存盘上。

6. swap拓展2:如何在 Linux 系统中将 Swap 空间设置到内存盘?

  1. 创建内存盘
    使用 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 是挂载点。

  1. 创建 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)。

  1. 设置 Swap 文件权限
    为了确保安全,需要设置 Swap 文件的权限,只允许 root 用户访问。执行以下命令:
    sudo chmod 600 /mnt/memdisk/swapfile

  2. 格式化 Swap 文件
    使用 mkswap 命令将创建的文件格式化为 Swap 空间:
    sudo mkswap /mnt/memdisk/swapfile

  3. 启用 Swap 文件
    使用 swapon 命令启用 Swap 文件:
    sudo swapon /mnt/memdisk/swapfile

  4. 设置开机自动挂载
    为了使 Swap 文件在系统重启后仍然有效,需要将其添加到 /etc/fstab 文件中。在文件末尾添加以下行:
    /mnt/memdisk/swapfile swap swap defaults 0 0
    完成以上步骤后,Swap 空间就成功设置到了内存盘上。
    **注意事项:**将 Swap 空间设置到内存盘可以提高性能,但由于内存盘的数据在系统重启后会丢失,所以这种设置方式可能不适合需要持久保存 Swap 数据的场景。

本篇完结

码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,家人们的点赞和关注是我笔耕不辍的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC学习笔记(一)

一、SpringMVC的基本概念 (一)三层架构和MVC 1、三层架构概述 我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中&…

小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程

一、概述 【软件资源文件下载在文章最后】 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程 点餐软件以其实用的功能和简便的操作,为小型餐饮店提供了高效的点餐管理解决方案,提高了工作效率和服务质量 ‌点餐管理‌:支持电…

【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--角色可访问接口管理

咱们继续来编写孢子记账的简易权限,这篇文章中我们将编写角色可访问接口的管理API,同样我不会把完整的代码全都列出来,只会列出部分代码,其余代码我希望大家能自己手动编写,然后对比项目代码。废话不多说,开…

Linux上Python使用MySQLdb包连接MySQL5.7和MySQL8的问题

在一台安装有MySQL8的Linux上用MySQLdb包连接MySQL5.7,连接参数中加上ssl_mode‘DISABLED’,能正常连接;不加ssl_mode参数,会报 而在连接MySQL8时加不加ssl_mode都能正常连接,但在使用过程,加了ssl_mode参数&#xff…

列表(list)

一、前言 本次博客主要讲解 list 容器的基本操作、常用接口做一个系统的整理,结合具体案例熟悉自定义内部排序方法的使用。如有任何错误,欢迎在评论区指出,我会积极改正。 二、什么是list list是C的一个序列容器,插入和删除元素…

spring使用xml文件整合事务+druid+mybatis

1.事务 事务(Transaction)是数据库管理系统中的一个重要概念,它表示一组不可分割的操作序列,这些操作要么全部执行成功,要么全部不执行,以确保数据库从一个一致性状态转换到另一个一致性状态。事务具有以下…

大语言模型LLM综述

一、LM主要发展阶段 1.1、统计语言模型SLM 基于统计学习方法,基本思想是基于马尔可夫假设HMM建立词概率预测模型。如n-gram语言模型 1.2、神经语言模型NLM 基于神经网络来做词的分布式表示。如word2vec模型 1.3、 预训练语言模型PLM 预训练一个网络模型来做词表…

【Jenkins实战】Windows安装服务启动失败

写此篇短文,望告诫后人。 如果你之前装过Jenkins,出于换域账号/本地帐号的原因想重新安装,你大概率会遇上一次Jenkins服务启动失败提示: Jenkins failed to start - Verify that you have sufficient privileges to start system…

Linux kernel 堆溢出利用方法(二)

前言 本文我们通过我们的老朋友heap_bof来讲解Linux kernel中off-by-null的利用手法。在通过讲解另一道相对来说比较困难的kernel off-by-null docker escape来深入了解这种漏洞的利用手法。(没了解过docker逃逸的朋友也可以看懂,毕竟有了root权限后&a…

微服务(一)

目录 1.认识微服务 1.1.单体架构 1.2.微服务 1.3.SpringCloud SpringCloud版本 SpringBoot版本 2.服务注册和发现 2.1.注册中心原理 2.2.Nacos注册中心 2.3.服务注册 2.3.1.添加依赖 2.3.2.配置Nacos 2.4.服务发现 2.4.1.引入依赖 2.4.2.配置Nacos地址 2.4.3.发…

ubontu--cuDNN安装

1. 下载 cuDNN https://developer.nvidia.com/cudnn 2. 拷贝到服务器/home/<username>文件夹下 解压缩到当前文件夹&#xff1a; tar -xvf cudnn-linux-x86_64-9.5.1.17_cuda11-archive.tar.xz复制头文件和库文件到cuda安装目录/usr/local/cuda/ sudo cp /home/usern…

Vue 批量注册组件实现动态组件技巧

介绍 Vue 动态组件的应用场景很多,可应用于动态页签,动态路由等场景,其核心原理是批量注册。在Vue2和Vue3中实现原理相同,只是语法略有差异。 Vue2 实现 基于 webpack require.context() 是webpack提供的一个自动导入的API 参数1&#xff1a;加载的文件目录 参数2&#xff…

WEB攻防-通用漏洞SQL读写注入MYSQLMSSQLPostgraSQL

知识点&#xff1a; 1、SQL注入-MYSQL数据库&#xff1b; 2、SQL注入-MSSQL数据库&#xff1b; 3、SQL注入-PostgreSQL数据库&#xff1b; 首先要找到注入点 详细点&#xff1a; Access无高权限注入点-只能猜解&#xff0c;还是暴力猜解 MYSQL&#xff0c;PostgreSQL&am…

NocoBase 本周更新汇总:提升工作流易用性

汇总一周产品更新日志&#xff0c;最新发布可以前往我们的博客查看。 NocoBase 目前更新包括两个分支&#xff1a;main 和 next 。 main &#xff1a;截止目前最稳定的版本&#xff0c;推荐安装此版本。 next&#xff1a;内测版&#xff0c;包含一些未发布的新特性&#xff…

python高级之面向对象编程

一、面向过程与面向对象 面向过程和面向对象都是一种编程方式&#xff0c;只不过再设计上有区别。 1、面向过程pop&#xff1a; 举例&#xff1a;孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃饭 8. 妈妈给孩子送学校…

❤React-React 组件基础(类组件)

❤React-React 组件基础 1、组件化开发介绍 组件化开发思想&#xff1a;分而治之 React的组件按照不同的方式可以分成类组件&#xff1a; 划分方式一&#xff08;按照组件的定义方式&#xff09; 函数组件(Functional Component )和类组件(Class Component)&#xff1b; …

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战

目录 前言 一、原始的处理办法 1、使用Set方法来转换 2、使用构造方法转换 二、基于ModelMapper的动态转换 1、ModelMapper简介 2、集成到项目中 3、Shapefile属性读取 三、总结 前言 在现代软件开发中&#xff0c;尤其是在多层架构中&#xff0c;经常需要将数据从一个…

Arduino IDE Windows 系统 离线安装 esp32 开发板 亲测好用。

1、前提条件需要具备特殊网络。 2、官方文档地址&#xff1a;Installing - - — Arduino ESP32 latest documentation 3、系统&#xff1a;Windows10 Arduino IDE 版本2.3.3 之前安装的esp32开发板的版本是2.0.13&#xff0c;由于之前没有接触过esp32开发&#xff0c;也没…

期权懂|请问如何用期权进行风险管理?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 请问如何用期权进行风险管理&#xff1f; 一、期权可以选择交易活跃的期权合约进行风险管理&#xff1a; 对于初级投资者来说&#xff0c;选择交易活跃的期权合约是非常重要的。…

GNU构建系统和Autotool

1、前言 经常使用Linux的开发人员或者运维人员&#xff0c;可能对configure->make->make install相当熟悉。事实上&#xff0c;这叫GNU构建系统&#xff0c;利用脚本和make程序在特定平台上构建软件。这种方式成为一种习惯&#xff0c;被广泛使用。本文从用户视角和开发…