在 Linux 中不斷增加交換大小並且交換空間沒有被回收?
我有一個 8GB RAM linux 盒子,上面執行 4 個 tomcat 伺服器。其中一個設置為 3000MB 記憶體(jvm -Xms 和 -Xmx 設置),其他設置為 1500MB。交換分區也設置為 8Gigs。當我啟動這些伺服器時,交換文件的使用率很低。但是在一段時間內以及在一個/所有伺服器處於高峰活動的特定時間段內,交換使用量開始增加。這是一個典型的 sar -r 輸出。
kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
48260 8125832 99.41 196440 2761852 7197688 1190912 14.20 316044
75504 8098588 99.08 198032 2399460 7197688 1190912 14.20 316032
它顯示目前使用了 14.2% 的交換。有趣的是這個 % 永遠不會減少。它繼續增加並達到 30-40%。我們每週重新啟動伺服器。
我會假設***%swpused***在活動高峰期增加,在活動低迷期減少..或者至少保持不變。這看起來像交換空間永遠不會被作業系統回收..
free 的輸出:free -m total used free shared buffers cached Mem: 7982 7937 45 0 32 2088 -/+ buffers/cache: 5816 2166 Swap: 8191 1163 7028
所以至少有 2g 的免費 Ram。所以問題是為什麼交換空間繼續增加而不被作業系統回收?或者如何調試它以找出發生了什麼..
如果資訊被換出到磁碟然後讀回記憶體,它通常會被分配在交換區域中,直到交換空間用完為止。這意味著,如果以後需要再次換出相同的資訊並且沒有更改,則作業系統可以直接從分配的 RAM 中刪除頁面,而無需將任何內容寫入磁碟以節省時間。
分配給已讀回記憶體的交換空間將被釋放
- 當根本不再需要相關頁面時(即被應用程序釋放)
- 當相關頁面更改時(因此光碟上的副本不再是最新的)
- 機器的交換空間不足,因此清除了一些已經在 RAM 中的東西以騰出空間
查找
/proc/meminfo
名為“SwapCached”的行。此條目計算在 RAM 和交換分區中找到的頁面。例如,隨機選擇一個小型 VM,/proc/meminfo
我的一個 VM 的虛擬文件顯示:SwapTotal: 698816 kB SwapFree: 624520 kB SwapCached: 17232 kB
表示分配了 74268K 的交換空間,但是這些頁面中的 17232K 價值目前也映射到 RAM 中(因此,如果其他東西需要空間,可以立即從交換中釋放)。
毫無疑問,那裡的頁面在很久以前就被換掉了,從那以後就再也沒有被使用過。核心不會僅僅因為有一些空閒 RAM 可以將其讀回而從交換中重新載入頁面,因為這些空閒 RAM 可能更好地用於記憶體或緩衝區 - 寫入交換的頁面通常僅在下次需要時才重新讀取。
如果你想清除swap中的內容,只要你有足夠的free和/或freeable(即free+cache+buffers(減去c+b計數中不可釋放的那些部分RightThisInstant)),只需轉動它關閉並重新打開
swapoff -a && swapon -a
。當然,您也可能在某處發生記憶體洩漏,但這並不是您所看到行為的唯一解釋。