SWAP知識總結

lusklusklusk發表於2017-07-06
Swap space in Linux is used when the amount of physical memory (RAM) is full. If the system needs more memory resources and the RAM is full, inactive pages in memory are moved to the swap space. While swap space can help machines with a small amount of RAM, it should not be considered a replacement for more RAM. Swap space is located on hard drives, which have a slower access time than physical memory.Swap space can be a dedicated swap partition (recommended), a swap file, or a combination of swap partitions and swap files.


Linux核心為了提高讀寫效率與速度,會將檔案在記憶體中進行快取,這部分記憶體就是Cache Memory(快取記憶體)。即使你的程式執行結束後,Cache Memory也不會自動釋放。這就會導致你在Linux系統中程式頻繁讀寫檔案後,你會發現可用實體記憶體變少。當使用者提交程式,然後產生程式,在機器上執行,機器會判斷當前實體記憶體是否還有空閒允許程式調入記憶體執行,如果有那麼則直接調入記憶體進行執行;如果沒有,那麼會根據優先順序選擇一個程式掛起,把該程式交換到swap中等待,該程式佔用的實體記憶體中的一部分空間就被釋放出來了,然後把新的程式調入到記憶體中執行。等到那個掛起程式要執行時,再從Swap分割槽中恢復儲存的資料到記憶體中。
但是並不是所有從實體記憶體中交換出來的資料都會被放到Swap中(如果這樣的話,Swap就會不堪重負),有相當一部分資料被直接交換到檔案系統。例如,有的程式會開啟一些檔案,對檔案進行讀寫(其實每個程式都至少要開啟一個檔案,那就是執行程式本身),當需要將這些程式的記憶體空間交換出去時,就沒有必要將檔案部分的資料放到Swap空間中了,而可以直接將其放到檔案裡去。如果是讀檔案操作,那麼記憶體資料被直接釋放,不需要交換出來,因為下次需要時,可直接從檔案系統恢復;如果是寫檔案,只需要將變化的資料儲存到檔案中,以便恢復。當實體記憶體和swap都被使用完那麼就會報錯out of memory。


Swap被使用的日常例子
在使用Windows系統時,可以同時執行多個程式,當你切換到一個很長時間沒有理會的程式時,會聽到硬碟“嘩嘩”直響。這是因為這個程式的記憶體被那些頻繁執行的程式給“偷走”了,放到了Swap區中。因此,一旦此程式被放置到前端,它就會從Swap區取回自己的資料,將其放進記憶體,然後接著執行。


Swap空間的作用
當系統的實體記憶體不夠用的時候,就需要將實體記憶體中的一部分空間釋放出來,以供當前執行的程式使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程式,這些被釋放的程式被臨時儲存到Swap空間中,等到那些程式要執行時,再從Swap中恢復儲存的資料到記憶體中。從這也可以看出swap扮演了一個非常重要的角色,就是暫存被換出的程式。根據這種換入和換出,實現了記憶體的迴圈利用,讓使用者感覺不到記憶體的限制。



Swap分割槽對效能的影響
正方:Swap不能代替實體記憶體用!因為swap畢竟還是以磁碟來偽裝成記憶體,交換的操作是磁碟IO的操作而不是記憶體的load與store操作。
反方:正常的情況即實體記憶體還夠的情況下,很少使用swap記憶體區,實體記憶體不夠的情況下,swap空間上儲存的也是系統不會頻繁使用的資料,呼叫的次數非常少,效能問題幾乎可以忽略,實體記憶體極度不夠的話,效能問題與Swap分割槽有啥關係,這時你加多數Swap分割槽也無濟於事,只能加實體記憶體。



使用多大比例記憶體之後開始使用swap
可在/proc/sys/vm/swappiness檔案中進行調整,預設是60。該引數可以從0-100進行設定。0就是最大限度使用記憶體,儘量不使用swap;100就是積極使用swap。A low value means the kernel will try to avoid swapping as much as possible where a higher value instead will make the kernel aggressively try to use swap space


臨時修改swappiness引數的方法(不能直接vi /proc/sys/vm/swappiness ),重啟後失效
方法1:echo 60 >/proc/sys/vm/swappiness
方法2:sysctl vm.swappiness=60

永久修改swappiness引數的方法,重啟後生效
修改/etc/sysctl.conf裡面的vm.swappiness,可以直接vi /etc/sysctl.conf



開啟關閉swap交換分割槽
swapoff /dev/dm-1
swapon /dev/dm-1

swap交換分割槽不是tmpfs對應的/dev/shm分割槽,而是swapon -s對應的Filename的分割槽
[root@localhost ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       4194296 42352   -1
[root@localhost ~]# ll /dev/mapper/VolGroup-lv_swap
lrwxrwxrwx 1 root root 7 6月  27 10:34 /dev/mapper/VolGroup-lv_swap -> ../dm-1
[root@localhost ~]# fdisk -l|grep swap
Disk /dev/mapper/VolGroup-lv_swap: 4294 MB, 4294967296 bytes
[root@localhost ~]# ll /dev|grep dm-1
brw-rw----   1 root disk    253,   1 6月  27 10:34 dm-1
[root@localhost ~]# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   35G  3.6G   30G  11% /
tmpfs                         3.9G   72K  3.9G   1% /dev/shm
/dev/sda1                     485M   39M  421M   9% /boot
/dev/sdb1                     197G  100G   87G  54% /db



Swap大小如何確定
CENTOS官網採用如下公式:
M = Amount of RAM in GB
S = Amount of swap in GB,
then If M < 2, S = M *2 Else S = M + 2。

ORACLE的官方文件推薦
RAM                        ==>Swap Space
Up to 512 MB               ==>2 times the size of RAM
Between 1024 MB and 2048 MB==>1.5 times the size of RAM
Between 2049 MB and 8192 MB==>Equal to the size of RAM
More than 8192 MB          ==>0.75 times the size of RAM



檢視Swap記憶體的命令
free和swapon -s和cat /proc/swaps三者都可以看到大概的Swap資訊
swapon -s和cat /proc/swaps還可以看到Swap對應的磁碟資訊
vmstat可以看到間隔時間內Swap in、Swap out的大小
[root@localhost ~]# free -k|grep Swap
Swap:      4194296      42352    4151944
[root@localhost ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       4194296 42352   -1
[root@localhost ~]#  cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       4194296 42352   -1



[root@localhost ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          7872       6580       1292          0        104       1037
-/+ buffers/cache:       5339       2433
Swap:         4095       3241       854

第二行
total = used + free

第三行
(-buffers/cache) used記憶體數:第一部分Mem行中的 used - buffers - cached (反映的是被程式實實在在用掉的記憶體)
(+buffers/cache) free記憶體數: 第一部分Mem行中的 free + buffers + cached (反映的是可以挪用的記憶體總數)

第四行
指SWAP交換分割槽

1)如果沒有swap:
swap用了3241M,空閒的實體記憶體是2433M,也就是說,如果沒有swap,記憶體已經爆了。
2)swap並沒有影響到效能:
系統還有足夠的實體記憶體(2433M),換句話說,現在swap裡儲存的還是不常使用的資料(也就是swap正在發揮正常的作用)。


[root@localhost ~]# vmstat 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0  42352 1322484 209984 6182296    0    0    17    21    4    3  0  0 100  0  0
 0  0  42352 1322484 209984 6182296    0    0     0     0   42   34  0  0 100  0  0
 0  0  42352 1322484 209984 6182296    0    0     0     0   38   36  0  0 100  0  0
 0  0  42352 1322484 209984 6182296    0    0     0     0   61   43  0  0 100  0  0
 0  0  42352 1322484 209984 6182296    0    0     0     0   34   33  0  0 100  0  0

vmstat 3表示每3秒收集一次
si表示當前(三秒鐘之內)交換回記憶體(Swap in)的總量,單位為kbytes;
so表示當前(三秒鐘之內)交換出記憶體(Swap out)的總量,單位為kbytes。 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2141646/,如需轉載,請註明出處,否則將追究法律責任。