1. 程式人生 > >Linux虛擬記憶體(swap)調優篇-swappiness引數

Linux虛擬記憶體(swap)調優篇-swappiness引數

                     Linux虛擬記憶體(swap)調優篇

                                           作者:尹正傑

版權宣告:原創作品,謝絕轉載!否則將追究法律責任。

 

  swappiness的值的大小對如何使用swap分割槽是有著很大的聯絡的。先前,人們建議把vm.swapiness設定為0,它意味著“除非發生記憶體益處,否則不要進行記憶體交換”。直到Linux核心3.5-rcl版本釋出,這個值的意義才發生了變化。這個變化被一直到其他的發行版本上,包括RedHat企業版核心2.6.32-303。在發生變化之後,0意味著“在任何情況下都不要發生交換”。所以現在建議把這個值設定為1。swappiness=100的時候表示積極的使用swap分割槽,並且把記憶體上的資料及時的搬運到swap空間裡面。

 

 

一.建立交換分割槽

1>.什麼是虛擬記憶體

  如果實體記憶體不夠用時,可以將那些最近很少使用的頁面資料(Page)置換出去,即切換到硬碟上,但是要注意的是記憶體檔案的格式和硬碟中檔案的格式是不一樣的,所以這個分割槽必須格式化成跟記憶體相容的模式不能轉換成檔案的格式。以便把記憶體的page直接存入這個分割槽,方便記憶體直接呼叫。而這個頁面(page)資料對於32位的作業系統一個page大概是4K左右,對於64位作業系統這個page大小是可變的,4k-2M的大小都是比較常見的。事實上到底能使用多大的頁面(page)取決於CPU而不取決於記憶體喲!這就是虛擬記憶體的概念。在linux上我們稱之為交換分割槽。記住,虛擬記憶體必須是一個單獨的分割槽。

2>.虛擬記憶體能代替實體記憶體執行程式嗎?

  答案是否定的,只是使用虛擬記憶體暫時儲存資料,而不是代替實體記憶體執行程式。 

3>.虛擬記憶體的作用

  當執行某個大程式、大遊戲,需要的記憶體超過空閒記憶體但小於實體記憶體總量時,會暫時把記憶體裡這些資料放到磁碟上的虛擬記憶體裡,空出實體記憶體運行遊戲。等退出遊戲後,又會把虛擬記憶體裡的東西讀出來,放回實體記憶體。所以,虛擬記憶體,並不是用來虛擬實體記憶體的,而是暫存資料的。如果對記憶體的需求大於實體記憶體總量,那虛擬記憶體設多大都不管用。電腦記憶體太低,根本的方法還是增加實體記憶體,才能流暢。虛擬記憶體機制上就不管用,即使管用,比實體記憶體低100倍的速度,也管不上什麼實際的作用。所以,虛擬記憶體大了是沒用的,反而白佔用磁碟空間。

4>.交換分割槽常用的引數介紹

交換分割槽:
      mkswap 格式化為虛擬記憶體
      -L label 指定卷標
      swapon 啟動虛擬記憶體
      -a 啟動所有的虛擬分割槽
      -p:指定優先順序
      swapoff 關閉虛擬記憶體
      更多引數請參考man mkswap

5>.案例實操-建立交換分割槽的步驟

[[email protected] ~]# fdisk /dev/sdb  #對第二塊硬碟進行分割槽調整

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): p  #檢視當前分割槽情況

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x8614a108

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         264     1060290   83  Linux
/dev/sdb3             265         526     2104515   83  Linux
/dev/sdb4             527        1305     6257317+   5  Extended
/dev/sdb5             527         919     3156741   83  Linux
/dev/sdb6             920        1181     2104483+  83  Linux    #我想講第6個分割槽弄成交換分割槽。

Command (m for help): t  #調整分割槽ID
Partition number (1-6): 6  #選擇分割槽編號為6
Hex code (type L to list codes): L   #檢視分割槽型別所對應的ID號,我們發現“82”就是交換分割槽的編號

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

Command (m for help): P   #檢視當前分割槽情況

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x8614a108

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         264     1060290   83  Linux
/dev/sdb3             265         526     2104515   83  Linux
/dev/sdb4             527        1305     6257317+   5  Extended
/dev/sdb5             527         919     3156741   83  Linux
/dev/sdb6             920        1181     2104483+  82  Linux swap / Solaris

Command (m for help): W  #儲存並退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[[email protected] ~]#
[[email protected] ~]# fdisk -l /dev/sdb  #檢視分割槽資訊

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x8614a108

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         264     1060290   83  Linux
/dev/sdb3             265         526     2104515   83  Linux
/dev/sdb4             527        1305     6257317+   5  Extended
/dev/sdb5             527         919     3156741   83  Linux
/dev/sdb6             920        1181     2104483+  82  Linux swap / Solaris
[[email protected] ~]# 
調整分割槽為交換分割槽(swap)格式
[[email protected] ~]# kpartx -af /dev/sdb
[[email protected] ~]# partx -a /dev/sdb   #重讀分割槽表資訊,其實也可以不用敲擊這些命令的如果你是一塊新硬碟的話。
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3
BLKPG: Device or resource busy
error adding partition 4
BLKPG: Device or resource busy
error adding partition 5
BLKPG: Device or resource busy
error adding partition 6
[[email protected] ~]# 
用partx 重讀一下分割槽表,避免系統未識別最新分割槽資訊。
[[email protected] ~]# mkswap /dev/sdb6  #將分割槽格式化成swap格式
Setting up swapspace version 1, size = 2104476 KiB
no label, UUID=41687bb2-c775-489c-9b32-1e4be73c233b   #看見沒有,這裡是“no label”,是因為我沒有定義卷標名。
[[email protected] ~]# 
[[email protected] ~]# mkswap -L myswap /dev/sdb6   #用-L引數定義一個卷標名。
Setting up swapspace version 1, size = 2104476 KiB
LABEL=myswap, UUID=0553b99a-ee75-4476-8eda-70c591206467  #看見沒,“LABEL=myswap”這就是我定義的卷標名稱。
[[email protected] ~]# 
用mkswap定義卷標名稱
[[email protected] ~]# cat /proc/meminfo | grep "^S"   #檢視當前交換分割槽大小
SwapCached:            0 kB
SwapTotal:       2031612 kB  #目前交換分割槽大小為2G
SwapFree:        2031612 kB  #表示空閒交換分割槽大小
Shmem:              1444 kB
Slab:              75020 kB
SReclaimable:      15620 kB
SUnreclaim:        59400 kB
[[email protected] ~]#
[[email protected] ~]# swapon /dev/sdb6   #啟用我們已經格式化好的交換分割槽“/dev/sdb”
[[email protected] ~]# cat /proc/meminfo | grep "^S"   #再次檢視當前交換分割槽大小
SwapCached:            0 kB
SwapTotal:       4136088 kB   #我們發現交換分割槽大小變大了2G
SwapFree:        4136088 kB
Shmem:              1444 kB
Slab:              75148 kB
SReclaimable:      15656 kB
SUnreclaim:        59492 kB
[[email protected] ~]#
[[email protected] ~]# swapoff /dev/sdb6  #關閉交換分割槽“/dev/sdb”
[[email protected] ~]#
[[email protected] ~]# cat /proc/meminfo | grep "^S"  #驗證是否關閉成功
SwapCached:            0 kB
SwapTotal:       2031612 kB   #發現的確是少了2G的空間
SwapFree:        2031612 kB
Shmem:              1444 kB
Slab:              75068 kB
SReclaimable:      15636 kB
SUnreclaim:        59432 kB
[[email protected] ~]#
swapon和swapoff的用法展示

6>.Linux清除swap方法 

  想要了解更多關於檔案系統的知識,詳情請參考:https://www.cnblogs.com/yinzhengjie/p/6840563.html 

 

二.swappiness引數在記憶體與交換分割槽之間優化作用