swap分區
通常memory是機器的物理內存,讀寫速度低於cpu一個量級,但是高於磁盤不止一個量級。所以,程序和數據如果在內存的話,會有非常快的讀寫速度。但是,內存的造價是要高於磁盤的,雖然相對來說價格一直在降低。除此之外,內存的斷電丟失數據也是一個原因說不能把所有數據和程序都保存在內存中。既然不能全部使用內存,那數據還有程序肯定不可能一直霸占在內存中。當內存沒有可用的,就必須要把內存中不經常運行的程序給踢出去。但是踢到哪里去,這時候swap就出現了。
swap全稱為swap place,即交換區
,當內存不夠的時候,被踢出的進程被暫時存儲到交換區。當需要這條被踢出的進程的時候,就從交換區重新加載到內存,否則它不會主動交換到真實內存中。
計算機對內存分為物理內存與虛擬內存(注意虛擬內存和虛擬地址空間的區別)。物理內存就是計算機的實際內存大小,由RAM芯片組成的。虛擬內存則是虛擬出來的、使用磁盤代替內存。虛擬內存的出現,讓機器內存不夠的情況得到部分解決。當程序運行起來由操作系統做具體虛擬內存到物理內存的替換和加載(相應的頁與段的虛擬內存管理)。
這里的虛擬內存即所謂的swap
。
當用戶提交程序,然后產生進程,在機器上運行。機器會判斷當前物理內存是否還有空閑允許進程調入內存運行,如果有那么則直接調入內存進行運行;如果沒有,那么會根據優先級選擇一個進程掛起,把該進程交換到swap中等待,然后把新的進程調入到內存中運行。根據這種換入和換出,實現了內存的循環利用,讓用戶感覺不到內存的限制
。從這也可以看出swap扮演了一個非常重要的角色,就是暫存被換出的進程。內存與swap之間是按照內存頁為單位來交換數據的,一般Linux中頁的大小設置為4kb。而內存與磁盤則是按照塊來交換數據的。
調整swappiness參數
swappiness的值的大小對如何使用swap分區是有着很大的聯系的。swappiness=0的時候表示最大限度使用物理內存,然后才是 swap空間,swappiness=100的時候表示積極的使用swap分區,並且把內存上的數據及時的搬運到swap空間里面。linux的基本默認設置為60,具體如下:
一般默認值都是60
[root@timeserver ~]# cat /proc/sys/vm/swappiness
60
也就是說,你的內存在使用到
100-60=40%
的時候,就開始出現有交換分區的使用。這樣子會加大系統io,同時造的成大量頁的換進換出,嚴重影響系統的性能,所以我們在操作系統層面,要盡可能使用內存。
通過sysctl -q vm.swappiness可以查看參數的當前設置:
[root@admin ~]$ sysctl -q vm.swappiness
vm.swappiness = 30
臨時調整的方法如下,我們調成10:
[root@timeserver ~]#
sysctl vm.swappiness=10
vm.swappiness = 10
[root@timeserver ~]# cat /proc/sys/vm/swappiness
10
這只是臨時調整的方法,重啟后會回到默認設置的
要想永久調整的話,需要將
需要在/etc/sysctl.conf修改
,加上:
[root@timeserver ~]#
cat /etc/sysctl.conf
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
vm.swappiness=10
激活設置
[root@timeserver ~]#
sysctl -p
在linux中,可以通過修改swappiness內核參數,降低系統對swap的使用,從而提高系統的性能。