0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux系统上内存类型交换空间详解

Linux爱好者 来源:工程师曾玲 2019-02-02 17:31 次阅读

当今无论什么操作系统交换Swap空间是非常常见的。Linux 使用交换空间来增加主机可用的虚拟内存。它可以在常规文件或逻辑卷上使用一个或多个专用交换分区或交换文件。

典型计算机中有两种基本类型的内存。第一种类型,随机存取存储器 (RAM),用于存储计算机使用的数据和程序。只有程序和数据存储在 RAM 中,计算机才能使用它们。随机存储器是易失性存储器;也就是说,如果计算机关闭了,存储在 RAM 中的数据就会丢失。

硬盘是用于长期存储数据和程序的磁性介质。该磁介质可以很好的保存数据;即使计算机断电,存储在磁盘上的数据也会保留下来。CPU(中央处理器)不能直接访问硬盘上的程序和数据;它们必须首先复制到 RAM 中,RAM 是 CPU 访问代码指令和操作数据的地方。在引导过程中,计算机将特定的操作系统程序(如内核、init 或 systemd)以及硬盘上的数据复制到 RAM 中,在 RAM 中,计算机的处理器 CPU 可以直接访问这些数据。

交换空间

交换空间是现代 Linux 系统中的第二种内存类型。交换空间的主要功能是当全部的 RAM 被占用并且需要更多内存时,用磁盘空间代替 RAM 内存。

例如,假设你有一个 8GB RAM 的计算机。如果你启动的程序没有填满 RAM,一切都好,不需要交换。假设你在处理电子表格,当添加更多的行时,你电子表格会增长,加上所有正在运行的程序,将会占用全部的 RAM 。如果这时没有可用的交换空间,你将不得不停止处理电子表格,直到关闭一些其他程序来释放一些 RAM 。

内核使用一个内存管理程序来检测最近没有使用的内存块(内存页)。内存管理程序将这些相对不经常使用的内存页交换到硬盘上专门指定用于“分页”或交换的特殊分区。这会释放 RAM,为输入电子表格更多数据腾出了空间。那些换出到硬盘的内存页面被内核的内存管理代码跟踪,如果需要,可以被分页回 RAM。

Linux 计算机中的内存总量是 RAM + 交换分区,交换分区被称为虚拟内存。

Linux 交换分区类型

Linux 提供了两种类型的交换空间。默认情况下,大多数 Linux 在安装时都会创建一个交换分区,但是也可以使用一个特殊配置的文件作为交换文件。交换分区顾名思义就是一个标准磁盘分区,由 mkswap 命令指定交换空间。

如果没有可用磁盘空间来创建新的交换分区,或者卷组中没有空间为交换空间创建逻辑卷,则可以使用交换文件。这只是一个创建好并预分配指定大小的常规文件。然后运行 mkswap命令将其配置为交换空间。除非绝对必要,否则我不建议使用文件来做交换空间。(LCTT 译注:Ubuntu 近来的版本采用了交换文件而非交换空间,所以我对于这种说法保留看法)

频繁交换

当总虚拟内存(RAM 和交换空间)变得快满时,可能会发生频繁交换。系统花了太多时间在交换空间和 RAM 之间做内存块的页面切换,以至于几乎没有时间用于实际工作。这种情况的典型症状是:系统变得缓慢或完全无反应,硬盘指示灯几乎持续亮起。

使用 free 的命令来显示 CPU 负载和内存使用情况,你会发现 CPU 负载非常高,可能达到系统中 CPU 内核数量的 30 到 40 倍。另一个情况是 RAM 和交换空间几乎完全被分配了。

事实上,查看 SAR(系统活动报告)数据也可以显示这些内容。在我的每个系统上都安装 SAR ,并将这些用于数据分析。

交换空间的正确大小是多少?

许多年前,硬盘上分配给交换空间大小是计算机上的 RAM 的两倍(当然,这是大多数计算机的 RAM 以 KB 或 MB 为单位的时候)。因此,如果一台计算机有 64KB 的 RAM,应该分配 128KB 的交换分区。该规则考虑到了这样的事实情况,即 RAM 大小在当时非常小,分配超过 2 倍的 RAM 用于交换空间并不能提高性能。使用超过两倍的 RAM 进行交换,比实际执行有用的工作的时候,大多数系统将花费更多的时间。

RAM 现在已经很便宜了,如今大多数计算机的 RAM 都达到了几十亿字节。我的大多数新电脑至少有 8GB 内存,一台有 32GB 内存,我的主工作站有 64GB 内存。我的旧电脑有 4 到 8GB 的内存。

当操作具有大量 RAM 的计算机时,交换空间的限制性能系数远低于 2 倍。Fedora 28 在线安装指南 定义了当前关于交换空间分配的方法。下面内容是我提出的建议。

下表根据系统中的 RAM 大小以及是否有足够的内存让系统休眠,提供了交换分区的推荐大小。建议的交换分区大小是在安装过程中自动建立的。但是,为了满足系统休眠,您需要在自定义分区阶段编辑交换空间。

表 1: Fedora 28 文档中推荐的系统交换空间

Linux系统上内存类型交换空间详解

在上面列出的每个范围之间的边界(例如,具有 2GB、8GB 或 64GB 的系统 RAM),请根据所选交换空间和支持休眠功能请谨慎使用。如果你的系统资源允许,增加交换空间可能会带来更好的性能。

当然,大多数 Linux 管理员对多大的交换空间量有自己的想法。下面的表2 包含了基于我在多种环境中的个人经历所做出的建议。这些可能不适合你,但是和表 1 一样,它们可能对你有所帮助。

表 2: 作者推荐的系统交换空间

Linux系统上内存类型交换空间详解

这两个表中共同点,随着 RAM 数量的增加,超过某一点增加更多交换空间只会导致在交换空间几乎被全部使用之前就发生频繁交换。根据以上建议,则应尽可能添加更多 RAM,而不是增加更多交换空间。如类似影响系统性能的情况一样,请使用最适合你的建议。根据 Linux 环境中的条件进行测试和更改是需要时间和精力的。

向非 LVM 磁盘环境添加更多交换空间

面对已安装 Linux 的主机并对交换空间的需求不断变化,有时有必要修改系统定义的交换空间的大小。此过程可用于需要增加交换空间大小的任何情况。它假设有足够的可用磁盘空间。此过程还假设磁盘分区为 “原始的” EXT4 和交换分区,而不是使用逻辑卷管理(LVM)。

基本步骤很简单:

关闭现有的交换空间。

创建所需大小的新交换分区。

重读分区表。

将分区配置为交换空间。

添加新分区到 /etc/fstab。

打开交换空间。

应该不需要重新启动机器。

为了安全起见,在关闭交换空间前,至少你应该确保没有应用程序在运行,也没有交换空间在使用。free 或 top 命令可以告诉你交换空间是否在使用中。为了更安全,您可以恢复到运行级别 1 或单用户模式。

使用关闭所有交换空间的命令关闭交换分区:

swapoff -a

现在查看硬盘上的现有分区。

fdisk -l

这将显示每个驱动器上的分区表。按编号标识当前的交换分区。

使用以下命令在交互模式下启动 fdisk:

fdisk /dev/

例如:

fdisk /dev/sda

此时,fdisk 是交互方式的,只在指定的磁盘驱动器上进行操作。

使用 fdisk 的 p 子命令验证磁盘上是否有足够的可用空间来创建新的交换分区。硬盘上的空间以 512 字节的块以及起始和结束柱面编号的形式显示,因此您可能需要做一些计算来确定分配分区之间和末尾的可用空间。

使用 n 子命令创建新的交换分区。fdisk 会问你开始柱面。默认情况下,它选择编号最低的可用柱面。如果你想改变这一点,输入开始柱面的编号。

fdisk 命令允许你以多种格式输入分区的大小,包括最后一个柱面号或字节、KB 或 MB 的大小。例如,键入 4000M ,这将在新分区上提供大约 4GB 的空间,然后按回车键。

使用 p 子命令来验证分区是否按照指定的方式创建的。请注意,除非使用结束柱面编号,否则分区可能与你指定的不完全相同。fdisk 命令只能在整个柱面上增量的分配磁盘空间,因此你的分区可能比你指定的稍小或稍大。如果分区不是您想要的,你可以删除它并重新创建它。

现在指定新分区是交换分区了 。子命令 t 允许你指定定分区的类型。所以输入 t,指定分区号,当它要求十六进制分区类型时,输入 82,这是 Linux 交换分区类型,然后按回车键。

当你对创建的分区感到满意时,使用 w 子命令将新的分区表写入磁盘。fdisk 程序将退出,并在完成修改后的分区表的编写后返回命令提示符。当 fdisk 完成写入新分区表时,会收到以下消息:

The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.

The kernel still uses the old table.

The new table will be used at the next reboot.

Syncing disks.

此时,你使用 partprobe 命令强制内核重新读取分区表,这样就不需要执行重新启动机器。

partprobe

使用命令 fdisk -l 列出分区,新交换分区应该在列出的分区中。确保新的分区类型是 “Linux swap”。

修改 /etc/fstab 文件以指向新的交换分区。如下所示:

LABEL=SWAP-sdaX swap swap defaults 0 0

其中 X 是分区号。根据新交换分区的位置,添加以下内容:

/dev/sdaY swap swap defaults 0 0

请确保使用正确的分区号。现在,可以执行创建交换分区的最后一步。使用 mkswap 命令将分区定义为交换分区。

mkswap /dev/sdaY

最后一步是使用以下命令启用交换空间:

swapon -a

你的新交换分区现在与以前存在的交换分区一起在线。您可以使用 free 或top 命令来验证这一点。

在 LVM 磁盘环境中添加交换空间

如果你的磁盘使用 LVM ,更改交换空间将相当容易。同样,假设当前交换卷所在的卷组中有可用空间。默认情况下,LVM 环境中的 Fedora Linux 在安装过程将交换分区创建为逻辑卷。您可以非常简单地增加交换卷的大小。

以下是在 LVM 环境中增加交换空间大小的步骤:

关闭所有交换空间。

增加指定用于交换空间的逻辑卷的大小。

为交换空间调整大小的卷配置。

启用交换空间。

首先,让我们使用 lvs 命令(列出逻辑卷)来验证交换空间是否存在以及交换空间是否是逻辑卷。

Linux系统上内存类型交换空间详解

你可以看到当前的交换空间大小为 8GB。在这种情况下,我们希望将 2GB 添加到此交换卷中。首先,停止现有的交换空间。如果交换空间正在使用,终止正在运行的程序。

swapoff -a

现在增加逻辑卷的大小。

[root@studentvm1 ~]# lvextend -L +2G /dev/mapper/fedora_studentvm1-swap

Size of logical volume fedora_studentvm1/swap changed from 8.00 GiB (2048 extents) to 10.00 GiB (2560 extents)。

Logical volume fedora_studentvm1/swap successfully resized.

[root@studentvm1 ~]#

运行 mkswap 命令将整个 10GB 分区变成交换空间。

[root@studentvm1 ~]# mkswap /dev/mapper/fedora_studentvm1-swap

mkswap: /dev/mapper/fedora_studentvm1-swap: warning: wiping old swap signature.

Setting up swapspace version 1, size = 10 GiB (10737414144 bytes)

no label, UUID=3cc2bee0-e746-4b66-aa2d-1ea15ef1574a

[root@studentvm1 ~]#

重新启用交换空间。

[root@studentvm1 ~]# swapon -a

[root@studentvm1 ~]#

现在,使用 lsblk 命令验证新交换空间是否存在。同样,不需要重新启动机器。

Linux系统上内存类型交换空间详解

您也可以使用 swapon -s 命令或 top、free 或其他几个命令来验证这一点。

Linux系统上内存类型交换空间详解

请注意,不同的命令以不同的形式显示或要求输入设备文件。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7122

    浏览量

    161927
  • Linux
    +关注

    关注

    87

    文章

    10981

    浏览量

    206689
  • 内存
    +关注

    关注

    8

    文章

    2761

    浏览量

    72702

原文标题:Linux 系统上交换空间的介绍

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux内存管理是什么,Linux内存管理详解

    Linux内存管理 Linux内存管理是一个非常复杂的过程,主要分成两个大的部分:内核的内存管理和进程虚拟
    的头像 发表于 05-11 17:54 5271次阅读
    <b class='flag-5'>Linux</b>的<b class='flag-5'>内存</b>管理是什么,<b class='flag-5'>Linux</b>的<b class='flag-5'>内存</b>管理<b class='flag-5'>详解</b>

    关于Linux内存管理的详细介绍

    Linux内存管理是指对系统内存的分配、释放、映射、管理、交换、压缩等一系列操作的管理。在Linux
    发表于 03-06 09:28 868次阅读

    一文详解Linux虚拟内存技术

      以存储单元为单位来管理显然不现实,因此Linux把虚存空间分成若干个大小相等的存储分区,Linux把这样的分区叫做页。为了换入、换出的方便,物理内存也就按页的大小分成若干个块。由于
    发表于 07-17 17:29 405次阅读
    一文<b class='flag-5'>详解</b><b class='flag-5'>Linux</b>虚拟<b class='flag-5'>内存</b>技术

    查看Linux系统内存使用情况的几种方法

    Linux系统中,内存监控是优化系统性能的关键。本文为你介绍12种方法,帮助你全面掌握Linux系统
    的头像 发表于 11-13 09:30 1667次阅读
    查看<b class='flag-5'>Linux</b><b class='flag-5'>系统</b><b class='flag-5'>内存</b>使用情况的几种方法

    Linux内核地址映射模型与Linux内核高端内存详解

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟
    发表于 05-08 10:33 3325次阅读
    <b class='flag-5'>Linux</b>内核地址映射模型与<b class='flag-5'>Linux</b>内核高端<b class='flag-5'>内存</b><b class='flag-5'>详解</b>

    Linux内存点滴 用户进程内存空间

    进程都有完全属于自己的,独立的,不***扰的内存空间。此空间,被分成几个段(Segment),分别是Text, Data, BSS, Heap, Stack。用户进程内存空间,也是系统
    发表于 08-14 16:23

    Linux对进程进行内存分析和内存泄漏定位

    、进程内存在32位操作系统中,每个进程拥有4G的虚拟内存空间,其中0~3GB是每个进程的私有用户空间,这个空间
    发表于 07-09 08:15

    浅析linux内存释放和使用限制

    1、内存运行机制1)物理内存和虚拟内存物理内存就是系统硬件提供的内存大小,是真正的
    发表于 07-11 07:50

    Linux内存系统---走进Linux 内存

    Linux内存系统---走进Linux 内存 1、内存是什么?1)
    发表于 08-26 08:05

    Linux设备驱动开发详解》第11章、内存与IO访问

    Linux设备驱动开发详解》第11章、内存与IO访问
    发表于 10-27 11:27 6次下载
    《<b class='flag-5'>Linux</b>设备驱动开发<b class='flag-5'>详解</b>》第11章、<b class='flag-5'>内存</b>与IO访问

    高端内存详解linux用户空间与内核空间

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟
    发表于 04-28 17:33 838次阅读
    高端<b class='flag-5'>内存</b>的<b class='flag-5'>详解</b>:<b class='flag-5'>linux</b>用户<b class='flag-5'>空间</b>与内核<b class='flag-5'>空间</b>

    Linux操作系统知识讲解:走进linux 内存地址空间

    Linux操作系统知识讲解:走进linux 内存地址空间
    的头像 发表于 08-28 10:45 4690次阅读
    <b class='flag-5'>Linux</b>操作<b class='flag-5'>系统</b>知识讲解:走进<b class='flag-5'>linux</b> <b class='flag-5'>内存</b>地址<b class='flag-5'>空间</b>

    Linux上使用和不使用交换空间的区别

    我们知道Linux内核使用交换空间而不是RAM内存的时候会严重降低性能。那么,有人可能会问,既然我有足够多的可用内存,删除
    的头像 发表于 12-05 16:59 1272次阅读

    如何解决内存碎片与内存交换效率慢的问题

    内存分页 分段的好处是能产生连续的内存空间,但是会出现大量内存碎片与内存交换效率低的问题 先思考一下怎么解决这两个问题,
    的头像 发表于 10-09 16:57 537次阅读
    如何解决<b class='flag-5'>内存</b>碎片与<b class='flag-5'>内存</b><b class='flag-5'>交换</b>效率慢的问题

    Linux 内存管理总结

    一、Linux内存管理概述 Linux内存管理是指对系统内存的分配、释放、映射、管理、
    的头像 发表于 11-10 14:58 238次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>内存</b>管理总结