伺服器裡面的swap干什麼用的
1. Swap 機制
當發生了內存泄漏時,或者運行了大內存的應用程序,導致系統的內存資源緊張時,系統又會如何應對呢?
這其實會導致兩種可能結果,內存回收和 OOM 殺死進程。
我們先來看後一個可能結果,內存資源緊張導致的 OOM(Out Of Memory),相對容易理解,指的是系統殺死佔用大量內存的進程,釋放這些內存,再分配給其他更需要的進程。
接下來再看第一個可能的結果,內存回收,也就是系統釋放掉可以回收的內存,比如我前面講過的緩存和緩沖區,就屬於可回收內存。它們在內存管理中,通常被叫做文件頁(File-backed Page)
大部分文件頁,都可以直接回收,以後有需要時,再從磁碟重新讀取就可以了。而那些被應用程序修改過,並且暫時還沒寫入磁碟的數據(也就是臟頁),就得先寫入磁碟,然後才能進行內存釋放。
這些臟頁,一般可以通過兩種方式寫入磁碟。
除了緩存和緩沖區,通過內存映射獲取的文件映射頁,也是一種常見的文件頁。它也可以被釋放掉,下次再訪問的時候,從文件重新讀取。
除了文件頁外,還有沒有其他的內存可以回收呢?比如,應用程序動態分配的堆內存,也就是我們在內存管理中說到的匿名頁(Anonymous Page),是不是也可以回收呢?
我想,你肯定會說,它們很可能還要再次被訪問啊,當然不能直接回收了。非常正確,這些內存自然不能直接釋放。
但是,如果這些內存在分配後很少被訪問,似乎也是一種資源浪費。是不是可以把它們暫時先存在磁碟里,釋放內存給其他更需要的進程?
其實,這正是 linux 的 Swap 機制。Swap 把這些不常訪問的內存先寫到磁碟中,然後釋放這些內存,給其他更需要的進程使用。再次訪問這些內存時,重新從磁碟讀入內存就可以了。
Swap 說白了就是把一塊磁碟空間或者一個本地文件(以下講解以磁碟為例),當成內存來使用。它包括換出和換入兩個過程。
Swap 其實是把系統的可用內存變大了。這樣,即使伺服器的內存不足,也可以運行大內存的應用程序。
我們常見的筆記本電腦的休眠和快速開機的功能,也基於 Swap 。休眠時,把系統的內存存入磁碟,這樣等到再次開機時,只要從磁碟中載入內存就可以。這樣就省去了很多應用程序的初始化過程,加快了開機速度。
既然 Swap 是為了回收內存,那麼 Linux 到底在什麼時候需要回收內存呢?前面一直在說內存資源緊張,又該怎麼來衡量內存是不是緊張呢?
一個最容易想到的場景就是,有新的大塊內存分配請求,但是剩餘內存不足。這個時候系統就需要回收一部分內存(比如前面提到的緩存),進而盡可能地滿足新內存請求。這個過程通常被稱為 直接內存回收 。
除了直接內存回收,還有一個專門的內核線程用來定期回收內存,也就是kswapd0。為了衡量內存的使用情況,kswapd0 定義了三個內存閾值(watermark,也稱為水位),分別是頁最小閾值(pages_min)、頁低閾值(pages_low)和頁高閾值(pages_high)。剩餘內存,則使用 pages_free 表示。
這里,我畫了一張圖表示它們的關系。
kswapd0 定期掃描內存的使用情況,並根據剩餘內存落在這三個閾值的空間位置,進行內存的回收操作。
我們可以看到,一旦剩餘內存小於頁低閾值,就會觸發內存的回收。這個頁低閾值,其實可以通過內核選項 /proc/sys/vm/min_free_kbytes 來間接設置。min_free_kbytes 設置了頁最小閾值,而其他兩個閾值,都是根據頁最小閾值計算生成的,計算方法如下 :
很多情況下,你明明發現了 Swap 升高,可是在分析系統的內存使用時,卻很可能發現,系統剩餘內存還多著呢。為什麼剩餘內存很多的情況下,也會發生 Swap 呢?
看到上面的標題,你應該已經想到了,這正是處理器的 NUMA (Non-Uniform Memory Access)架構導致的。
關於 NUMA,我在 CPU 模塊中曾簡單提到過。在 NUMA 架構下,多個處理器被劃分到不同 Node 上,且每個 Node 都擁有自己的本地內存空間。
而同一個 Node 內部的內存空間,實際上又可以進一步分為不同的內存域(Zone),比如直接內存訪問區(DMA)、普通內存區(NORMAL)、偽內存區(MOVABLE)等,如下圖所示
先不用特別關注這些內存域的具體含義,我們只要會查看閾值的配置,以及緩存、匿名頁的實際使用情況就夠了。
既然 NUMA 架構下的每個 Node 都有自己的本地內存空間,那麼,在分析內存的使用時,我們也應該針對每個 Node 單獨分析。
你可以通過 numactl 命令,來查看處理器在 Node 的分布情況,以及每個 Node 的內存使用情況。比如,下面就是一個 numactl 輸出的示例:
這個界面顯示,我的系統中只有一個 Node,也就是 Node 0 ,而且編號為 0 和 1 的兩個 CPU, 都位於 Node 0 上。另外,Node 0 的內存大小為 7977 MB,剩餘內存為 4416 MB。
了解了 NUNA 的架構和 NUMA 內存的查看方法後,你可能就要問了這跟 Swap 有什麼關系呢?
實際上,前面提到的三個內存閾值(頁最小閾值、頁低閾值和頁高閾值),都可以通過內存域在 proc 文件系統中的介面 /proc/zoneinfo 來查看。
比如,下面就是一個 /proc/zoneinfo 文件的內容示例:
這個輸出中有大量指標,我來解釋一下比較重要的幾個。
從這個輸出結果可以發現,剩餘內存遠大於頁高閾值,所以此時的 kswapd0 不會回收內存。
當然,某個 Node 內存不足時,系統可以從其他 Node 尋找空閑內存,也可以從本地內存中回收內存。具體選哪種模式,你可以通過 /proc/sys/vm/zone_reclaim_mode 來調整。它支持以下幾個選項:
到這里,我們就可以理解內存回收的機制了。這些回收的內存既包括了文件頁,又包括了匿名頁。
不過,你可能還有一個問題。既然有兩種不同的內存回收機制,那麼在實際回收內存時,到底該先回收哪一種呢?
其實,Linux 提供了一個 /proc/sys/vm/swappiness 選項,用來調整使用 Swap 的積極程度。
swappiness 的范圍是 0-100,數值越大,越積極使用 Swap,也就是更傾向於回收匿名頁;數值越小,越消極使用 Swap,也就是更傾向於回收文件頁。
雖然 swappiness 的范圍是 0-100,不過要注意,這並不是內存的百分比,而是調整 Swap 積極程度的權重,即使你把它設置成 0,當剩餘內存 + 文件頁小於頁高閾值時,還是會發生 Swap。
在內存資源緊張時,Linux 通過直接內存回收和定期掃描的方式,來釋放文件頁和匿名頁,以便把內存分配給更需要的進程使用。
你可以設置 /proc/sys/vm/min_free_kbytes,來調整系統定期回收內存的閾值(也就是頁低閾值),還可以設置 /proc/sys/vm/swappiness,來調整文件頁和匿名頁的回收傾向。
在 NUMA 架構下,每個 Node 都有自己的本地內存空間,而當本地內存不足時,默認既可以從其他 Node 尋找空閑內存,也可以從本地內存回收。
你可以設置 /proc/sys/vm/zone_reclaim_mode ,來調整 NUMA 本地內存的回收策略。
2. linux系統swap是什麼意思
linux系統swap意思:
1、Swap分區,即交換區,系統在物理內存不夠時,與Swap進行交換。 其實,Swap的調整對Linux伺服器,特別是Web伺服器的性能至關重要。通過調整Swap,有時可以越過系統性能瓶頸,節省系統升級費用。
2、眾所周知,現代操作系統都實現了「虛擬內存」這一技術,不但在功能上突破了物理內存的限制,使程序可以操縱大於實際物理內存的空間,更重要的是,「虛擬內存」是隔離每個進程的安全保護網,使每個進程都不受其它程序的干擾。
3、計算機用戶會經常遇這種現象。例如,在使用Windows系統時,可以同時運行多個程序,當你切換到一個很長時間沒有理會的程序時,會聽到硬碟「嘩嘩」直響。這是因為這個程序的內存被那些頻繁運行的程序給「偷走」了,放到了Swap區中。因此,一旦此程序被放置到前端,它就會從Swap區取回自己的數據,將其放進內存,然後接著運行。