物理記憶體不夠用,臨時增大Linux交換分割槽的方法

2021-06-20 05:12:59 字數 2588 閱讀 1149

當系統的物理記憶體不夠用的時候,就需要將物理記憶體中的一部分空間釋放出來,以供當前執行的程式使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程式,這些被釋放的空間被臨時儲存到swap空間中,等到那些程式要執行時,再從swap中恢復儲存的資料到記憶體中。這樣,系統總是在物理記憶體不夠時,才進行swap交換。這個是swap 交換分割槽的作用。

系統中交換分割槽的大小並不取決於物理記憶體的量,而是取決於系統中記憶體的負荷,所以在安裝系統時要根據具體的業務來設定swap的值。其實虛擬記憶體並不是等到物理記憶體用盡了才使用的,是否盡量的使用或不使用swap,在核心空間有乙個引數控制。

60現在伺服器的記憶體動不動就是上百g,所以我們可以把這個引數值設定的低一些,讓作業系統盡可能的使用物理記憶體,降低系統對swap的使用,從而提高系統的效能。例如

或者10

這表明修改已經生效。但是如果我們重啟了系統,它又會變成60。為了讓我們的修改長久有效,可以修改配置檔案/etc/sysctl.conf:

為了讓它即時生效,可執行:

# sysctl -p
重新載入配置檔案。 

目前red hat(紅帽官方)推薦交換分割槽的大小應當與系統物理記憶體的大小保持線性比例關係。不過在小於2gb物理記憶體的系統中,交換分割槽大小應該設定為記憶體大小的兩倍,如果記憶體大小多於2gb,交換分割槽大小應該是物理記憶體大小加上2gb。其原因在於,系統中的物理記憶體越大, 對於記憶體的負荷可能也越大。但是,如果物理記憶體大小擴充套件到數百gb,這樣做就沒什麼意義了。

最近,在gentoo中編譯webkit-gtk-1.10.2-r300,辛辛苦苦編譯了幾個小時,結果報錯:

collect2: ld termiinated with signal 9 [killed]
通過google搜尋,發現這是由於編譯過程中機器的記憶體耗盡引起的。這就是說解決問題的辦法是增加記憶體。不過加物理記憶體是遠水,解不了近火。既然linux中的交換分割槽也是記憶體的一部分,於是不妨嘗試增加交換分割槽。 這又讓我們想起了紅帽官方對於交換分割槽的建議:linux系統交換分割槽最適合的大小是物理記憶體的1-2倍。可是誰又會在分割槽的時候記得這些呢?不過由於linux允許檔案系統中存在多個交換分割槽或者交換分割槽檔案,所以亡羊補牢、為時未晚。如果我們的磁碟空間還尚有空餘沒有劃分,那麼我們可以直接利用分割槽工具再分出乙個交換分割槽。倘若你像我一樣,所有空間都已經被劃分完了,那麼只剩一招了—使用交換分割槽檔案。下面我們主要來說說如何利用交換分割槽檔案擴大分割槽。

首先,需要製作交換分割槽檔案。考慮到我的老機器已有的物理記憶體是1g、現有交換分割槽大小是500m。為了我們的編譯過程順利完成,不妨考慮交換分割槽檔案的大小為1g。為此,執行下述命令:

$ sudo dd if=/dev/zero of=/var/tmp/swap bs=1k count=1024000
記錄了1024000+0 的讀入

記錄了1024000+0 的寫出

1048576000位元組(1.0 gb)已複製,5.07655 秒,207 mb/秒

它將在/var/tmp路徑建立乙個名為swap、大小為1g的分割槽檔案,該分割槽檔案擁有1024000個扇區(block),每個扇區大小為1k。接著,再把這個分割槽檔案格式化為交換分割槽格式:

$ sudo mkswap /var/tmp/swap
隨後,將它掛載到檔案系統:

$ sudo swapon /var/tmp/swap
如果想要確認交換分割槽是否掛載成功,可執行:

$ swapon -s 

filename type size used priority

/dev/sda1 partition 511996 16192 ?1

/var/tmp/swap file 1023996 0 ?2

從顯示結果來看,我們確實看到了檔案格式交換分割槽被載入。如果還想要檢視系統記憶體情況,只需執行:

$ free -m

total used free shared buffers cached

mem: 995 935 60 0 6 551

-/+ buffers/cache: 376 618

swap: 1499 15 1484

通過擴大swap區,可以正常將webkit-gtk-1.10.2-r300編譯完。實際上,用top跟蹤webkit-gtk-1.10.2-r300的編譯過程,會發現整個編譯過程所需要的記憶體大概在2g左右。而我們通過增加交換分割槽的大小,總獲得了2.5g左右的記憶體空間。編譯完之後,如果我們不再需要這一塊交換分割槽檔案,那麼可以先解除安裝再刪除它:

$ sudo swapoff /var/tmp/swap

$ sudo rm -rf /var/tmp/swap

倘若我們仍希望交換分割槽檔案為以後的編譯提供便利,那麼可以選擇保留它。不過在使用它之前必須先掛載它,因為一旦重啟,原先的掛載便會失效!若要讓我們的交換分割槽檔案隨機器啟動自動掛載,則可修改/etc/fstab檔案,例如作如下設定:

$ cat /etc/fstab | grep -i swap

/dev/sda1 none swap sw 0 0

/var/tmp/swap swap swap defaults 0 0

USB口不夠用了

我的usb裝置越來越多了 滑鼠 鍵盤 遊戲手柄 無線網絡卡 藍芽介面卡 手機資料線 psp資料線 u盤等等的一大堆,並且這大部分是常駐我的電腦的,而我主機板就帶了四個口,根本就不夠用。雖然還有機箱上的兩個前置的usb口,但不想在前置的usb口上放置那些常駐電腦的裝置 擋住光碟機了 在網上看了看,大都...

為什麼synchronized不夠用

效率低 鎖的釋放情況少,試圖獲得鎖時不能設定超時 不能中斷乙個正在試圖獲得鎖的執行緒 不夠靈活 讀寫鎖更靈活 加鎖和釋放的時機單一,每個鎖僅有單一的條件 某個物件 可能是不夠的 無法知道是否成功獲取到鎖 lock trylock trylock long time,timeunit unit loc...

cartographer引數不夠用?自己自定義引數

比如我想在pose graph 2d.cc中新增乙個引數控制系統後端優化的頻率,怎麼新增呢?第一步 pose graph options.proto新增新變數 double local constraint search after n seconds 12 12是proto檔案的序號,每個引數不同...