• Linux: Swap与swappiness


    1. Swap简介

    1.1. 什么是交换,为什么要交换?

    交换(Swapping)是将内存页复制到硬盘上的预配置空间【称为交换空间(Swap-Space)】以释放该内存页的过程。物理内存(the physical memory)和交换空间(the swap space)的组合大小就是可用的虚拟内存(virtual memory)量。

    有两个重要原因导致需要交换:

    • 首先,当系统需要的内存多于物理可用的内存时,内核会换出(swaps out)较少使用的页面,并将内存提供给当前需要内存的应用程序(进程)。
    • 其次,应用程序在其启动阶段使用的大量页面可能仅用于初始化,然后再也不会使用。系统可以换出(swaps out)这些页面并为其他应用程序甚至磁盘缓存释放内存。

            但是,交换(swapping)确实有缺点。与内存相比,磁盘非常慢。内存速度可以以纳秒为单位,而磁盘以毫秒为单位,因此访问磁盘可能比访问物理内存慢数万倍。发生的交换越多,您的系统就越慢。有时,当页面被换出(swapped out),然后很快换入(swapped in),然后再次换出(swapped out)时,会发生过度交换或抖动。在这种情况下,系统正在努力寻找可用内存并同时保持应用程序运行。在这种情况下,仅添加更多 RAM 会有所帮助。

    Linux 有两种形式的交换空间(swap space):交换分区(the swap partition)和交换文件(the swap file)。

    • 交换分区(the swap partition) 是硬盘的一个独立部分,专门用于交换;没有其他文件可以驻留在那里。
    • 交换文件(the swap file) 是文件系统中的一个特殊文件,位于您的系统文件和数据文件之间。

            注意:在阅读下面的内容时候,请区分: 交换空间(swap space), 交换分区(swap partition), 交换文件(swap file) 这三个概念。

    1.2. 查看交换空间(swap space) 的信息

    要查看您有多少交换空间(swap space),请使用命令 swapon -s。输出将如下所示:

    1. Filename Type Size Used Priority
    2. /dev/sda5 partition 859436 0 -1

    每行列出了系统正在使用的一个单独的交换空间(swap space)。这里,

    • Type字段表明这个交换空间是一个分区(partition)而不是一个文件(file)
    • Filename我们看到它在磁盘sda5上。
    • Size 以千字节为单位列出,
    • Used 字段告诉我们已经使用了多少千字节的交换空间(在这种情况下没有)。
    • Priority 告诉 Linux 首先使用哪个交换空间。

            Linux 交换子系统的一大优点是,如果以相同的优先级挂载两个(或更多)交换空间(最好在两个不同的设备上),Linux 将在它们之间交错其交换活动,这可以大大提高交换性能。

    1.3. 添加新的交换分区(swap partition)

            要将额外的交换分区(extra swap partition)添加到您的系统,您首先需要准备它。第一步是确保分区被标记为交换分区(swap partition),第二步是制作交换文件系统(swap filesystem)

    要检查分区是否标记为交换,请以 root 身份运行:

    fdisk -l /dev/hdb

    将 /dev/hdb 替换为系统上带有交换分区的硬盘设备。您应该会看到如下所示的输出:

    1. Device Boot Start End Blocks Id System
    2. /dev/hdb1 2328 2434 859446 82 Linux swap / Solaris

            如果分区未标记为交换分区(swap partition),则需要通过运行 fdisk 并使用t选项来更改它。处理分区时要小心——你不想错误地删除重要的分区或错误地将系统分区的 id 更改为交换。交换分区上的所有数据都将丢失,因此请仔细检查您所做的每项更改。另请注意,Solaris 对其分区使用与 Linux 交换空间相同的 ID,因此请注意不要错误地终止 Solaris 分区。

    一旦分区被标记为交换区,您需要以 root 用户身份使用 mkswap (make swap) 命令准备它:

    mkswap /dev/hdb1

    如果您没有看到任何错误,您的交换空间(swap space)就可以使用了。要立即激活它,请键入:

    swapon /dev/hdb1

            可以通过运行 swapon -s 来验证它是否正在被使用。要在启动时自动挂载交换空间,您必须向 /etc/fstab 文件添加一个条目,该文件包含需要在启动时挂载的文件系统和交换空间的列表。每行的格式为:

            由于交换空间(swap space)是一种特殊类型的文件系统,其中许多参数不适用。对于交换空间,添加:

    /dev/hdb1       none    swap    sw      0       0

    参数说明:

    1. /dev/hdb1 是交换分区(the swap partition)。
    2. 它没有特定的挂载点,因此第二个参数是none
    3. swap类型
    4. 带有sw选项
    5. 并且不使用最后两个参数,因此将它们输入为 0。

    要检查交换空间(swap space)是否自动挂载而无需重新启动,您可以依次运行

    1. 运行swapoff -a 命令 ---> 关闭所有交换空间
    2. 运行 swapon -a 命令 ---> 挂载 /etc/fstab 文件中列出的所有交换空间)
    3. 用 swapon -s 命令 ---> 检查所有的交换空间。

    1.4. 交换文件(Swap file)

    除了交换分区(swap partition),Linux 还支持交换文件(Swap file),您可以以类似于交换分区的方式创建、准备和挂载该文件。

    交换文件(Swap file)的优点是您不需要找到一个空分区或重新分区磁盘来添加额外的交换空间。

    要创建交换文件,请使用 dd 命令创建一个空文件。要创建 1GB 文件,请键入:

    dd if=/dev/zero of=/swapfile bs=1024 count=1048576

    其中:/swapfile 是交换文件的名称,1048576 的计数是以千字节(即1GB)为单位的大小。

    像准备分区一样使用 mkswap 准备交换文件,但这次使用交换文件的名称:

    mkswap /swapfile

    同样,使用 swapon 命令挂载它:swapon /swapfile

    交换文件的 /etc/fstab 条目如下所示:

    /swapfile       none    swap    sw      0       0

    1.5. 我的交换空间(swap space)应该有多大?

    可以在没有交换空间(swap space)的情况下运行 Linux 系统,如果您有大量内存,系统将运行良好; 但如果您用完物理内存,则系统将崩溃,因为它无能为力,所以建议有一个交换空间,特别是因为磁盘空间相对便宜。

    关键问题是多少钱?旧版本的 Unix 类型操作系统(例如 Sun OS 和 Ultrix)需要物理内存两到三倍的交换空间。现代实现(如 Linux)不需要那么多,但如果你配置它,他们可以使用它。一个经验法则如下:

    1. 对于桌面系统,使用双系统内存的交换空间,因为它可以让你运行大量的应用程序(其中许多可能是空闲的并且很容易交换),使得更多 RAM 可用于活动应用程序;
    2. 对于服务器,有较少的可用交换空间(比如物理内存的一半),以便您在需要时可以灵活地进行交换,但要监控使用的交换空间量并在必要时升级您的 RAM;
    3. 对于较旧的台式机(比如只有 128MB),使用尽可能多的交换空间.

    2. 介绍Swappiness

    上面说了当内存不够用的时候会用到Swap分区,那什么时候算是不够用? 切记,不是当内存完全用完了,一点不剩的时候叫做不够用。什么叫做不够用,由Swappiness参数来定。

    注意,这里是以简单的容易理解的方式说Swappiness参数的意义,其实Swappiness准确来说不是这么解释的

    2.1. Swappiness 的通俗解释

    Swappiness 可以设置为 0 到 100 之间的值。

    • swappiness=0: 表示最大限度使用物理内存,然后才是 swap空间,
    • swappiness=100: 表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

            linux的基本默认设置为60,也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能。

            举例: 某笔记本电脑有 16 GB 的内存和 8 GB 的交换空间。如果我在内核参数中使用 60 swappiness,那么在使用大约 6 GB (16G*40% == 6.4G)的内存后,我的机器开始使用交换,这不必要地使我的应用程序变慢。所以,我们应该知道如何更改这个内核参数。

    2.2. swappiness 的权威解释

    关于来自GitHub上最权威的解释:

    This control is used to define how aggressive the kernel will swap memory pages. Higher values will increase aggressiveness, lower values decrease the amount of swap. A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.

    翻译后如下:

    这个参数用于定义内核交换内存页的攻击性。较高的值会增加攻击性,较低的值会减少交换量。当设置为0 表示内核在空闲页和文件备份页的数量小于区域中的高水位线之前不启动交换。

    来自GitHub上代码:https://github.com/torvalds/linux/blob/master/mm/vmscan.c#L176

    1. /*
    2. * From 0 .. 200. Higher means more swappy.
    3. */
    4. int vm_swappiness = 60;

    2.3. swappiness 参数的来源

    Linux 2.6 内核添加了一个名为swappiness的新内核参数,让管理员可以调整 Linux 交换的方式。它是一个从 0 到 100 的数字。

    本质上,较高的值会导致更多的页面被交换,而较低的值会导致更多的应用程序保留在内存中,即使它们处于空闲状态。

    原文:

    In essence, higher values lead to more pages being swapped, and lower values lead to more applications being kept in memory, even if they are idle.

    2.4. 检查 Swappiness 值

    要检查系统上的当前 swappiness 值,请使用以下 cat 命令:

    1. cat /proc/sys/vm/swappiness
    2. # 大多数 Linux 发行版上的默认 swappiness 值为 60

    可以用来确定 swappiness 值的另一个命令是 sysctl :

    1. sysctl vm.swappiness
    2. vm.swappiness = 60

    3. 改变 Swappiness 值

    3.1. 临时更改Swappiness 值

    临时调整的方法如下,我们调成10:

    1. # 方法1:
    2. [root@timeserver ~]# sysctl vm.swappiness=10
    3. vm.swappiness = 10
    4. # 方法2:
    5. [root@timeserver ~]# echo 10 > /proc/sys/vm/swappiness

    新值会立即使用,无需重新启动。 这只是临时调整的方法,重启后会回到默认设置的

    3.2. 永久更改Swappiness 值

    要想永久调整的话,需要在/etc/sysctl.conf修改,加上:

    1. [root@timeserver ~]# cat /etc/sysctl.conf
    2. # Controls the maximum number of shared memory segments, in pages
    3. kernel.shmall = 4294967296
    4. vm.swappiness=10

    激活设置

    [root@timeserver ~]# sysctl -p

    4. 在 Linux 中清除SWAP?

    如果你想清除掉的空间,你可以运行下面的命令:

    swapoff -a && swapon -a

    命令的解释:

    • swapon命令用于激活Linux系统中交换空间,Linux系统的内存管理必须使用交换区来建立虚拟内存。
    • swapoff命令用于关闭指定的交换空间(包括交换文件和交换分区)。swapoff实际上为swapon的符号连接,可用来关闭系统的交换区。

    在Man中关于这两个命令的描述:

    swapon, swapoff - enable/disable devices and files for paging and swapping
    swapon is used to specify devices on which paging and swapping are to take place.
    swapoff disables swapping on the specified devices and files.

    4.1. swapon命令解释

    语法:

    swapon (选项) (参数)

    选项:

    • -a:将/etc/fstab文件中所有设置为swap的设备,启动为交换区;
    • -h:显示帮助;
    • -p<优先顺序>:指定交换区的优先顺序;
    • -s:显示交换区的使用状况;
    • -V:显示版本信息。

    4.2. swapoff命令解释

    语法:

    swapoff (选项) (参数)

    选项:

    • -a:关闭配置文件“/etc/fstab”中所有的交换空间。
  • 相关阅读:
    STM32WB55 BLE双核flash擦写程序深度解析
    【解读】基于PREEvision的诊断设计
    【js】event.target event.cuurenttarget 元素绑定
    leetcode每日一题31
    Netty入门指南之NIO Selector监管
    1404. 将二进制表示减到1的步骤数
    毕业了,感觉自己一无是处,不知道做什么,怎么办?
    1年管理,涨薪70%,只因做好了这件常被忽略的事
    iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
    Echarts图表跟随父容器的变化自适应
  • 原文地址:https://blog.csdn.net/hhd1988/article/details/128020048