精华内容
下载资源
问答
  • Linux禁用内存交换

    千次阅读 2019-11-24 20:53:16
    Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。Swap分区在系统的物理内存(这里应该是运行内存)不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的...

    Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。Swap分区在系统的物理内存(这里应该是运行内存)不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。

    查看swap的使用情况

    free 命令主要是用来査看内存和 swap 分区的使用情况的

    输入命令

    [root@VM_0_16_centos ~]# free -m
    

    返回结果

    
                  total        used        free      shared  buff/cache   available
    Mem:            991          84         600           0         306         763
    Swap:             0           0           0
    [root@VM_0_16_centos ~]# 
    
    

    参数解析

    参数说明
    total总内存
    used已使用内存
    free空闲的内存
    shared共享内存
    buff/cache是指缓冲内存数/缓存内存数,单位是KB
    available实际可用的内存

    共享内存(Shared)

    在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存

    缓冲(buffers)

    磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。

    缓存(cached)

    把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。

    缓冲和缓存的区别

    简单来讲,cached 是给读取数据时加速的,buffers 是给写入数据加速的。

    cached是指把读取出来的数据保存在内存中,当再次读取时,不用读取硬盘而直接从内存中读取,加速了数据的读取过程;

    buffers是指在写入数据时,先把分散的写入操作保存到内存中,当达到一定程度后再集中写入硬盘,减少了磁盘碎片和硬盘的反复寻道,加速了数据的写入过程。

    临时性的调整swap

    一种简单粗暴的方法是设置swap空间为0。但是swap在系统崩溃的时候提供了安全机制,并且会尝试阻止系统因为内存溢出而杀掉进程。所以有些情况可能需要开启swap。这个时候我们需要调整vm.swappiness来尝试降低内存交换的积极性

    关闭swap

    禁用swap

    sudo swapoff -a
    

    启用swap

    sudo swapon -a
    

    查看交换分区状态

    sudo free -m
    

    调整swappiness

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

    查询swappiness值

    swappiness的默认值根据系统以及版本不同结果不一样(本人的腾讯云为30、阿里云为0)

    [root@VM_0_16_centos ~]# cat /proc/sys/vm/swappiness
    30
    

    设置swappiness值

    用下面命令可以临时的把swappiness值修改为Elasticsearch文档要说明的1

    [root@VM_0_16_centos ~]# sysctl vm.swappiness=1
    vm.swappiness = 1
    [root@VM_0_16_centos ~]# cat /proc/sys/vm/swappiness
    1
    

    上面对swap的操作并非永久的,在服务器重启之后配置将被还原,假如需要永久性的修改其参数需要用下面的方式

    永久性的设置swap

    永久性禁用swap

    修改/etc/fstab文件

    vim /etc/fstab
    

    注释掉包含单词swap的所有行

    调整swappiness

    执行命令编辑sysctl.conf文件

    vim /etc/sysctl.conf 
    

    在此参数修改为你需要的数据

    vm.swappiness = 10
    

    注意此时查询的时候还是之前的配置

    [root@VM_0_16_centos ~]# cat /proc/sys/vm/swappiness
    1
    

    需要重启服务或者是使用下面的命令使之生效

    sysctl -p
    

    个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容。假如我的这篇内容对你有任何帮助的话,麻烦给我点一个赞。你的点赞就是我前进的动力。

    展开全文
  • 内存覆盖和内存交换

    千次阅读 2018-07-12 15:32:32
    覆盖和交换技术是在多道程序环境下用来扩充内存的两种方法。覆盖技术主要用在早期的操作系统中,而交换技术则在现代操作系统中仍具有较强的生命力。1、内存覆盖(Overlay)在早期的计算机系统中,主存容量很小。虽然...

    覆盖交换技术是在多道程序环境下用来扩充内存的两种方法。

    覆盖技术主要用在早期的操作系统中,而交换技术则在现代操作系统中仍具有较强的生命力。

    1、内存覆盖(Overlay)

    在早期的计算机系统中,主存容量很小。虽然主存中仅存放一道用户程序,但是存储空间放不下用户进程的现象也经常发生。这一矛盾可以用覆盖技术来解决。覆盖的基本思想是:由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序), 因此可以把用户空间分成一个固定区若干个覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。

    ----  覆盖技术的实现是把程序划分为若干个功能上相对独立的程序段,按照其自身的逻辑结构使那些不会同时运行的程序段共享同一块内存区域。程序段先保存在磁盘上,当有关程序的前一部分执行结束后,把后续程序段调入内存,覆盖前面的程序段。

    ----  所谓覆盖,就是把一个大的程序划分为一系列覆盖,每个覆盖就是一个相对独立的程序单位,把程序执行时并不要求同时装入内存的覆盖组成一组,称为覆盖段一个覆盖段内的覆盖共享同一存储区域该区域成为覆盖区,它与覆盖段一一对应。显然,为了使一个覆盖区能为相应覆盖段中的每个覆盖在不同时刻共享,其大小应由覆盖段中的最大覆盖来确定。

    ---- 覆盖技术要求程序员必须把一个程序划分为不同的程序段,并规定好它们的执行和覆盖顺序,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。

    例如,一个用户程序由6个模块组成,下图给出了各个模块的调用关系,Main模块是一个独立的段,其调用A和B模块,A和B是互斥被调用的两个模块。在A模块执行过程中,调用C模块;而在B模块执行过程中,它可能调用D或E模块(D和E模块也是互斥被调用的)。为该用户程序建立的覆盖结构如下:Main模块是常驻段,其余部分组成两个覆盖段。

           

    由以上推理可知,A和B模块组成覆盖段1,C、D和E组成覆盖段2。为了实现真正覆盖,相应的覆盖区应为每个覆盖段中最大覆盖的大小。覆盖技术的特点是打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行。

    2、内存交换(Swapping)

    交换(对换)的基本思想是:

    ---- 把处于等待(阻塞)状态(或在CPU调度原则下被剥夺运行权利)的程序(进程)从内存移到辅存(外存),把内存空间腾出来,这一过程又叫换出。把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称为换入中级调度(策略)就是釆用交换技术。

    1)对换的引入

    在多道程序环境下,一方面,在内存中的某些进程由于某事件尚未发生而被阻塞运行,但它却占用了大量的内存空间,甚至有时可能出现在内存中所有进程都被阻塞而迫使CPU停止下来等待的情况。另一方面,却又有着许多作业在外存等待,因无内存而不能进入内存运行的情况。显然这是对系统资源的一种严重浪费,使系统吞吐量下降,于是增设了对换(交换)设施。

    ----- 所谓“对换”,是指把内存中暂时不能运行的进程或者暂时不用的程序和数据调出到外存上,以便腾出足够的内存空间,再把已具备运行条件的进程调入内存。

    ----- 如果对换是以整个进程为单位的,便称之为“整体对换”或“进程对换”。解决内存紧张的问题。

    ----- 如果对换是以“页“或”段“为单位进行的,则分别称之为”页面对换“或”分段对换“。为了实现进程对换,系统必须能实现3个方面的功能:对换空间的管理、进程的换出、进程的换入。

    2)对换空间的管理

    在具有对换功能的OS中,通常把外存分为文件区对换区。前者用于存放文件,后者用于存放从内存换出的进程。对换区采用的是连续分配的方式(考虑到对换的速度)。

    3)进程的换出与换入

    换出:每当一进程由于创建子进程而需要更多的内存空间,但又无足够的内存空间等情况发生时,系统应将某进程换出。系统首先选择处于阻塞状态优先级最低的进程作为换出进程,然后启动磁盘,将该进程的程序和数据传送到磁盘的对换区。若传送过程未出现错误,便可回收该进程所占用的内存空间,并对该进程的进程控制块做相应的修改。

    换入:把外存交换区中的数据和程序换到内存中。系统应定时的查看所有进程的状态,从中找出”就绪“状态但已换出的进程。将其中换出时间最久(换出到磁盘上)的进程作为换入进程,将之换入。直至已无可换入的进程或无可换出的进程为止。交换的特点是打破了一个程序一旦进入主存便一直运行到结束的限制,但运行的进程大小仍受实际主存的限制。

    ---- 与覆盖技术相比,交换不要求程序员给出程序段之间的覆盖结构,而且交换主要是在进程或作业之间进行;而覆盖则主要在同一个作业或进程中进行。另外,覆盖只能覆盖与覆盖程序段无关的程序段。

    展开全文
  • linux swap 内存交换分区 详细介绍

    千次阅读 2020-10-06 20:00:39
    Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。 希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文,应该可以帮你解决以下问题: 1、swap到底是干嘛的? 2、swappiness...

    目录

    1、什么是SWAP,到底是干嘛的?

    为什么要进行内存回收?

    会回收的两种内存

    2、swappiness到底是用来调节什么的?

    那么这个swappiness到底起到了什么作用呢?

    3、kswapd什么时候会进行swap操作?

    4、什么是内存水位标记?(watermark)

    相关参数设置

    swap的相关操纵命令

    5、swap分区的优先级(priority)有啥用?

    最后

    Q&A:


    概述

    本文讨论的 swap基于Linux4.4内核代码 。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。

    希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文,应该可以帮你解决以下问题:

    1、 swap到底是干嘛的?

    2、 swappiness到底是用来调节什么的?

    3、 kswapd什么时候会进行swap操作?

    4、 什么是内存水位标记?

    5、 swap分区的优先级(priority)有啥用?

    1、什么是SWAP,到底是干嘛的?

    我们一般所说的swap,指的是一个交换分区或文件。在Linux上可以使用swapon -s命令查看当前系统上正在使用的交换空间有哪些,以及相关信息:

    [zorro@zorrozou-pc0 linux-4.4]$ swapon -s
    Filename Type Size Used Priority
    /dev/dm-4 partition 33554428 0 -1

    从功能上讲,交换分区主要是在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因内存不够用而导致oom或者更致命的情况出现。

    所以,当内存使用存在压力,开始触发内存回收的行为时,就可能会使用swap空间。

    内核对swap的使用实际上是跟内存回收行为紧密结合的。那么关于内存回收和swap的关系,我们需要思考以下几个问题:

    1. 为什么要进行内存回收?

    2. 哪些内存可能会被回收呢?

    3. 回收的过程中什么时候会进行交换呢?

    4. 具体怎么交换?

    下面我们就从这些问题出发,一个一个进行分析。

    为什么要进行内存回收?

    内核之所以要进行内存回收,主要原因有两个:

    1. 内核需要为任何时刻突发到来的内存申请提供足够的内存。所以一般情况下保证有足够的free空间对于内核来说是必要的。

      另外,Linux内核使用cache的策略虽然是不用白不用,内核会使用内存中的page cache对部分文件进行缓存,以便提升文件的读写效率。

      所以内核有必要设计一个周期性回收内存的机制,以便cache的使用和其他相关内存的使用不至于让系统的剩余内存长期处于很少的状态。

    2. 当真的有大于空闲内存的申请到来的时候,会触发强制内存回收。

    所以,内核在应对这两类回收的需求下,分别实现了两种不同的机制:

    • 一个是使用 kswapd进程对内存进行周期检查 ,以保证平常状态下剩余内存尽可能够用。

    • 另一个是 直接内存回收(directpagereclaim) ,就是当内存分配时没有空闲内存可以满足要求时,触发直接内存回收。

    这两种内存回收的触发路径不同:

    • 一个是由内核进程kswapd直接调用内存回收的逻辑进行内存回收;

      参见mm/vmscan.c中的kswapd()主逻辑

    • 另一个是内存申请的时候进入slow path的内存申请逻辑进行回收。

      参见内核代码中的mm/page_alloc.c中的__alloc_pages_slowpath方法

    这两个方法中实际进行内存回收的过程殊途同归,最终都是 调用shrink_zone() 方法进行针对每个zone的内存页缩减。

    这个方法中会再调用shrink_lruvec()这个方法对每个组织页的链表进程检查。找到这个线索之后,我们就可以清晰的看到内存回收操作究竟针对的page有哪些了。

    这些链表主要定义在mm/vmscan.c一个enum中:

    根据这个enum可以看到,内存回收主要需要进行扫描的链表有如下4个:

    • anon的inactive

    • anon的active

    • file的inactive

    • file的active

    就是说,内存回收操作主要针对的就是内存中的文件页(file  cache)和匿名页。

    关于活跃(active)还是不活跃(inactive)的判断内核会使用lru算法进行处理并进行标记,我们这里不详细解释这个过程。

    整个扫描的过程分几个循环:

    1. 首先扫描每个zone上的cgroup组;

    2. 然后再以cgroup的内存为单元进行page链表的扫描;

    3. 内核会先扫描anon的active链表,将不频繁的放进inactive链表中,然后扫描inactive链表,将里面活跃的移回active中;

    4. 进行swap的时候,先对inactive的页进行换出;

    5. 如果是file的文件映射page页,则判断其是否为脏数据,如果是脏数据就写回,不是脏数据可以直接释放。

    会回收的两种内存

    这样看来, 内存回收这个行为会对两种内存的使用进行回收:

    • 一种是anon的匿名页内存,主要回收手段是swap;

    • 另一种是file-backed的文件映射页,主要的释放手段是写回和清空。

    因为针对filebased的内存,没必要进行交换,其数据原本就在硬盘上,回收这部分内存只要在有脏数据时写回,并清空内存就可以了,以后有需要再从对应的文件读回来。

    内存对匿名页和文件缓存一共用了 四条链表 进行组织,回收过程主要是针对这四条链表进行扫描和操作。

    2、swappiness到底是用来调节什么的?

    很多人应该都知道 /proc/sys/vm/swappiness 这个文件,是个可以用来调整跟swap相关的参数。这个文件的默认值是60,可以的取值范围是0-100。

    这很容易给大家一个暗示:我是个百分比哦!

    那么这个文件具体到底代表什么意思呢?我们先来看一下说明:

    ======

    swappiness

    This control is used to define how aggressive the kernel will swap memory pages. Higher values will increase agressiveness, 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.

    The default value is 60.

    ======

    这个文件的值用来定义内核使用swap的积极程度:

    • 值越高,内核就会越积极的使用swap;

    • 值越低,就会降低对swap的使用积极性。

    • 如果这个值为0,那么内存在free和file-backed使用的页面总量小于高水位标记(high water mark)之前,不会发生交换。

    在这里我们可以理解file-backed这个词的含义了,实际上就是上文所说的文件映射页的大小。

    那么这个swappiness到底起到了什么作用呢?

    我们换个思路考虑这个事情。假设让我们设计一个内存回收机制,要去考虑将一部分内存写到swap分区上,将一部分file-backed的内存写回并清空,剩余部分内存出来,我们将怎么设计?

    我想应该主要考虑这样几个问题:

    1. 如果回收内存可以有两种途径(匿名页交换和file缓存清空),那么我应该考虑在本次回收的时候,什么情况下多进行file写回,什么情况下应该多进行swap交换。说白了就是平衡两种回收手段的使用,以达到最优。

    2. 如果符合交换条件的内存较长,是不是可以不用全部交换出去?比如可以交换的内存有100M,但是目前只需要50M内存,实际只要交换50M就可以了,不用把能交换的都交换出去。

    分析代码会发现,Linux内核对这部分逻辑的实现代码在 get_scan_count() 这个方法中,这个方法被 shrink_lruvec() 调用。

    get_sacn_count()就是处理上述逻辑的,swappiness是它所需要的一个参数,这个参数实际上是指导内核在清空内存的时候,是更倾向于清空file-backed内存还是更倾向于进行匿名页的交换的。

    当然,这只是个倾向性,是指在两个都够用的情况下,更愿意用哪个,如果不够用了,那么该交换还是要交换。

    简单看一下get_sacn_count()函数的处理部分代码,其中关于swappiness的第一个处理是:

    这里注释的很清楚:

    1. 如果swappiness设置为100,那么匿名页和文件将用同样的优先级进行回收。

      很明显,使用清空文件的方式将有利于减轻内存回收时可能造成的IO压力。

      因为如果file-backed中的数据不是脏数据的话,那么可以不用写回,这样就没有IO发生,而一旦进行交换,就一定会造成IO。

      所以系统默认将swappiness的值设置为60,这样回收内存时,对file-backed的文件cache内存的清空比例会更大,内核将会更倾向于进行缓存清空而不是交换。

    2. 这里的swappiness值如果是60,那么是不是说内核回收的时候,会按照60:140的比例去做相应的swap和清空file-backed的空间呢?并不是。

      在做这个比例计算的时候,内核还要参考当前内存使用的其他信息。对这里具体是怎么处理感兴趣的人,可以自己详细看get_sacn_count()的实现,本文就不多解释了。

      我们在此要明确的概念是: swappiness的值是用来控制内存回收时,回收的匿名页更多一些还是回收的file cache更多一些 。

    3. swappiness设置为0的话,是不是内核就根本不会进行swap了呢?这个答案也是否定的。

      首先是内存真的不够用的时候,该swap的话还是要swap。

      其次在内核中还有一个逻辑会导致直接使用swap, 内核代码 是这样处理的:

    这里的逻辑是说,如果触发的是全局回收,并且zonefile + zonefree <= high_wmark_pages(zone)条件成立时,就将scan_balance这个标记置为SCAN_ANON。

    后续处理scan_balance的时候,如果它的值是SCAN_ANON,则一定会进行针对匿名页的swap操作。

    要理解这个行为,我们首先要搞清楚什么是高水位标记(high_wmark_pages)。

    3、kswapd什么时候会进行swap操作?

    我们回到kswapd周期检查和直接内存回收的两种内存回收机制。

    直接内存回收比较好理解,当申请的内存大于剩余内存的时候,就会触发直接回收。

    那么kswapd进程在周期检查的时候触发回收的条件是什么呢?

    还是从设计角度来看,kswapd进程要周期对内存进行检测,达到一定阈值的时候开始进行内存回收。

    这个所谓的阈值可以理解为内存目前的使用压力,就是说,虽然我们还有剩余内存,但是当剩余内存比较小的时候,就是内存压力较大的时候,就应该开始试图回收些内存了,这样才能保证系统尽可能的有足够的内存给突发的内存申请所使用。

    4、什么是内存水位标记?(watermark)

    那么如何描述内存使用的压力呢?

    Linux内核使用水位标记(watermark)的概念来描述这个压力情况。

    Linux为内存的使用设置了三种内存水位标记:high、low、min。他们 所标记的含义分别为:

    • 剩余内存在high以上表示内存剩余较多,目前内存使用压力不大;

    • high-low的范围表示目前剩余内存存在一定压力;

    • low-min表示内存开始有较大使用压力,剩余内存不多了;

    • min是最小的水位标记,当剩余内存达到这个状态时,就说明内存面临很大压力。

    • 小于min这部分内存,内核是保留给特定情况下使用的,一般不会分配。

    内存回收行为就是基于剩余内存的水位标记进行决策的:

    当系统剩余内存低于watermark[low]的时候,内核的kswapd开始起作用,进行内存回收。直到剩余内存达到watermark[high]的时候停止。

    如果内存消耗导致剩余内存达到了或超过了watermark[min]时,就会触发直接回收(direct reclaim)。

    明白了水位标记的概念之后,zonefile + zonefree <= high_wmark_pages(zone)这个公式就能理解了。

    这里的zonefile相当于内存中文件映射的总量,zonefree相当于剩余内存的总量。

    内核一般认为,如果zonefile还有的话,就可以尽量通过清空文件缓存获得部分内存,而不必只使用swap方式对anon的内存进行交换。

    整个判断的概念是说,在全局回收的状态下(有global_reclaim(sc)标记),如果当前的文件映射内存总量+剩余内存总量的值评估小于等于watermark[high]标记的时候,就可以进行直接swap了。

    这样是为了防止进入cache陷阱,具体描述可以见代码注释。

    这个判断对系统的影响是, swappiness设置为0时,有剩余内存的情况下也可能发生交换。

    那么watermark相关值是如何计算的呢?

    所有的内存watermark标记都是根据当前内存总大小和一个可调参数进行运算得来的,这个参数是: /proc/sys/vm/min_free_kbytes

    • 首先这个参数本身决定了系统中每个zone的watermark[min]的值大小。

    • 然后内核根据min的大小并参考每个zone的内存大小分别算出每个zone的low水位和high水位值。

    想了解具体逻辑可以参见源代码目录下的该文件:

    mm/page_alloc.c

    在系统中可以从/proc/zoneinfo文件中查看当前系统的相关的信息和使用情况。

    我们会发现以上内存管理的相关逻辑都是以zone为单位的,这里zone的含义是指内存的分区管理。

    Linux将内存分成多个区,主要有:

    • 直接访问区(DMA)

    • 一般区(Normal)

    • 高端内存区(HighMemory)

    内核对内存不同区域的访问因为硬件结构因素会有寻址和效率上的差别。如果在NUMA架构上,不同CPU所管理的内存也是不同的zone。

    相关参数设置

    zone_reclaim_mode:

    zone_reclaim_mode模式是在2.6版本后期开始加入内核的一种模式,可以用来管理当一个内存区域(zone)内部的内存耗尽时,是从其内部进行内存回收还是可以从其他zone进行回收的选项,我们可以通过 /proc/sys/vm/zone_reclaim_mode 文件对这个参数进行调整。

    在申请内存时(内核的get_page_from_freelist()方法中),内核在当前zone内没有足够内存可用的情况下,会根据zone_reclaim_mode的设置来决策是从下一个zone找空闲内存还是在zone内部进行回收。这个值为0时表示可以从下一个zone找可用内存,非0表示在本地回收。

    这个文件可以设置的值及其含义如下:

    • echo 0 > /proc/sys/vm/zone_reclaim_mode:意味着关闭zone_reclaim模式,可以从其他zone或NUMA节点回收内存。

    • echo 1 > /proc/sys/vm/zone_reclaim_mode:表示打开zone_reclaim模式,这样内存回收只会发生在本地节点内。

    • echo 2 > /proc/sys/vm/zone_reclaim_mode:在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存。

    • echo 4 > /proc/sys/vm/zone_reclaim_mode:可以用swap方式回收内存。

    不同的参数配置会在NUMA环境中对其他内存节点的内存使用产生不同的影响,大家可以根据自己的情况进行设置以优化你的应用。

    默认情况下,zone_reclaim模式是关闭的。这在很多应用场景下可以提高效率,比如文件服务器,或者依赖内存中cache比较多的应用场景。

    这样的场景对内存cache速度的依赖要高于进程进程本身对内存速度的依赖,所以我们宁可让内存从其他zone申请使用,也不愿意清本地cache。

    如果确定应用场景是内存需求大于缓存,而且尽量要避免内存访问跨越NUMA节点造成的性能下降的话,则可以打开zone_reclaim模式。

    此时页分配器会优先回收容易回收的可回收内存(主要是当前不用的page cache页),然后再回收其他内存。

    打开本地回收模式的写回可能会引发其他内存节点上的大量的脏数据写回处理。如果一个内存zone已经满了,那么脏数据的写回也会导致进程处理速度收到影响,产生处理瓶颈。

    这会降低某个内存节点相关的进程的性能,因为进程不再能够使用其他节点上的内存。但是会增加节点之间的隔离性,其他节点的相关进程运行将不会因为另一个节点上的内存回收导致性能下降。

    除非针对本地节点的内存限制策略或者cpuset配置有变化,对swap的限制会有效约束交换只发生在本地内存节点所管理的区域上。

    min_unmapped_ratio:

    这个参数只在NUMA架构的内核上生效。这个值表示NUMA上每个内存区域的pages总数的百分比。

    在zone_reclaim_mode模式下,只有当相关区域的内存使用达到这个百分比,才会发生区域内存回收。

    在zone_reclaim_mode设置为4的时候,内核会比较所有的file-backed和匿名映射页,包括swapcache占用的页以及tmpfs文件的总内存使用是否超过这个百分比。

    其他设置的情况下,只比较基于一般文件的未映射页,不考虑其他相关页。

    page-cluster:

    page-cluster是用来控制从swap空间换入数据的时候,一次连续读取的页数,这相当于对交换空间的预读。这里的连续是指在swap空间上的连续,而不是在内存地址上的连续。

    因为swap空间一般是在硬盘上,对硬盘设备的连续读取将减少磁头的寻址,提高读取效率。

    这个文件中设置的值是2的指数。就是说,如果设置为0,预读的swap页数是2的0次方,等于1页。如果设置为3,就是2的3次方,等于8页。

    同时,设置为0也意味着关闭预读功能。文件默认值为3。我们可以根据我们的系统负载状态来设置预读的页数大小。

    swap的相关操纵命令

    可以使用mkswap将一个分区或者文件创建成swap空间。swapon可以查看当前的swap空间和启用一个swap分区或者文件。swapoff可以关闭swap空间。

    我们使用一个文件的例子来演示一下整个操作过程:

    制作swap文件:

    启用swap文件:

    关闭swap空间:

    5、swap分区的优先级(priority)有啥用?

    在使用多个swap分区或者文件的时候,还有一个优先级的概念(Priority)。

    在swapon的时候,我们可以使用-p参数指定相关swap空间的优先级, 值越大优先级越高 ,可以指定的数字范围是-1到32767。

    内核在使用swap空间的时候总是先使用优先级高的空间,后使用优先级低的。

    当然如果把多个swap空间的优先级设置成一样的,那么两个swap空间将会以轮询方式并行进行使用。

    如果两个swap放在两个不同的硬盘上,相同的优先级可以起到类似RAID0的效果,增大swap的读写效率。

    另外,编程时使用mlock()也可以将指定的内存标记为不会换出,具体帮助可以参考man 2 mlock。

    最后

    关于swap的使用建议,针对不同负载状态的系统是不一样的。有时我们希望swap大一些,可以在内存不够用的时候不至于触发oom-killer导致某些关键进程被杀掉,比如数据库业务。

    也有时候我们希望不要swap,因为当大量进程爆发增长导致内存爆掉之后,会因为swap导致IO跑死,整个系统都卡住,无法登录,无法处理。

    这时候我们就希望不要swap,即使出现oom-killer也造成不了太大影响,但是不能允许服务器因为IO卡死像多米诺骨牌一样全部死机,而且无法登陆。跑cpu运算的无状态的apache就是类似这样的进程池架构的程序。

    所以:

    • swap到底怎么用?

    • 要还是不要?

    • 设置大还是小?

    • 相关参数应该如何配置?

    是要根据我们自己的生产环境的情况而定的。

    阅读完本文后希望大家可以明白一些swap的深层次知识。

    Q&A:

    1. 一个内存剩余还比较大的系统中,是否有可能使用swap?

      A: 有可能,如果运行中的某个阶段出发了这个条件”zonefile+zonefree<=high_wmark_pages(zone) “,就可能会swap。

    2. swappiness设置为0就相当于关闭swap么?

      A: 不是的,关闭swap要使用swapoff命令。swappiness只是在内存发生回收操作的时候用来平衡cache回收和swap交换的一个参数,调整为0意味着,尽量通过清缓存来回收内存。

    3. A: swappiness设置为100代表系统会尽量少用剩余内存而多使用swap么?

      不是的,这个值设置为100表示内存发生回收时,从cache回收内存和swap交换的优先级一样。就是说,如果目前需求100M内存,那么较大机率会从cache中清除50M内存,再将匿名页换出50M,把回收到的内存给应用程序使用。但是这还要看cache中是否能有空间,以及swap是否可以交换50m。内核只是试图对它们平衡一些而已。

    4. kswapd进程什么时候开始内存回收?

      A: kswapd根据内存水位标记决定是否开始回收内存,如果标记达到low就开始回收,回收到剩余内存达到high标记为止。

    5. 如何查看当前系统的内存水位标记?

      A: cat /proc/zoneinfo。

     

     

    展开全文
  • swap 内存交换原理

    千次阅读 2020-11-04 16:12:02
    swap就是内存交换的意思,不是所有的机器都有swap分区,一般设置为内存的2倍。 计算机对内存分为物理内存与虚拟内存。物理内存就是计算机的实际内存大小,虚拟内存则是从磁盘空间开辟出一部分内存空间虚拟出来的,...

    Swap原理

    swap就是内存交换的意思,不是所有的机器都有swap分区,一般设置为内存的2倍。
    计算机对内存分为物理内存与虚拟内存。物理内存就是计算机的实际内存大小,虚拟内存则是从磁盘空间开辟出一部分内存空间虚拟出来的,所以也叫磁盘缓存。虚拟内存的出现,让机器内存不够的情况得到部分解决。程序运行的时候系统会在虚拟内存与物理内存直接进行替换和加载。这里的虚拟内存就是swap。
    进程运行的时候系统会判断当前物理内存是否还有空闲,如果有那么则直接调入内存进行运行;如果没有,那么会根据优先级选择一个进程挂起,把该进程交换到swap中等待,然后把新的进程调入到内存中运行。
    swap out(so):进程向系统请求内存发现不足时,系统会把内存中暂时不用的数据交换出去,放在swap分区里;
    swap in(si):当进程又需要这些数据且系统发现还有空闲物理内存时,又会把SWAP分区中的数据交换到物理内存中

    在这里插入图片描述

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CN9jp7s3-1604477366462)(C:\Users\qiujingping\AppData\Roaming\Typora\typora-user-images\1604372452539.png)]

    swap使用完,操作系统会触发

    OOM-Killer

    机制,杀掉占用内存最大的进程。所以大家经常会发现内存飙高之后进程莫名其妙的不见了。。。。

    展开全文
  • Linux SWAP内存交换机制基本概念

    万次阅读 2017-04-10 21:36:30
    Linux SWAP内存交换机制基本概念tags: Linux源码Linux SWAP内存交换机制基本概念 摘要 前序知识 内存交换要做什么 硬件上给予的支持 下面假定场景更好的叙述 Linux中的实现 数据什么时候跑到磁盘上面去的 什么时候换...
  • 虚拟机内存交换学习个人记录

    千次阅读 2019-11-05 23:18:12
    最近在玩虚拟机,看到了VM15选项中设置内存不能过大,否者会发生内存交换。我对此感到疑惑,先开始一番猜测,莫非是主机的内存与虚拟机的内存之间的交换。这个问题可就大了。利用子机攻击母机的套路还是存在的,前几...
  • 在Linux上,内存交换有着特殊的作用,块设备在当前的Linux内核上充当交换区时,工作得很好;Nandflash在写入数据之前需要先擦除,因此当Nandflash充当交换区时,当前的内存交换模型就需要改进,否则内存交换就不能...
  • 内存交换分区(swap) 1.概念:存在硬盘中的一个分区,用来暂时存放内存中的数据 2.功能与特点 功能:CPU读取的数据都是来自于内存,如果内存不足的时候,为了让后续的程序可以顺利运行,就会将暂时不使用的程序...
  • CDH大数据平台内存交换,警告问题

    千次阅读 2020-07-30 18:21:56
    博主在使用CDH大数据平台时发现,CDH长时间运行,Cloudera Manager管理页面在运行Spark任务时候经常会出现内存交换警告,前期博主直接忽略,毕竟不是什么大问题,后期发现如果长时间黄色警告不处理,会误导页面查看...
  • 主要介绍了linux swap交换内存扩容的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 深入理解内存(3):内存交换技术,虚拟内存 2013-01-15 21:14 1560人阅读 评论(0) 收藏 举报 分类: 3) C++(59) 1)IT Related(21) 版权声明:本文为博主原创文章,未经博主允许...
  • 覆盖与交换技术是在多道程序环境下用来扩充内存的两种方法。 内存覆盖 早期的计算机系统中,主存容量很小,虽然主存中仅存放一道用户程序,但是存储空间放不下用户进程的现象也经常发生,这一矛盾可以用覆盖技术来...
  • Linux下物理内存和虚拟内存交换机制

    千次阅读 2016-03-17 22:29:39
    Linux下物理内存和虚拟内存交换机制   Vmstat是Virtual Memory Statistics虚拟内存统计缩写: 物理内存是计算机内存的大小,从物理内存中读写数据比硬盘中读写数据要快很多,而内存是有限的,所以就有了物理内存和...
  • 树梅派 内存交换空间swap 更改

    千次阅读 2017-09-14 20:25:13
    1, 编辑 sudo nano /etc/dphys-...默认为 CON_SWAPSIZE= 100 M的交换空间, 更改为 1024 M 2, 重新启动dphys-swapfile 文件服务 sudo /etc/init.d/dphys-swapfile stopsudo /etc/init.d/dphys-swapfile start
  • 内存交换空间(swap)

    千次阅读 2014-11-03 21:33:06
    安装Linux时需要两个分区,一个是根目录,另外一个就是swap(内存交换空间)。swap的功能就是在应付物理内存不足的情况下所造成的内存扩展记录的功能。一般来说,如果硬件的配备足够的话,那么swap应该不会被我们的...
  • centos7配置swap交换内存空间 centos7配置swap交换内存空间 centos7配置swap交换内存空间
  • /*/dev/mem是物理内存的全映射,包括整个处理器的地址空间,具体包含地址总线上的所有可寻址空间和IO空 间,但要保证这些物理地址是有效的,可以从这些地址上访问到数据。理论上可以映射0-0xffffffff的地址空间。*...
  • Linux 关闭交换内存

    千次阅读 2019-04-04 11:35:13
    关闭Linux的swap交换内存 操作:sysctl -w vm.swappiness=0   1. 设置swap: linux系统会用内存做很 多的buffer和cache,所以经常会看到内存用完了,其实这里面可能只有很少的一部分是程序用到的。当...
  • 如果你的Linux服务器负载的资源过多,可能由几大原因引起:不足以加载应用的内存或者缓存了所有应该隐藏的文件,或者太严重依赖Linux内存交换。 那么可以基于Linux内存使用率最佳实践优化服务器,如将不活跃内存移...
  • Linux的内存回收和交换

    千次阅读 2019-07-18 08:01:02
    前言Linux的swap相关部分代码从2.6早期版本到现在的4.6版本在细节之处已经有不少变化。本文讨论的swap基于Linux4.4内核代码。Linux内存管理是一套...
  • 虚拟内存交换空间

    千次阅读 2018-02-23 11:47:03
    交换内存交换空间是虚存使用的一部分物理硬盘。 虚存是操作系统为了更高效的使用物理内存提出的概念,应用程序操作的地址是虚存的地址(对应地址空间的概念),内核提供将虚存地址翻译为物理内存地址的功...
  • 飞腾CPU体系结构之内存交换原子操作 1. 内存交换原子操作 定义:修改内存单元的数据,同时返回该内存单元原来的数据。 函数声明(以内存单元长度64位为例) static inline u64 __xchg_case_64 (u64 x, volatile ...
  • 建议Mac M1关闭虚拟内存(交换内存 swap memory)

    万次阅读 热门讨论 2021-02-28 14:29:45
    在第二天我打开电脑准备工作时,习惯性打开活动监视器(command + 空格),发现已使用的交换内存为0字节,我特别高兴。 但在我打开3个idea窗口时,分别运行了1个Springboot的项目和2个node项目时,习惯性查看活动监视...
  • 但是不想换内存条的情况下,也可以通过交换内存来间接的实现内存拓展。 swap交换空间,当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自...
  • Windows内存体系(2) -- 页交换文件

    万次阅读 2018-03-19 15:59:18
    一、页交换文件 虚拟地址空间只是操作系统为进程“虚拟”出来的一块地址区域,并不代表任何实际的空间。而“页交换文件”却对应了实际的空间,这个空间一般...从微软的官方文档来看,“虚拟内存”等于“物理内存”+...
  • Linux虚拟内存交换空间机制

    千次阅读 2015-12-06 18:37:09
    对于一台x86(32bit)的操作系统来说,假设它有2G的物理内存,物理内存分成以许多个4k为单位大小的页框,这些页框就是存储进程的最小单位: 为了解决系统运行过程中不同进程之间内存的合理分配和利用,防止不同...
  • reference:https://www.imooc.com/article/16573 1.首先用命令free查看系统内Swap 分区大小 total used free shared buffers cache Mem: 1002 964 38 0 21 410 -/+ buffers/cache: 532 470 ... Swap: 1024...
  • Linux 交换区 用磁盘换内存

    千次阅读 2018-03-02 16:05:09
    创建 1G 的交换区 # 创建空文件 dd if=/dev/zero of=/swap bs=1024k count=1024 # 制作成交换区 mkswap /swap ...# 查看当前内存情况 free -m 修改文件权限到安全权限 : chmod 600 /swap do...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 422,232
精华内容 168,892
关键字:

内存交换