一.SWAP 说明

 

1.1 SWAP 概述

当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

 

这个是SWAP 交换分区的作用。 实际上,我们更关注的应该是SWAP分区的大小问题。 设置多大才是最优的。

 

一般来说可以按照如下规则设置swap大小:

4G以内的物理内存,SWAP 设置为内存的2倍。

4-8G的物理内存,SWAP 等于内存大小。

8-64G 的物理内存,SWAP 设置为8G。

64-256G物理内存,SWAP 设置为16G。

 

实际上,系统中交换分区的大小并不取决于物理内存的量,而是取决于系统中内存的负荷,所以在安装系统时要根据具体的业务来设置SWAP的值。

 

1.2 系统在什么情况下才会使用SWAP?

 

实际上,并不是等所有的物理内存都消耗完毕之后,才去使用swap的空间,什么时候使用是由swappiness 参数值控制。 

 
  
  1. [root@rhce ~]# cat /proc/sys/vm/swappiness 
  2. 60 

 该值默认值是60.

swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,

swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

 

现在服务器的内存动不动就是上百G,所以我们可以把这个参数值设置的低一些,让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高系统的性能。

 

1.3 如何修改swappiness参数?

 

--临时性修改: 

 
  
  1. [root@rhce ~]# sysctl vm.swappiness=10 
  2. vm.swappiness = 10 
  3. [root@rhce ~]# cat /proc/sys/vm/swappiness 
  4. 10 

这里我们的修改已经生效,但是如果我们重启了系统,又会变成60. 

 
  
  1. [root@dave ~]# swapon /dev/sda2 

--永久修改:

在/etc/sysctl.conf 文件里添加如下参数:

 

 
  
  1. vm.swappiness=10 

或者: 

 
  
  1. [root@rhce ~]# echo 'vm.swappiness=10' >>/etc/sysctl.conf 

 

保存,重启,就生效了。

 

二.管理SWAP

 

2.1 查看系统当前SWAP 空间大小

 

 
  
  1. [root@dave ~]# free -m 
  2.             total       used       free    shared    buffers     cached 
  3. Mem:         1954       1923         31          0         21       1345 
  4. -/+ buffers/cache:        555       1399 
  5. Swap:        1999         21       1978 

  

2.2 释放SWAP 空间

 

假设我们的系统出现了性能问题,我们通过vmstat命令看到有大量的swap,而我们的物理内存又很充足,那么我们可以手工把swap 空间释放出来。让进程去使用物理内存,从而提高性能。

 

 
  
  1. [root@dave ~]# vmstat 1 5 
  2. procs -----------memory---------- ---swap-------io---- --system-- -----cpu----- 
  3.  r  b  swpd   free   buff cache   si   so   bi    bo   in  cs us sy id wa st 
  4.  0  0 22272  32620  22032 1378312    0   0    33    38   0   41 1  2 96  0  0 
  5.  0  0 22272  32612  22032 1378340    0   0     0     0 902 1627  0  5 95 0  0 
  6.  0  0 22272  32612  22032 1378340    0   0     0     0 905 1636  1  8 91 0  0 
  7.  0  0 22272  32612  22032 1378340    0   0     0    32 907 1616  0  6 94 0  0 
  8.  0  0 22272  32612  22032 1378340    0   0     0     0 924 1651  0  8 92 0  0 
  9. [root@dave ~]# 
  10.   
  11. [root@dave ~]# free -m 
  12.             total       used       free    shared    buffers    cached 
  13. Mem:         1954       1923         31          0         21       1345 
  14. -/+ buffers/cache:        555       1399 
  15. Swap:         1999         21       1978 

 

 

注意:free命令默认单位为k, -m 单位为M。 我们这里的swap使用了21M的空间。

 

--查看当前swap 的使用

 

 
  
  1. [root@dave ~]# swapon -s 
  2. Filename                                Type            Size    Used   Priority 
  3. /dev/sda2                               partition       2047992 22272   -1 
  4.   
  5. [root@dave ~]# cat /proc/swaps 
  6. Filename                                Type            Size    Used   Priority 
  7. /dev/sda2                               partition       2047992 22272   -1 
  8. [root@dave ~]# 
  9.   
  10. swapon –s 等于 cat/proc/swaps 

--关闭swap 交换分区:

 

 
  
  1. [root@dave ~]# swapoff/dev/sda2 
  2. [root@dave ~]# swapon -s 
  3. Filename                                Type            Size    Used   Priority 

--查看swap的使用情况: 

 
  
  1. [root@dave ~]# free -m 
  2.             total       used       free    shared    buffers     cached 
  3. Mem:         1954       1939         15          0         21       1343 
  4. -/+ buffers/cache:        573       1381 
  5. Swap:           0          0          0 

--启用swap分区:

 
  
  1. [root@dave ~]# swapon /dev/sda2 

--验证状态:

 
  
  1. [root@dave ~]# swapon -s 
  2. Filename                                Type            Size    Used   Priority 
  3. /dev/sda2                               partition       2047992 0       -1 

 

这里/dev/sda2是我们在安装操作系统时划分的磁盘分区。实际上,我们也可以使用文件来做为交换分区。具体后面会演示。

 

我们上面写的是具体名称,也可是使用swapoff  -a进程,演示如下:

 

 
  
  1. [root@dave ~]# swapoff -a 
  2. [root@dave ~]# swapon -s 
  3. Filename                                Type            Size    Used   Priority 
  4. [root@dave ~]# swapon -a 
  5. [root@dave ~]# swapon -s 
  6. Filename                                Type            Size    Used   Priority 
  7. /dev/sda2                               partition       2047992 0       -1 
  8. [root@dave ~]# 

 

我们查看/etc/fstab 文件,我们的swap 也配置到开启自动启动了。 

 
  
  1. [root@dave ~]# cat /etc/fstab 
  2.   
  3. # /etc/fstab 
  4. # Created by anaconda on Wed Aug 15 00:09:26 2012 
  5. # Accessible filesystems, by reference, aremaintained under '/dev/disk' 
  6. # See man pages fstab(5), findfs(8), mount(8)and/or blkid(8) for more info 
  7. UUID=beea0820-3ac3-4551-9bf0-1b2a462d3ab4 /                       ext4    defaults        1 1 
  8. UUID=e5ec9543-143f-4e3b-b8a7-4fa05b01836a/boot                   ext4    defaults        1 2 
  9. UUID=b256c0bb-9000-456b-b9eb-18239b5df5ddswap                    swap    defaults        0 0 
  10. tmpfs                   /dev/shm                tmpfs   defaults        0 0 
  11. devpts                  /dev/pts                devpts  gid=5,mode=620  0 0 
  12. sysfs                   /sys                    sysfs   defaults        0 0 
  13. proc                    /proc                   proc    defaults        0 0 

 

简单的说:

(1)ext分区是否启用由mount及umount控制。

(2)swap分区是否启动,由swapon及swapoff控制。

 

我们对swap 空间的释放,也是通过关闭swap分区,在启动swap 分区来实现的。

 

 

2.3 使用文件来作为SWAP 交换分区

 

我们这里使用文件添加一个交换区,具体操作如下:

 

--在根目录下生成一个文件:swap-file,大小1G:

 

 
  
  1. [root@dave u01]# dd if=/dev/zero of=/swap-filebs=1M count=1024 
  2. 1024+0 records in 
  3. 1024+0 records out 
  4. 1073741824 bytes (1.1 GB) copied, 5.91518 s, 182MB/s 
  5. [root@dave u01]# cd / 
  6. [root@dave /]# ls 
  7. bin  cgroup  etc   lib   lost+found  misc  net proc  sbin     srv       sys  u01  usr 
  8. boot dev     home  lib64 media       mnt   opt root  selinux  swap-file tmp  u02  var 

 

--将生成的文件格式化成交换分区: 

 
  
  1. [root@dave /]# mkswap /swap-file 
  2. mkswap: /swap-file: warning: don't erase bootbitssectors 
  3.         onwhole disk. Use -f to force
  4. Setting up swapspace version 1, size = 1048572 KiB 
  5. no label, UUID=653bbeb5-4abb-4295-b110-5847e073140d 

 

--这里没有分区的lable,只有一个UUID。 

 

--启动swap分区并查看状态: 

 
  
  1. [root@dave /]# swapon /swap-file 
  2. [root@dave /]# swapon -s 
  3. Filename                                Type            Size    Used   Priority 
  4. /dev/sda2                               partition       2047992 0       -1 
  5. /swap-file                              file            1048568 0       -2 

 

 

这里我们就看到了2个swap。

 

但是这个只对当前有效,如果想下次重启系统后还继续有效,需要将配置写入到/etc/fstab文件中。

 

在/etc/fstab文件中添加如下内容:

 

 
  
  1. UUID=653bbeb5-4abb-4295-b110-5847e073140d swap                    swap    defaults        0 0 

 

或者:

 
  
  1. /swap-file swap                    swap    defaults        0 0 

 

2.4 使用磁盘添加swap

 

先划分一个1G的磁盘分区出来: 

 
  
  1. [root@rhce /]# fdisk /dev/sdb 
  2. Device contains neither a valid DOS partitiontable, nor Sun, SGI or OSF disklabel 
  3. Building a new DOS disklabel with disk identifier0x65edb587. 
  4. Changes will remain in memory only, until youdecide to write them. 
  5. After that, of course, the previous content won'tbe recoverable. 
  6.   
  7. Warning: invalid flag 0x0000 of partition table 4will be corrected by w(rite) 
  8.   
  9. WARNING: DOS-compatible mode is deprecated. It'sstrongly recommended to 
  10.         switch off the mode (command 'c'and change display units to 
  11.         sectors (command 'u'). 
  12.   
  13. Command (m for help): n 
  14. Command action 
  15.    e   extended 
  16.    p   primary partition (1-4) 
  17. Partition number (1-4): 1 
  18. First cylinder (1-652, default 1): 
  19. Using default value 1 
  20. Last cylinder, +cylinders or +size{K,M,G} (1-652,default 652): +1G 
  21.   
  22. Command (m for help): w 
  23. The partition table has been altered! 
  24.   
  25. Calling ioctl() to re-read partition table
  26. Syncing disks. 
  27. [root@rhce /]# fdisk -l 
  28.   
  29. Disk /dev/sda: 21.5 GB, 21474836480 bytes 
  30. 255 heads, 63 sectors/track, 2610 cylinders 
  31. Units = cylinders of 16065 * 512 = 8225280 bytes 
  32. Sector size (logical/physical): 512 bytes / 512bytes 
  33. I/O size (minimum/optimal): 512 bytes / 512 bytes 
  34. Disk identifier: 0x000bcd24 
  35.   
  36.    DeviceBoot      Start         End      Blocks  Id  System 
  37. /dev/sda1  *           1         128    1024000   83  Linux 
  38. Partition 1 does not end on cylinder boundary. 
  39. /dev/sda2             128         511    3072000   82  Linux swap / Solaris 
  40. Partition 2 does not end on cylinder boundary. 
  41. /dev/sda3             511        2611   16874496   83  Linux 
  42. Disk /dev/sdb: 5368 MB, 5368709120 bytes 
  43. 255 heads, 63 sectors/track, 652 cylinders 
  44. Units = cylinders of 16065 * 512 = 8225280 bytes 
  45. Sector size (logical/physical): 512 bytes / 512bytes 
  46. I/O size (minimum/optimal): 512 bytes / 512 bytes 
  47. Disk identifier: 0x65edb587 
  48.   
  49.    DeviceBoot      Start         End      Blocks  Id  System 
  50. /dev/sdb1               1         132    1060258+  83  Linux 
  51. … 

 

 

注意这里fdisk ID的编号。 这里显示的83,它代表这个分区是ext的分区,这个是不能用来做swap的。

 

在fdisk 命令可以看到具体数据的含义:

 

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

 

 

ext的分区ID号:0x83   

swap的分区ID号:0x82

 

--将/dev/sdb1分区改成swap 分区:

 

 
  
  1. [root@rhce ~]# fdisk /dev/sdb 
  2.   
  3. WARNING: DOS-compatible mode is deprecated. It'sstrongly recommended to 
  4.         switch off the mode (command 'c'and change display units to 
  5.         sectors (command 'u'). 
  6.   
  7. Command (m for help): h 
  8. h: unknown command 
  9. Command action 
  10.    a   toggle a bootable flag 
  11.    b   edit bsd disklabel 
  12.    c   toggle the dos compatibility flag 
  13.    d   delete a partition 
  14.    l   list known partition types 
  15.    m   print this menu 
  16.    n   add a new partition 
  17.    o   create a new empty DOS partition table 
  18.    p   print the partition table 
  19.    q   quit without saving changes 
  20.    s   create a new empty Sun disklabel 
  21.   t   change a partition's system id 
  22.    u   change display/entry units 
  23.    v   verify the partition table 
  24.    w   write table to disk and exit 
  25.    x   extra functionality (experts only
  26.   
  27. Command (m for help): t 
  28. Selected partition 1 
  29. Hex code (type L to list codes): L 
  30.   
  31.  0  Empty           24 NEC DOS         81  Minix / old Lin bf  Solaris        
  32.  1  FAT12           39 Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT- 
  33.  2  XENIX root      3c PartitionMagic  83  Linux           c4 DRDOS/sec (FAT- 
  34.  3  XENIX usr      40  Venix 80286     84 OS/2 hidden C:  c6  DRDOS/sec (FAT- 
  35.  4  FAT16 <32M      41 PPC PReP Boot   85  Linux extended  c7 Syrinx         
  36.  5  Extended        42 SFS             86  NTFS volume set da  Non-FS data    
  37.  6  FAT16           4d QNX4.x          87 NTFS volume set db  CP/M / CTOS /. 
  38.  7  HPFS/NTFS       4e QNX4.x 2nd part 88  Linuxplaintext de  Dell Utility   
  39.  8  AIX             4f QNX4.x 3rd part 8e  Linux LVM       df BootIt         
  40.  9  AIX bootable    50 OnTrack DM      93  Amoeba          e1 DOS access     
  41.  a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3 DOS R/O        
  42.  b  W95 FAT32       52 CP/M            9f  BSD/OS          e4 SpeedStor      
  43.  c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs        
  44.  e  W95 FAT16 (LBA) 54  OnTrackDM6      a5 FreeBSD         ee  GPT            
  45.  f  W95 Ext'd (LBA) 55  EZ-Drive        a6 OpenBSD         ef  EFI (FAT-12/16/ 
  46. 10  OPUS            56 Golden Bow      a7  NeXTSTEP        f0 Linux/PA-RISC b 
  47. 11  HiddenFAT12    5c  Priam Edisk     a8 Darwin UFS      f1  SpeedStor      
  48. 12  Compaqdiagnost 61  SpeedStor       a9 NetBSD          f4  SpeedStor      
  49. 14  HiddenFAT16 <3 63  GNU HURD or Sys ab  Darwin boot     f2 DOS secondary  
  50. 16  HiddenFAT16    64  Novell Netware  af  HFS/ HFS+      fb  VMware VMFS    
  51. 17  HiddenHPFS/NTF 65  Novell Netware  b7 BSDI fs         fc  VMware VMKCORE 
  52. 18  ASTSmartSleep  70  DiskSecure Mult b8  BSDI swap       fd Linux raid auto 
  53. 1b  HiddenW95 FAT3 75  PC/IX           bb Boot Wizard hid fe  LANstep        
  54. 1c  HiddenW95 FAT3 80  Old Minix       be Solaris boot    ff  BBT            
  55. 1e  HiddenW95 FAT1 
  56. Hex code (type L to list codes):82 

 

 

Changed system type of partition1 to 82 (Linux swap / Solaris)

--注意这里更改磁盘分区的ID类型,如果不更在,在系统重启时会根据ID来判断磁盘的类型,那样在使用时就会出现错误。

 

 
  
  1. Command (m for help): w 
  2. The partition table has been altered! 
  3.   
  4. Calling ioctl() to re-read partition table
  5.   
  6. WARNING: Re-reading the partition table failed witherror 16: Device or resource busy. 
  7. The kernel still uses the old table. The new tablewill be used at 
  8. the next reboot or after you run partprobe(8) orkpartx(8) 
  9. Syncing disks. 

 

--格式化swap分区:

 
  
  1. [root@rhce /]# mkswap /dev/sdb1 
  2. Setting up swapspace version 1, size = 1060252 KiB 
  3. no label, UUID= bc913e6b-209a-49a7-b561-9b8c57294681 
  4.   
  5. [root@rhce /]# mkswap –L swap-disk/dev/sdc1 

一个设置了Lable,一个没设置。我们在添加/etc/fstab时,可是用LABLE名称,或者使用UUID来配置。 具体如上。

 
  
  1. isk /dev/sdb: 5368 MB, 5368709120 bytes 
  2. 255 heads, 63 sectors/track, 652 cylinders 
  3. Units = cylinders of 16065 * 512 = 8225280 bytes 
  4. Sector size (logical/physical): 512 bytes / 512bytes 
  5. I/O size (minimum/optimal): 512 bytes / 512 bytes 
  6. Disk identifier: 0x65edb587 
  7.   
  8.    DeviceBoot      Start         End      Blocks  Id  System 
  9. /dev/sdb1               1         132    1060258+  82  Linux swap / Solaris 
  10.   
  11.   
  12. Disk /dev/sdc: 5368 MB, 5368709120 bytes 
  13. 181 heads, 40 sectors/track, 1448 cylinders 
  14. Units = cylinders of 7240 * 512 = 3706880 bytes 
  15. Sector size (logical/physical): 512 bytes / 512bytes 
  16. I/O size (minimum/optimal): 512 bytes / 512 bytes 
  17. Disk identifier: 0x00000000 
  18.   
  19.    DeviceBoot      Start         End      Blocks  Id  System 
  20. /dev/sdc1               1         291    1053400   82  Linux swap / Solaris 

注意: 使用blkid 查看类型已经变成了swap:

 
  
  1. [root@rhce ~]# blkid 
  2. /dev/sda1: UUID="935f7fb2-2ef4-486f-ae4e-265eaf9f580f"TYPE="ext4" 
  3. /dev/sda2:UUID="43343402-9188-4cdc-9c79-0e36ab737517" TYPE="swap" 
  4. /dev/sda3:UUID="7e49fb2c-6fd8-461a-95d9-65d1f3994160" TYPE="ext4" 
  5. /dev/sdb1:UUID="bc913e6b-209a-49a7-b561-9b8c57294681" TYPE="swap" 
  6. /dev/sdc1:LABEL="swap-disk"UUID="799b4379-ca59-4508-ad04-2d18847b3fd9" TYPE="swap" 

这里的类型已经改变,我们可以尝试手工的启动swap 

 
  
  1. [root@rhce ~]# swapon /dev/sdc1 
  2. [root@rhce ~]# swapon -s 
  3. Filename                                Type            Size    Used   Priority 
  4. /dev/sda2                               partition       3071992 0       -1 
  5. /dev/sdb1                               partition       1060248 0       -2 
  6. /dev/sdc1                               partition       1053392 0       -3 

 

这里可以直接启用swap

 

 

我们这里把/dev/dbb1和/dev/sdc1都添加/etc/fstab 文件,在重启一下看看。 添加内容如下:

 

 
  
  1. UUID=bc913e6b-209a-49a7-b561-9b8c57294681 swap                    swap    defaults        0 0 
  2. LABEL=swap-disk        swap    swap    defaults        0 0 

 

重启系统后查看:

 
  
  1. [root@rhce ~]# swapon -s 
  2. Filename                                Type            Size    Used   Priority 
  3. /dev/sda2                               partition       3071992 0       -1 
  4. /dev/sdb1                               partition       1060248 0       -2 
  5. /dev/sdc1                               partition       1053392 0       -3 

--对/dev/sdb1 进行测试:

 
  
  1. [root@rhce ~]# swapoff /dev/sdb1 
  2. [root@rhce ~]# swapon -s 
  3. Filename                                Type            Size    Used   Priority 
  4. /dev/sda2                               partition       3071992 0       -1 
  5. [root@rhce ~]# swapon /dev/sdb1 
  6. [root@rhce ~]# swapon -s 
  7. Filename                                Type            Size    Used   Priority 
  8. /dev/sda2                               partition       3071992 0       -1 
  9. /dev/sdb1                               partition       1060248 0       -2 

 

2.5 SWAP 分区的删除

 

    Swapoff 文件之后,删除掉对应的空间,在从/etc/fstab删除对应的记录即可。

 

------------------------------------------------------------------------------------------------------------------------------------------

转自:

http://blog.csdn.net/tianlesoftware/article/details/8741873