一:swap分区概念原理


swap分区:(存放内存溢出来的数据)

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

一:swap基本概念

前提:知道内存回收概念

为什么要进行内存回收?

1:内核需要为任何时刻突发到来的内存申请提供足够的内存。所以一般情况下保证有足够的free空间对于内核来说是必要的。所以内核有必要设计一个周期性回收内存的机制,以便cache的使用和其他相关内存的使用不至于让系统的剩余内存长期处于很少的状态。

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

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

  • 1:一个是使用 kswapd进程对内存进行周期检查 ,以保证平常状态下剩余内存尽可能够用。一个是由内核进程kswapd直接调用内存回收的逻辑进行内存回收;

  • 2:另一个是 直接内存回收(directpagereclaim) ,就是当内存分配时没有空闲内存可以满足要求时,触发直接内存回收。另一个是内存申请的时候进入slow path的内存申请逻辑进行回收。

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

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

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

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

    linux中对swap分区的管理_swap

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

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

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

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

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

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

以上总结:回收内存可以有两种途径(匿名页交换(swap)和file缓存清空(直接释放))

备注:vim /proc/sys/vm/swappiness

里面的数字表示swap和缓存清空相比较被使用的优先级


二:swap分区的管理
swapon -s        ##查看系统中的swap分区

1:当以硬盘分区作为swap交换空间时:

fdisk  /dev/vdb        ##新建一个swap分区

[root@ftp-server ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 1
Invalid partition type `1'

Command (m for help): q

[root@ftp-server ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): 
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
[root@ftp-server ~]# 
[root@ftp-server ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
Partition number (1-4, default 1): 
First sector (2048-20971519, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +2G
Partition 1 of type Linux and of size 2 GiB is set

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): l

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT            
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor      
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary  
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS    
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep        
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT            
1e  Hidden W95 FAT1 80  Old Minix      
Hex code (type L to list all codes): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'

Command (m for help): p

Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000ccf0e

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048     4196351     2097152   82  Linux swap / Solaris

Command (m for help): wq
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks
[root@ftp-server ~]# partprobe     ##同步分区表
[root@ftp-server ~]# mkswap /dev/vdb1    ##将分区格式化为swap
[root@ftp-server ~]# swapon -a /dev/vdb1  ##添加swap分区
[root@ftp-server ~]# swapon -s           ##查看swap分区
Filename                Type        Size    Used    Priority
/dev/vdb1                                  partition    2097148    0    -1

永久添加swap

cat /etc/fstab
/dev/vdb1       swap    swap    defaults,pri=1  0       0

pri表示优先级

2:当以文件作为swap分区时

dd if=/dev/zero of=/swapfile bs=1M count=1000 ##创建一个1G大小的文件

mkswap /swapfile    ##格式化为swap类型

swapon -a /swapfile    ##临时添加到swap里

3:删除swap分区

vim /etc/fstab  ##删除此文件中添加的swap行
swapoff /swapfile ##断开swap文件链接
swapoff /dev/vdb1 ##断开swap磁盘链接
rm -rf /swapfile  ##删除文件
fdisk /dev/vdb      ##删除磁盘分区
partprobe      ##同步分区表