精华内容
下载资源
问答
  • LINUX SWAP的查看与维护

    2021-05-14 00:14:53
    1.查看SWAP[root@rose /]# cat /proc/swapsFilename Type Size Used Priority/dev/sdb1 partition 2096440 8 -1/tmp/swa...

    1.查看SWAP

    [root@rose /]# cat /proc/swaps

    Filename                                Type            Size    Used    Priority

    /dev/sdb1                               partition       2096440 8       -1

    /tmp/swap                               file            65520   0       -3

    2.通过DD创建

    boot  etc  initrd  lost+found  misc   opt  root  selinux  sys  test1  usr

    [root@rose /]# dd if=/dev/zero f=/tmp/swap bs=4k count=16382

    读入了 16382+0 个块

    输出了 16382+0 个块

    [root@rose /]# mkswap /tmp/swap

    Setting up swapspace version 1, size = 67096 kB

    [root@rose /]# free

    total       used       free     shared    buffers     cached

    Mem:        384704     364624      20080          0      17180     305472

    -/+ buffers/cache:      41972     342732

    Swap:      2096440          8    2096432

    swapon [-s]

    [root@rose /]# swapon /tmp/swap

    [root@rose /]# free

    total       used       free     shared    buffers     cached

    Mem:        384704     364560      20144          0      17196     305456

    -/+ buffers/cache:      41908     342796

    Swap:      2161960          8    2161952

    开机自动启动:

    LABEL=/                 /                       ext3    defaults        1 1

    LABEL=/home             /home                   ext3    defaults        1 2

    LABEL=/var              /var                    ext3    defaults        1 2

    LABEL=/tmp              /tmp                    ext3    defaults        1 2

    LABEL=/usr              /usr                    ext3    defaults        1 2

    LABEL=/boot             /boot                   ext3    defaults        1 2

    tmpfs                   /dev/shm                tmpfs   defaults        0 0

    devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

    sysfs                   /sys                    sysfs   defaults        0 0

    proc                    /proc                   proc    defaults        0 0

    LABEL=SWAP              swap                    swap    defaults        0 0

    /home/swap              swap                    swap    defaults        0 0

    3.直接再加一棵硬盘,并且将其中某个扇区规划为 swap 的 filesystem

    [root@rose /]# fdisk /dev/sdc

    The number of cylinders for this disk is set to 1044.

    There is nothing wrong with that, but this is larger than 1024,

    and could in certain setups cause problems with:

    1) software that runs at boot time (e.g., old versions of LILO)

    2) booting and partitioning software from other OSs

    (e.g., DOS FDISK, OS/2 FDISK)

    Command (m for help): t

    Partition number (1-5): 3

    Hex code (type L to list codes): L

    0  Empty           1e  Hidden W95 FAT1 75  PC/IX           be  Solaris boot

    1  FAT12           24  NEC DOS         80  Old Minix       bf  Solaris

    2  XENIX root      39  Plan 9          81  Minix / old Lin c1  DRDOS/sec (FAT-

    3  XENIX usr       3c  PartitionMagic  82  Linux swap      c4  DRDOS/sec (FAT-

    4  FAT16 <32M      40  Venix 80286     83  Linux           c6  DRDOS/sec (FAT-

    5  Extended        41  PPC PReP Boot   84  OS/2 hidden C:  c7  Syrinx

    6  FAT16           42  SFS             85  Linux extended  da  Non-FS data

    7  HPFS/NTFS       4d  QNX4.x          86  NTFS volume set db  CP/M / CTOS / .

    8  AIX             4e  QNX4.x 2nd part 87  NTFS volume set de  Dell Utility

    9  AIX bootable    4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt

    a  OS/2 Boot Manag 50  OnTrack DM      93  Amoeba          e1  DOS access

    b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O

    c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          e4  SpeedStor

    e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs

    f  W95 Ext'd (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  EFI GPT

    10  OPUS            55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/

    11  Hidden FAT12    56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b

    12  Compaq diagnost 5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor

    14  Hidden FAT16 <3 61  SpeedStor       a9  NetBSD          f4  SpeedStor

    16  Hidden FAT16    63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary

    17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fd  Linux raid auto

    18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fe  LANstep

    1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid ff  BBT

    1c  Hidden W95 FAT3

    Hex code (type L to list codes): 82

    Changed system type of partition 3 to 82 (Linux swap)

    Command (m for help): w

    The partition table has been altered!

    Calling ioctl() to re-read partition table.

    WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.

    The kernel still uses the old table.

    The new table will be used at the next reboot.

    Syncing disks.

    [root@rose /]# mkswap /dev/sdc3

    Setting up swapspace version 1, size = 329007 kB

    [root@rose /]# swapon /dev/sdc3

    展开全文
  • Linux swap机制原理

    2021-01-17 13:57:41
    原标题:Linux swap机制原理本文转载自 Linux内核那些事链接:https://mp.weixin.qq.com/s/LtyvaDXiHlgr0eu2cJCN7A当Linux内存不足时就会触发swap(交换)机制, swap机制是什么东西呢?swap机制其实就是将外存(如硬盘)...

    原标题:Linux swap机制原理

    本文转载自 Linux内核那些事

    链接:https://mp.weixin.qq.com/s/LtyvaDXiHlgr0eu2cJCN7A

    当Linux内存不足时就会触发swap(交换)机制, swap机制是什么东西呢?

    swap机制其实就是将外存(如硬盘)当内存使用, 怎么可以把外存当内存使用呢? 原理就是当系统内存不够用的时候, 内核会选择某些进程, 把其使用较少的内存的内容交换(swap)到外存中,然后把内存让给需要的进程使用.

    那么Linux内核会把哪些内存交换到外存去呢? 在新版的Linux内核会使用LRU算法计算出那些使用比较少的内存交换到外存中. 而在这篇文件使用的Linux 1.0版本的内核, 所以算法比较简单. 下面来说说在Linux 1.0的swap机制是怎么实现的吧.

    当进程需要使用内存时会通过调用内核函数__get_free_page()来获取一个内存页, 我们来看看__get_free_page()的源码:

    unsigned long__get_free_page(int priority)

    {

    ...

    repeat:

    REMOVE_FROM_MEM_QUEUE(free_page_list,nr_free_pages);

    if (priority == GFP_BUFFER)

    return 0;

    if (priority != GFP_ATOMIC)

    if (try_to_free_page())

    goto repeat;

    REMOVE_FROM_MEM_QUEUE(secondary_page_list,nr_secondary_pages);

    return 0;

    }

    REMOVE_FROM_MEM_QUEUE()宏是从空闲内存页列表中获取一块内存页, 如果成功会直接返回. 如果失败就会调用try_to_free_page()函数来交换一块内存页到外存中. try_to_free_page()函数代码如下:

    static inttry_to_free_page(void)

    {

    int i=6;

    while (i--) {

    if (shrink_buffers(i))

    return 1;

    if (shm_swap(i))

    return 1;

    if (swap_out(i))

    return 1;

    }

    return 0;

    }

    在try_to_free_page()函数中会调用swap_out()函数进行交换工作. swap_out()函数的代码有点长, 具体步骤就是:

    从进程列表中选择一个进程进行交换.

    从进程的内核空间选择一块内存页进行交换.

    找到一块内存页后, 内核会调用try_to_swap_out()函数把此内存页交换到外存中. try_to_swap_out()代码如下:

    static inline int

    try_to_swap_out(unsigned long* table_ptr)

    {

    ...

    page = *table_ptr;

    ...

    if (PAGE_DIRTY & page) {

    page &= PAGE_MASK;

    if (mem_map[MAP_NR(page)] != 1)

    return 0;

    if (!(entry = get_swap_page()))

    return 0;

    *table_ptr = entry;

    invalidate();

    write_swap_page(entry, (char *) page);

    free_page(page);

    return 1;

    }

    page &= PAGE_MASK;

    *table_ptr = 0;

    invalidate();

    free_page(page);

    return 1 + mem_map[MAP_NR(page)];

    }

    代码中的page是要进行交换的内存页, 如果page是被修改过(PAGE_DIRTY & page等于1时), 那么就需要交换到交换文件中(外存).

    换出过程首先调用get_swap_page()函数从交换文件中获取一块交换块. 然后把进程的内存映射到此交换块. 接着调用write_swap_page()把内存页中的数据写到交换块中, 然后调用free_page()释放此内存页, 这样就可以得到一块空闲内存页了.

    当然, 如果内存页没有被修改过, 那么就不用交换到交换文件中, 直接释放此内存页即可.

    上面分析了当内存不足时, 内核是怎么进行swap的. 那么当进程访问到一块被交换到交换文件的内存页时会发生什么事情呢?

    因为被交换到交换文件的内存页会被打上不在物理内存的标志, 所以当进程访问到不在物理内存的内存页时会发生内存页错误中断. Linux内核会调用do_no_page()函数进行修复.

    do_no_page()代码如下:

    void do_no_page(unsigned longerror_code, unsigned long address,

    struct task_struct *tsk, unsigned long user_esp)

    {

    ...

    page = get_empty_pgtable(tsk,address);

    if (!page)

    return;

    page &= PAGE_MASK;

    page += PAGE_PTR(address);

    tmp = *(unsigned long *) page;

    if (tmp & PAGE_PRESENT)

    return;

    ++tsk->rss;

    if (tmp) {

    ++tsk->maj_flt;

    swap_in((unsigned long *) page);

    return;

    }

    ...

    }

    从上面的代码可以看出, 当访问的内存地址不在物理内存中, 当有具体的交换信息时, 就会调用swap_in()函数把内存页从交换文件中换入到物理内存页中. swap_in()函数最终会调用read_swap_page()函数把交换文件中的内存页读入到物理内存中.返回搜狐,查看更多

    责任编辑:

    展开全文
  • Linux SWAP详解

    2021-01-27 05:36:23
    SWAP/swappiness/kswapd原理,swap分区优先级的妙用本文讨论的swap基于Linux4.4内核代码。Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。希望本文能让读者了解Linuxswap的使用大概是什么...

    SWAP/swappiness/kswapd原理,swap分区优先级的妙用

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

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

    1、swap到底是干嘛的?

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

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

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

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

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

    36cbc654c7ea

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

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

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

    为什么要进行内存回收?

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

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

    具体怎么交换?

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

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

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

    2、Linux内核使用cache的策略虽然是不用白不用,内核会使用内存中的page cache对部分文件进行缓存,以便提升文件的读写效率。所以内核有必要设计一个周期性回收内存的机制,以便cache的使用和其他相关内存的使用不至于让系统的剩余内存长期处于很少的状态。

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

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

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

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

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

    1、由内核进程kswapd直接调用内存回收的逻辑进行内存回收。

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

    2、内存申请的时候进入slow path的内存申请逻辑进行回收。

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

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

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

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

    36cbc654c7ea

    根据这个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中;

    36cbc654c7ea

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

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

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

    1、anon的匿名页内存,主要回收手段是swap;

    2、file-backed的文件映射页,主要的释放手段是写回和清空。

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

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

    很多人应该都知道/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的内存写回并清空,剩余部分内存出来,我们将怎么设计?

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

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

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

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

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

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

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

    36cbc654c7ea

    这里注释的很清楚:

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

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

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

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

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

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

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

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

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

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

    36cbc654c7ea

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

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

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

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

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

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

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

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

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

    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。我们可以根据我们的系统负载状态来设置预读的页数大小。

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

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

    制作swap文件:

    36cbc654c7ea

    启用swap文件:

    36cbc654c7ea

    关闭swap空间:

    36cbc654c7ea

    在使用多个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的深层次知识。

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

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

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

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

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

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

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

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

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

    A: cat /proc/zoneinfo。

    展开全文
  • Linux Swap使用分析

    2021-01-17 13:57:41
    Linux操作系统性能分析主要包含磁盘IO、CPU、内存以及网络流量,而这里主要针对系统内存的使用进程情况做个分析。一、如何查看系统内存使用情况1、根据常用命令查看系统内存使用概况free -gtotal used free shared ...

    Linux操作系统性能分析主要包含磁盘IO、CPU、内存以及网络流量,而这里主要针对系统内存的使用进程情况做个分析。

    一、如何查看系统内存使用情况

    1、根据常用命令查看系统内存使用概况

    free  -g

    total      used      free    shared    buffers    cached

    Mem:            31          31          0          0          0          3

    -/+ buffers/cache:        28          3

    Swap:          15            7          7

    (根据free命令可以看到,系统使用了28G的物理内存,3G的剩余内存,其中swap总15G,已使用7G)

    top  (f p M)

    top - 14:18:50 up 1280 days,  7:15,  1 user,  load average: 1.05, 1.25, 1.12

    Tasks: 229 total,  1 running, 227 sleeping,  0 stopped,  1 zombie

    Cpu(s):  0.2%us,  0.1%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

    Mem:  32949816k total, 32848840k used,  100976k free,  169308k buffers

    Swap: 16771776k total,  8384616k used,  8387160k free,  3276360k cached

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP DATA COMMAND

    12428 mysql    15  0 22.2g  20g 3964 S  3.3 66.5  91946:06 1.3g  22g mysqld

    22840 cyldj    15  0 9059m 6.7g 9012 S  0.0 21.5  22:05.42 2.1g 8.7g DBAgent

    28689 root      15  0  358m  30m 3036 S  0.0  0.1 187:37.41 328m 137m salt-minion

    30768 cyldj    21  0  462m  10m 1908 S  0.0  0.0  10:44.60 451m 373m java

    22567 root      15  0 86004 3292 2576 S  0.0  0.0  0:00.01  80m  688 sshd

    28690 root      20  0  267m 2188  704 S  0.0  0.0  0:00.00 264m  47m salt-minion

    661 root      18  0 16340 1836 1632 S  0.0  0.0  0:47.42  14m  308 zabbix_agentd

    22569 root      15  0 68156 1520 1188 S  0.0  0.0  0:00.02  65m  408 bash

    2901 root      18  0  197m 1336  884 S  0.0  0.0  4:04.57 196m 174m AxisAgent

    11236 root      15  0 60672 1324  760 S  0.0  0.0  2:01.21  57m  608 sshd

    665 root      15  0 18432 1260  992 S  0.0  0.0  11:39.82  16m  308 zabbix_agentd

    662 root      15  0 18432 1256  992 S  0.0  0.0  11:43.36  16m  308 zabbix_agentd

    (根据top命令可以看到使用内存最大的进程是mysql进程,其次是dbagent,其中dbagent使用的交换分区较多)

    nmon (m)

    ATUuyTjnnwIAAAAAAElFTkSuQmCC

    nmon下载地址:

    https://sourceforge.net/projects/nmon/files/nmon_x86_64_rhel5/download  (RHEL5)

    https://sourceforge.net/projects/nmon/files/nmon_linux_14i_newer_Linux_versions.tar.gz/download (RHEL6)

    (通过nmon可以看到内存的详细分配情况,其中总内存为32177.6 MB,总swap 16378.7 MB ,空闲93.4 MB,可回收3188.2+166.5 MB,已使用交换分区7273.6MB,已使用的活动数据大小为30099.9MB,可以被交换出内存的数据大小为1590.7  MB)

    2、根据系统监控查看系统内存使用情况

    545abbc2eadf0b21cc54326c255bdd92.gif

    (近7天的内存使用情况)

    3、查看指定进程的系统内存使用信息

    cat /proc/22840/statm

    #virt    res    shr  text lib data dt

    2319113 1768037 2253 3836 0 2292997 0

    (上述是查看dbagent的内存使用信息,其中单位是页数,所以要看系统页大小4K,第一列是虚拟内存2319113页,第二列是驻留内存1768037页,第三列是共享内存2253页,进程独占内存大小为res-shr)

    getconf  PAGESIZE

    4096

    awk '/^Swap:/ {SWAP+=$2}END{print SWAP" KB"}' /proc/${pid}/smap

    for i in cd /proc;ls |grep "^[0-9]"|awk ' $0 >100' ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps ;done |sort -k2nr

    (上述命令可以查看进程虚拟内存使用情况)

    cat /proc/22840/status |grep Vm

    VmPeak:  9341632 kB

    VmSize:  9276452 kB

    VmLck:        0 kB

    VmHWM:  7074296 kB

    VmRSS:  7073540 kB

    VmData:  9171904 kB

    VmStk:        84 kB

    VmExe:    15344 kB

    VmLib:      4728 kB

    VmPTE:    15596 kB

    (上述命令可以查看指定进程的内存使用情况VmSize表示虚拟内存大小,VmRSS表示驻留内存大小)

    二、综合分析MYSQL数据库内存使用情况sh show_mem_usage.sh

    全局内存大小:18592.00 MB

    单线程最大内存:25.18 MB

    最大线程占用内存: 8815.62 MB

    历史最大线程占用内存: 5213.81 MB

    Innodb Buffer Pool使用率: 99.00%

    从mysql的内存使用和总的物理内存使用来看,服务器的内存使用已经基本达到上限(mysql驻留内存大约是21G,dbagent大约为7G,物理总内存为31G,缓存了3G,大约有2G左右的非活动区内存),当mysql进程、dbagent使用超过5G内存,物理内存不够,就会使用到了swap分区。

    三、什么情况下会使用swap分区

    1、物理内存确实不够用的情况下,会使用到swap分区。

    2、物理内存还有足够的内存使用,比如cache,buffer的剩余较多的情况下使用了swap分区

    四、使用swap分区扩展

    如果有足够的物理内存,依旧使用了swap分区,可以从以下几方面查看为什么使用了swap分区

    1、swap分区比例调整

    cat /etc/sysctl.conf  |grep swap

    vm.swappiness=0

    设置为0表示优先最大限度的使用物理内存缓存数据,而不是磁盘作为分区,值越大越不利于物理内存的充分利用

    2、numa陷阱

    545abbc2eadf0b21cc54326c255bdd92.gif545abbc2eadf0b21cc54326c255bdd92.gif

    为了提高cpu和内存的数据访问速度、并发度,设计了numa架构,但如果numa的内存分配策略不合理,那么将会严重影响到内存的使用,尤其是对大内存块使用的数据库服务器。

    #numactl --hardware

    available: 2 nodes (0-1)

    node 0 size: 16160 MB

    node 0 free: 15 MB

    node 1 size: 16131 MB

    node 1 free: 78 MB

    node distances:

    node  0  1

    0:  10  20

    1:  20  10

    (上述命令可以查看各个node节点的物理内存分配情况,可以看到两节点的内存分配比例基本平均,如果node0节点free和和node1的free值相差较大,说明分配策略存在问题,很大可能会带来swap使用,而物理内存空闲的状态)

    也可以通过查看numastat查看numa的miss和hit比例来进一步确认

    #numastat

    node0          node1

    numa_hit            39150779957    38736256884

    numa_miss            2658848763      8851827358

    numa_foreign          8851827296      2658848763

    interleave_hit        122652306      137287417

    local_node          39096884744    38598664497

    other_node            2712743976      8989419745

    3、解决方案

    (1)启用大页管理

    (2)关闭numa***BIOS关闭NUMA

    ***启动内核关闭:

    vi /boot/grub/grub.conf

    kernel /boot/vmlinuz-2.6.18-128.1.16.0.1.el5 root=LABEL=DBSYS ro bootarea=dbsys rhgb quiet console=ttyS0,115200n8 console=tty1 crashkernel=128M@16M numa=off

    重启操作系统,通过cat /proc/cmdline和numactl --hardware查看是否关闭(3)调整内核参数

    内核参数:

    展开全文
  • linux swap空间调整

    2021-05-15 18:32:21
    SWAP 简介 Linux 中的 SWAP(交换分区),类似于 Windows 的虚拟内存。系统会把一部分硬盘空间虚拟成内存使用,将系统内非活动内存换页到 SWAP,以提高系统可用内存。注:参阅 ECS 使用须知,云服务器 ECS 如果您使用...
  • Linux Swap Memory分配小技巧发布时间:2007-09-21 16:19:30来源:红联作者:YpoClose我发现很多人对Linux Swap Memory不太了解,经常见到有人把Linux Swap切成大于128MB的状况出现。这里要稍加解释一下, Linux的一个...
  • linux 会使用硬盘的一部分做为SWAP分区,用来进行进程调度--进程是正在运行的程序--把当前不用的进程调成‘等待(standby)‘,甚至‘睡眠(sleep)’,一旦要用,再调成‘活动(active)’,睡眠的进程就躺到SWAP分区睡大...
  • Linux swap 空间扩容

    2021-12-03 15:03:38
    1 #创建一个6g的文件用于swap空间 dd if=/dev/zero of=/swapfile bs=1024k count=6146 ps:生成 swap 文件系统(执行该条命令后,可以看到生成了一个swapfile文件,这个文件在/目录下, 其中bs是每块的大小,count是...
  • Linux swap and docker

    2021-05-18 09:48:38
    当内存不足时,内核会进行页面回收,此时主要有2个选择:file cache pages和anonymous pages,参考Linux中进程内存与cgroup内存的统计。对于file cache,内核只需要将page的数据回写到文件后即可。对于anonymous ...
  • linux 会使用硬盘的一部分做为SWAP分区,用来进行进程调度--进程是正在运行的程序--把当前不用的进程调成‘等待(standby)‘,甚至‘睡眠(sleep)’,一旦要用,再调成‘活动(active)’,睡眠的进程就躺到SWAP分区睡大...
  • Linux下察看swap分区大小的命令删除swap分区[root@localhost ~]# freetotal used free shared buffers cachedMem: 8290072 1916904 6373168 0 487224 984524-/+ buffers/cache: 445156 7844916Swap: ...
  • 我就是认真:Linux SWAP 深度解读(必须收藏)http://mp.weixin.qq.com/s?__biz=MzA4Nzg5Nzc5OA==&mid=2651660097&idx=1&sn=a3d38e3af2c9d8d431c46fe7680b428d&scene=2&srcid=0606f21oK1jm1...
  • Linux下,SWAP的作用类似Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。 Swap 把不常访问的内存先写到磁盘中,然后释放这些内存...
  • linux swap开启、关闭、监控

    千次阅读 2021-07-20 14:56:56
    linuxswap类似win的虚拟内存,当物理内存不足时会把进程暂时不用的内存放入磁盘,进程再次访问这些内存时从磁盘中取出来,解决内存不足的问题。 swap触发条件 1.大块内存分配请求 2.kswapd0定期扫描,查看...
  • 一:首先取消原本的交换分区文件1.1:获取root权限,使用swapoff回收交换分区文件/usr/sbin/swapoff /home/swap1.2:从文件系统删除原有的swap文件rm /home/swap1.3:从/etc/fstab 删除此前的文件二:重新创建交换...
  • linux swap交换分区详解

    2021-08-18 23:57:06
    什么是SWAP2. swappiness调节什么3. 什么时候会进行swap操作?4. swap分区的优先级(priority)5. 启停swap6. 创建swap 当物理内存和swap都被使用完那么就会出错,out of memory 1. 什么是SWAP $ swapon -s ...
  • Linuxswap分区的两种添加方法》由会员分享,可在线阅读,更多相关《Linuxswap分区的两种添加方法(2页珍藏版)》请在人人文库网上搜索。1、在装完Linux系统之后自己去修改Swap分区的大小(两种方法)在安装完Linux系统...
  • 你还记得住以前的分区设置么?需要精确的容量,硬盘分区要精确到块(好像是 4k 左右吧?。如果记得住,可以这样:使用 diskgenuis (其实别的也行,但有的分区软件不能精确分区,这软件也不是能特别...使用 Linux 的 L...
  • 很多童鞋给Linux分配的硬盘是8G,而安装Linux时采用默认分区方式的话swap分区有2G。swap分区即交换分区,类似于Windows的虚拟内存pagefile.sys。当内存不足时,把一部分硬盘空间虚拟成内存使用。而内存够用时则排不...
  • Linux divides its physical RAM (random access memory) into chucks ofmemory called pages. Swapping is the process whereby a page of memory iscopied to the preconfigured space on the hard disk, called s...
  • 在我们使用Linux命令查看内存空间的时候,会看到有swap数据,那么swap究竟是什么的?他起到什么作用呢? swap的作用 我们在安装系统的时候已经建立了 swap 分区。swap 分区通常被称为交换分区,这是一块特殊的硬盘...
  • 永久关闭linux swap

    2021-01-27 20:05:07
    一般来说,Linux的虚拟内存会根据系统负载自动调整。内存页(page)swap到磁盘会显著的影响Kafka的性能,并且Kafka重度使用page cache,如果VM系统swap到磁盘,那说明没有足够的内存来分配page cache。避免swap的一种...
  • 配置、开启 Swap:要清楚,Linux 本身支持两种类型的 Swap,即 Swap 分区和 Swap 文件。以 Swap 文件为例: # 创建Swap文件,Swap 文件的大小为 8GB$ fallocate -l 8G /mnt/swapfile# 修改权限只有根用户可以...
  • swap交换区满了怎么办 不增加交换区的方法 free -m 或free -h查看占用情况 使用如下指令来查看占用swap的前十进程 for i in $( cd /proc;ls |grep "^[0-9]"|awk ' $0 >100') ;do awk '/Swap:/{a=a+$2}END{...
  • Linux系统下,这个虚拟内存就被叫做SWaPLinux swap分区是有限制的。在安装操作系统的时候,安装向导会提示用户需要创建多少的SWaP空间。通常情况下,SWaP比较合适的大小为物理内存的1-2倍。1. 早期的linux对虚拟...
  • 原帖子写的很好,我把步骤给贴出来,测试系统:rhel6.4 x641.新建磁盘分区作为swap分区[root@localhost /]# free -m //查看当前swap信息total used free shared buffers cachedMem: 1878 348 1530 ...
  • 问题描述:swap无法挂载,挂载成功后,约5秒后自动umount。环境说明:OS:Redhat 7.6问题现象:查看swap没有分配大小[root@VM-XXX-CJCOS~]#free-gtotalusedfreesharedbuff/cacheavailableMem:70...
  • Linux SWAP的查看与维护

    2021-05-14 15:36:50
    1.查看SWAP[root@www.linuxidc.com /]# cat /proc/swapsFilename Type Size Used Priority/dev/sdb1 partition 2096440 8...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 173,188
精华内容 69,275
关键字:

linuxswap

linux 订阅