物理內(nèi)存不夠用,臨時(shí)增大Linux交換分區(qū)的方法
當(dāng)系統(tǒng)的物理內(nèi)存不夠用的時(shí)候,就需要將物理內(nèi)存中的一部分空間釋放出來(lái),以供當(dāng)前運(yùn)行的程序使用。那些被釋放的空間可能來(lái)自一些很長(zhǎng)時(shí)間沒(méi)有什么操作的程序,這些被釋放的空間被臨時(shí)保存到Swap空間中,等到那些程序要運(yùn)行時(shí),再?gòu)腟wap中恢復(fù)保存的數(shù)據(jù)到內(nèi)存中。這樣,系統(tǒng)總是在物理內(nèi)存不夠時(shí),才進(jìn)行Swap交換。這個(gè)是SWAP 交換分區(qū)的作用。
系統(tǒng)中交換分區(qū)的大小并不取決于物理內(nèi)存的量,而是取決于系統(tǒng)中內(nèi)存的負(fù)荷,所以在安裝系統(tǒng)時(shí)要根據(jù)具體的業(yè)務(wù)來(lái)設(shè)置SWAP的值。其實(shí)虛擬內(nèi)存并不是等到物理內(nèi)存用盡了才使用的,是否盡量的使用或不使用swap,在內(nèi)核空間有一個(gè)參數(shù)控制。
# cat /proc/sys/vm/swappiness 60
表示默認(rèn)的swappiness的值為60。換而言之,當(dāng)swap空間使用達(dá)到60%的時(shí)候,開(kāi)始釋放物理內(nèi)存中的cache/buffers。swappiness=0 的時(shí)候表示最大限度使用物理內(nèi)存,然后才是swap空間;swappiness=100 的時(shí)候表示積極的使用swap分區(qū),并且把內(nèi)存上的數(shù)據(jù)及時(shí)的搬運(yùn)到swap空間里面。
現(xiàn)在服務(wù)器的內(nèi)存動(dòng)不動(dòng)就是上百G,所以我們可以把這個(gè)參數(shù)值設(shè)置的低一些,讓操作系統(tǒng)盡可能的使用物理內(nèi)存,降低系統(tǒng)對(duì)swap的使用,從而提高系統(tǒng)的性能。例如
# echo 10 > /proc/sys/vm/swappiness
或者
# sysctl vm.swappiness=10 vm.swappiness = 10 # cat /proc/sys/vm/swappiness 10
這表明修改已經(jīng)生效。但是如果我們重啟了系統(tǒng),它又會(huì)變成60。為了讓我們的修改長(zhǎng)久有效,可以修改配置文件/etc/sysctl.conf:
# echo 'vm.swappiness=10' >>/etc/sysctl.conf
為了讓它即時(shí)生效,可執(zhí)行:
# sysctl -p
重新載入配置文件。
目前Red Hat(紅帽官方)推薦交換分區(qū)的大小應(yīng)當(dāng)與系統(tǒng)物理內(nèi)存的大小保持線性比例關(guān)系。不過(guò)在小于2GB物理內(nèi)存的系統(tǒng)中,交換分區(qū)大小應(yīng)該設(shè)置為內(nèi)存大小的兩倍,如果內(nèi)存大小多于2GB,交換分區(qū)大小應(yīng)該是物理內(nèi)存大小加上2GB。其原因在于,系統(tǒng)中的物理內(nèi)存越大, 對(duì)于內(nèi)存的負(fù)荷可能也越大。但是,如果物理內(nèi)存大小擴(kuò)展到數(shù)百GB,這樣做就沒(méi)什么意義了。
最近,在Gentoo中編譯webkit-gtk-1.10.2-r300,辛辛苦苦編譯了幾個(gè)小時(shí),結(jié)果報(bào)錯(cuò):
collect2: ld termiinated with signal 9 [Killed]
通過(guò)Google搜索,發(fā)現(xiàn)這是由于編譯過(guò)程中機(jī)器的內(nèi)存耗盡引起的。這就是說(shuō)解決問(wèn)題的辦法是增加內(nèi)存。不過(guò)加物理內(nèi)存是遠(yuǎn)水,解不了近火。既然Linux中的交換分區(qū)也是內(nèi)存的一部分,于是不妨嘗試增加交換分區(qū)。 這又讓我們想起了紅帽官方對(duì)于交換分區(qū)的建議:Linux系統(tǒng)交換分區(qū)最適合的大小是物理內(nèi)存的1-2倍。可是誰(shuí)又會(huì)在分區(qū)的時(shí)候記得這些呢?不過(guò)由于Linux允許文件系統(tǒng)中存在多個(gè)交換分區(qū)或者交換分區(qū)文件,所以亡羊補(bǔ)牢、為時(shí)未晚。如果我們的磁盤(pán)空間還尚有空余沒(méi)有劃分,那么我們可以直接利用分區(qū)工具再分出一個(gè)交換分區(qū)。倘若你像我一樣,所有空間都已經(jīng)被劃分完了,那么只剩一招了—使用交換分區(qū)文件。下面我們主要來(lái)說(shuō)說(shuō)如何利用交換分區(qū)文件擴(kuò)大分區(qū)。
首先,需要制作交換分區(qū)文件??紤]到我的老機(jī)器已有的物理內(nèi)存是1G、現(xiàn)有交換分區(qū)大小是500M。為了我們的編譯過(guò)程順利完成,不妨考慮交換分區(qū)文件的大小為1G。為此,執(zhí)行下述命令:
$ sudo dd if=/dev/zero of=/var/tmp/swap bs=1k count=1024000
記錄了1024000+0 的讀入
記錄了1024000+0 的寫(xiě)出
1048576000字節(jié)(1.0 GB)已復(fù)制,5.07655 秒,207 MB/秒
它將在/var/tmp路徑創(chuàng)建一個(gè)名為swap、大小為1G的分區(qū)文件,該分區(qū)文件擁有1024000個(gè)扇區(qū)(block),每個(gè)扇區(qū)大小為1K。接著,再把這個(gè)分區(qū)文件格式化為交換分區(qū)格式:
$ sudo mkswap /var/tmp/swap
隨后,將它掛載到文件系統(tǒng):
$ sudo swapon /var/tmp/swap
如果想要確認(rèn)交換分區(qū)是否掛載成功,可執(zhí)行:
$ swapon -s Filename Type Size Used Priority /dev/sda1 partition 511996 16192 ?1 /var/tmp/swap file 1023996 0 ?2
從顯示結(jié)果來(lái)看,我們確實(shí)看到了文件格式交換分區(qū)被加載。如果還想要查看系統(tǒng)內(nèi)存情況,只需執(zhí)行:
$ free -m total used free shared buffers cached Mem: 995 935 60 0 6 551 -/+ buffers/cache: 376 618 Swap: 1499 15 1484
通過(guò)擴(kuò)大swap區(qū),可以正常將webkit-gtk-1.10.2-r300編譯完。實(shí)際上,用top跟蹤webkit-gtk-1.10.2-r300的編譯過(guò)程,會(huì)發(fā)現(xiàn)整個(gè)編譯過(guò)程所需要的內(nèi)存大概在2G左右。而我們通過(guò)增加交換分區(qū)的大小,總獲得了2.5G左右的內(nèi)存空間。編譯完之后,如果我們不再需要這一塊交換分區(qū)文件,那么可以先卸載再刪除它:
$ sudo swapoff /var/tmp/swap $ sudo rm -rf /var/tmp/swap
倘若我們?nèi)韵M粨Q分區(qū)文件為以后的編譯提供便利,那么可以選擇保留它。不過(guò)在使用它之前必須先掛載它,因?yàn)橐坏┲貑?,原先的掛載便會(huì)失效!若要讓我們的交換分區(qū)文件隨機(jī)器啟動(dòng)自動(dòng)掛載,則可修改/etc/fstab文件,例如作如下設(shè)置:
$ cat /etc/fstab | grep -i swap /dev/sda1 none swap sw 0 0 /var/tmp/swap swap swap defaults 0 0