zoukankan      html  css  js  c++  java
  • Linux交换空间swap讲解

    在上一篇文中,有为大家介绍Linux的物理存储结构,以及如何利用fdisk命令来划分分区,使用mkfs命令来格式化分区,使用mount命令来进行挂载。但是细心的朋友会发现,当我们重启系统之后,发现新增的分区不见了,如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件/etc/fstab中:

    image

    /dev/sdb1 /myFS xfs defaults 0 0
    

    上面命令中,各列字段的含义如下:

    字段 意义
    设备文件 一般为设备的路径+设备名称,也可以写唯一识别码(UUID)
    挂载目录 指定要挂载到的目录,需在挂载前创建好
    格式类型 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
    权限选项 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
    是否备份 若为1则开机后使用dump进行磁盘备份,为0则不备份
    是否自检 若为1则开机后自动进行磁盘自检,为0则不自检

    大家应该都知道,直接从内存中读写数据要比从硬盘读写数据快得多,因此有时候我们更希望所有数据的读写都在内存中完成。然而实际情况中是不可能的,因为内存是有限的,为了解决这一问题,就引出了物理内存与虚拟内存的概念。

    交换空间swap的基本概念

    物理内存就是系统硬件提供的内存大小,是真正的内存。相对于物理内存,在 Linux 下还有一个虚拟内存的概念,虚拟内存是为了满足物理内存的不足而提出的策略,其设计目的是为了解决真实物理内存不足的问题,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为交换空间(又称 swap 空间)。

    image

    [虚拟内存和交换空间的映射关系图]

    作为物理内存的扩展,Linux 会在物理内存不足时,使用交换分区的虚拟内存,更详细地说,就是内核会将暂时内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间。这样一来,物理内存得到了释放,这块内存就可以用于其他目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

    但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。

    Linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

    当然要深入了解Linux的内存机制,我们还需要掌握以下几点内容:

    1. Linux 系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存
    2. Linux 根据“最近最经常使用”的原则,将一些不经常使用的页面文件交换到虚拟内存
      3.交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此一来,虚拟内存中可能没有足够的空间来存储这些交换页面,最终会导致 Linux 出现假死机、服务异常等问题

    swap 配额大小

    因此,合理规划和设计 Linux 内存的使用是非常重要的,关于物理内存和交换空间的大小设置问题,取决于实际所用的硬盘大小,我们看下redhat官方建议:

    Amount of RAM in the system 物理内存 Recommended swap space建议的交换空间大小 Recommended swap space if allowing for hibernation如果开启休眠功能建议的交换空间大小
    ⩽ 2GB 2 times the amount of RAM 3 times the amount of RAM
    > 2GB – 8GB Equal to the amount of RAM 2 times the amount of RAM
    > 8GB – 64GB At least 4 GB 1.5 times the amount of RAM
    > 64GB At least 4 GB Hibernation not recommended

    我们实际在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍。

    如何添加交换分区

    添加交换分区之前,我们依旧可以从/dev/sdb设备进行分区,我这里先分出4G的空间,执行操作过程入下图:

    image

    从上图可以看到,我们分出的第二个分区名称是/dev/sdb2,使用SWAP分区专用的格式化命令mkswap,对新建的主分区进行格式化操作:

    $ mkswap /dev/sdb2

    image

    为了能够提现实验的效果,我们先来看下目前的swap大小是多少:

    $ free -m

    image

    使用swapon命令把准备好的SWAP分区设备正式挂载到系统中。我们再使用 free -m 命令查看交换分区的大小变化(由2047MB增加到6143MB):

    $swapon /dev/sdb2

    image

    同样,为了能够让新的交换分区设备在系统重启后依然生效,我们还需要将如下信息写入到//etc/fstab配置文件中:

    /dev/sdb2 swap swap defaults 0 0 
    

    写入完成之后记得保存文件。

    image

  • 相关阅读:
    linux驱动开发学习一:创建一个字符设备
    如何高效的对有序数组去重
    找到缺失的第一个正整数
    .NET不可变集合已经正式发布
    中国人唯一不认可的成功——就是家庭的和睦,人生的平淡【转】
    自己动手搭建 MongoDB 环境,并建立一个 .NET HelloWorld 程序测试
    ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
    自己动手搭建 Redis 环境,并建立一个 .NET HelloWorld 程序测试
    ServiceStack 介绍
    一步一步实战扩展 ASP.NET Route,实现小写 URL、个性化 URL
  • 原文地址:https://www.cnblogs.com/jiupai-Linux/p/13572697.html
Copyright © 2011-2022 走看看