一、 虛擬記憶體介紹 背景介紹 Memory指機器物理記憶體,讀寫速度低於CPU一個量級,但是高於磁碟不止一個量級。所以,程式和數據如果在記憶體的話,會有非常快的讀寫速度。但是,記憶體的造價是要高於磁碟的,且記憶體的斷電丟失數據也是不能把所有數據和程式都保存在記憶體中的原因。 既然不能全部使用記憶體,那數據還有程 ...
一、 虛擬記憶體介紹
背景介紹
Memory指機器物理記憶體,讀寫速度低於CPU一個量級,但是高於磁碟不止一個量級。所以,程式和數據如果在記憶體的話,會有非常快的讀寫速度。但是,記憶體的造價是要高於磁碟的,且記憶體的斷電丟失數據也是不能把所有數據和程式都保存在記憶體中的原因。
既然不能全部使用記憶體,那數據還有程式不可能一直霸占在記憶體中。當記憶體沒有可用的,就必須要把記憶體中不經常運行的程式踢出去。但是踢到哪裡去,這時候swap就出現了。
Swap全稱為swap place,即交換分區。當記憶體不夠的時候,被踢出的進程被暫時存儲到交換區。當需要這條被踢出的進程時,就從交換區重新載入到記憶體,否則它不會主動交換到真實記憶體中。
Swap介紹
在詳細介紹swap之前,需要知道的是電腦記憶體分為物理記憶體與虛擬記憶體(註意虛擬記憶體和虛擬地址空間的區別)。
物理記憶體是電腦的實際記憶體大小,由RAM晶元組成。虛擬記憶體則是虛擬出來的、使用磁碟代替記憶體。虛擬記憶體的出現,讓機器記憶體不夠的情況得到部分解決。當程式運行起來由操作系統做具體虛擬記憶體到物理記憶體的替換和載入(相應的頁與段的虛擬記憶體管理)。這裡的虛擬記憶體即所謂的swap。
當用戶提交程式,然後產生進程在機器上運行。機器會判斷當前物理記憶體是否還有空閑允許進程調入記憶體運行,如果有則直接調入記憶體進行;如果沒有,則會根據優先順序選擇一個進程掛起,把該進程交換到swap中等待,然後把新的進程調入到記憶體中運行。根據這種換入和換出,實現了記憶體的迴圈利用,讓用戶感覺不到記憶體的限制。從這也可以看出swap扮演了一個非常重要的角色,就是暫存被換出的進程。
記憶體與swap之間是按照記憶體頁為單位來交換數據的,一般Linux中頁的大小設置為4Kb。而記憶體與磁碟則是按照塊來交換數據的。
Swap的設置
從上可以看出,當物理記憶體使用完或者達到一定比例之後,我們可以使用swap做臨時的記憶體使用。當物理記憶體和swap都被使用完那麼就會出錯,如:out of memory。
對於使用多大比例記憶體之後開始使用swap,在系統配置文件中可以通過調整參數進行修改。
1 [root@localhost ~]# cat /proc/sys/vm/swappiness 2 60
該參數範圍為0-100。0就是最大限度使用記憶體,儘量不使用swap;100是積極使用swap。
物理記憶體無法更改,所以swap大小的設置將會影響應用能否正常運行。swap大小的確定,根據Centos官網介紹可以得出如下公式:
1 M = Amount of RAM in GB, and S = Amount of swap in GB, then If M < 2, S = M *2 Else S = M + 2
註意:最小不應小於32M。
Swap分區的數量對性能也有很大的影響。因為swap畢竟還是以磁碟來偽裝成記憶體,交換的操作是磁碟IO的操作而不是記憶體的ioad與store操作。如果有多個swap交換區,每個swap會有一定的優先順序,該優先順序也可以調整。swap空間的分配會以輪流的方式操作於所有的swap,這樣會大大均衡IO的負載,加快swap交換的速度。
swap相關命令
1 [root@localhost ~]# swapon -s #查看當前swap的使用情況 2 Filename Type Size Used Priority 3 /dev/sda3 partition 2064376 0 -1 4 [root@localhost ~]# cat /proc/swaps #查看當前swap的使用情況 5 Filename Type Size Used Priority 6 /dev/sda3 partition 2064376 0 -1 7 [root@localhost ~]# swapoff /dev/sda3 #關閉相應的swap_disk_name 8 [root@localhost ~]# swapon -s 9 Filename Type Size Used Priority 10 [root@localhost ~]# swapon /dev/sda3 #啟動相應的swap_disk_name 11 [root@localhost ~]# swapon -s 12 Filename Type Size Used Priority 13 /dev/sda3 partition 2064376 0 -1
二、 虛擬記憶體設置
1、檢查 Swap 空間
在設置 Swap 文件之前,有必要先檢查一下系統里有沒有既存的 Swap 文件。
運行以下命令:
swapon -s
如果返回的信息概要是空的,則表示 Swap 文件不存在。
2、檢查文件系統
在設置 Swap 文件之前,同樣有必要檢查一下文件系統,看看是否有足夠的硬碟空間來設置 Swap 。運行以下命令:
df -hal
檢查返回的信息,還剩餘足夠的硬碟空間即可。
3、創建並允許 Swap 文件
下麵使用 dd 命令來創建 Swap 文件。
dd if=/dev/zero of=/tmp/swapfile bs=1024 count=1024k
這樣就建立一個/tmp/swapfile的分區文件,大小為1G。
參數解讀:
if=文件名:輸入文件名,預設為標準輸入。即指定源文件。< if=input file >
of=文件名:輸出文件名,預設為標準輸出。即指定目的文件。< of=output file >
bs=bytes:同時設置讀入/輸出的塊大小為bytes個位元組
count=blocks:僅拷貝blocks個塊,塊大小等於bs指定的位元組數。
4、格式化並激活 Swap 文件
上面已經創建好 Swap 文件,還需要格式化後才能使用。運行命令:
dd if=/dev/zero of=/tmp/swapfile bs=1024 count=1024k
激活 Swap ,運行命令:
swapon /tmp/swapfile
以上步驟做完,再次運行命令:
swapon -s
你會發現返回的信息概要:
Filename Type Size Used Priority /tmp/swapfile file 524284 0 -1
如果要機器重啟的時候自動掛載 Swap ,那麼還需要修改 fstab 配置。
用 vim 打開 /etc/fstab 文件,在其最後添加如下一行:
/tmp/swapfile swap swap defaults 0 0
最後,賦予 Swap 文件適當的許可權:
chown root:root /tmp/swapfile chmod 600 /tmp/swapfile
同時,我們還可以修改 Linux Swap 空間的 swappiness ,降低對硬碟的緩存。
Linux 會使用硬碟的一部分做為 Swap 分區,用來進行進程調度–進程是正在運行的程式–把當前不用的進程調成‘等待(standby)’,甚至‘睡眠(sleep)’,一旦要用,再調成‘活動(active)’,睡眠的進程就會在 Swap 分區,把記憶體空出來讓給‘活動’的進程。
如果記憶體夠大,應當告訴 Linux 不必太多的使用 Swap 分區,可以通過修改 swappiness 的參數來設置。swappiness=0 的時候表示最大限度使用物理記憶體,然後才是 Swap 空間,swappiness=100 的時候表示積極的使用 Swap 分區,並且把記憶體上的數據及時的搬運到 Swap 空間裡面。
在 CentOS 中,swappiness 的預設值是60。
通過以下命令可以看到:
cat /proc/sys/vm/swappiness
返回值60
我們可以調整 swappiness 的值到一個合適的參數,從而達到最優化使用 Swap 的目的。這裡我們將其設為10。這樣你就將值由60改為10,這可以大大降低系統對於swap的寫入,建議記憶體為512M或更多的朋友採用此方法。如你你發現你對於swap的使用極少,可以將值設為0。這並不會禁止你對swap的使用,而是使你的系統對於swap的寫入儘可能的少,同時儘可能多的使用你的實際記憶體。這對於你在切換應用程式時有著巨大的作用,因為這樣的話它們是在物理記憶體而非swap分區中。
使用 sysctl 命令:
sysctl vm.swappiness=10
但是這隻是臨時性的修改,在你重啟系統後會恢復預設的60,要永久設置,還需要在 vim 中修改sysctl.conf:
vi /etc/sysctl.conf
在這個文檔的最後加上這樣一行:
# Search for the vm.swappiness setting. Uncomment and change it as necessary. vm.swappiness=10
輸入:x,保存退出 vim 。
這樣一來,Swap 分區重啟後都會生效了。
參考: https://www.cnblogs.com/004x/p/6651600.html
https://blog.csdn.net/shinaiqing/article/details/70132424