swap space是磁碟上的一塊區域,可以是一個分割區,也可以是一個文件,或是他們的組合。
簡單點說,當系統物理記憶體吃緊時,Linux會將記憶體中不常存取的資料保存到swap上,這樣系統就有更多的物理記憶體為各個進程服務,而當系統需要存取swap上儲存的內容時,再將swap上的資料載入記憶體中,這就是我們常說的swap out和swap in。
要回答這個問題,就需要回答swap為我們帶來了哪些好處。
對於一些大型的應用程式(如LibreOffice、video editor等),在啟動的過程中會使用大量的內存,但這些內存很多時候只是在啟動的時候用一下,後面的運行過程中很少再用到這些記憶體。有了swap後,系統就可以將這部分不這麼使用的記憶體資料保存到swap上去,從而釋放出更多的物理記憶體供系統使。
許多發行版(如ubuntu)的休眠功能依賴swap分區,當系統休眠的時候,會將內存中的數據保存到swap分區上,等下次系統啟動的時候,再將數據載入到記憶體中,這樣可以加快系統的啟動速度,所以如果要使用休眠的功能,必須要配置swap分割區,而且大小一定要大於等於實體記憶體。
在某些情況下,實體記憶體有限,但又想運行耗記憶體的程式怎麼辦?這時可以透過配置足夠的swap空間來達到目標,雖然慢一點,但至少可以運行。
雖然大部分情況下,物理記憶體都是夠用的,但是總有一些意想不到的狀況,比如某個進程需要的內存超過了預期,或者有進程存在內存洩漏等,當內存不夠的時候,就會觸發核心的OOM killer,根據OOM killer的配置,某些進程會被kill掉或系統直接重啟(預設情況是優先kill耗記憶體最多的那個進程),不過有了swap後,可以拿swap當記憶體用,雖然速度慢了點,但至少給了我們一個去debug、kill進程或是保存目前工作進度的機會。
如果看過Linux記憶體管理,就會知道系統會盡可能多的將空閒記憶體用於cache,以加快系統的I/O速度,所以如果能將不怎麼常用的記憶體資料移動到在swap上,就會有更多的實體記憶體用於cache,從而提高系統整體效能。
上面介紹了swap的優點,那swap的缺點呢? swap是存放在磁碟上的,磁碟的速度和記憶體比較起來慢了好幾個數量級,如果不停的讀寫swap,那麼對系統的效能肯定有影響,尤其是當系統記憶體很吃緊的時候,讀寫swap空間發生的頻率會很高,導致系統運作很慢,像死了一樣,這個時候加入實體記憶體是唯一的解決方案。
由於系統會自動將不常用的記憶體資料移到swap上,對桌面程式來說,有可能會導致最小化一個程式後,再開啟時小卡一下,因為需要將swap上的資料重新載入到記憶體中來。
上面介紹了什麼是swap以及它們的優缺點,那麼到底要不要設定swap呢?答案是:看情況。
以下分別討論記憶體不夠用、記憶體勉強夠用和記憶體很充裕這三種情況下伺服器和桌面環境對swap的選擇。
不管是桌面還是伺服器,當實體記憶體明顯不夠用,而又想跑程式的話,加入swap是唯一的選擇,慢點總比不能工作強。
建議配置swap,這樣核心會將不常用的資料從記憶體移到swap上,從而有更多的物理記憶體供系統調用,提升系統效能,同時也避免因偶爾的實體記憶體不夠造成進程異常退出,提升系統穩定性,但對伺服器來說,一定要限製或監控swap空間的使用情況,當出現swap空間使用超預期或swap in/out頻繁時,要及時採取措施,不然對性能影響很大
理論上,如果物理內存足夠多並且不需要休眠功能,那swap就沒什麼用,可關鍵問題是我們很難保證物理內存在任何情況下都夠用,因為總有意想不到的情況發生,例如某些進程耗內存超預期,伺服器壓力超預期,內存洩漏等。
目前,我們是明顯記憶體不夠用了,是什麼導致記憶體不夠用了呢?為什麼mysql會直接導致伺服器記憶體不夠了
假設我們的物理記憶體是16G,swap是4G。如果MySQL本身已經佔用了12G物理內存, 而同時其他程式或者係統模組又需要6G內存,這時候操作系統就可能把MySQL所擁有的一部分地址空間映射到swap上去。
說白了,就是系統認為你mysql佔用的空間太大了,不允許你搞特殊,必須騰出空間讓那個我的其它必要的進程區使用內存,所以你就去比較慢的swap去玩吧!
而mysql中佔記憶體最大的就是innodb_buffer_pool_size了,所以第一時間要考慮到這個值是不是設定不合理的?
MySQL的記憶體消耗分為:
#1.會話層級的記憶體消耗:如sort_buffer_size等,每個會話都會開啟一個sort_buffer_size來進行排序操作
2.全域的記憶體消耗:例如:innodb_buffer_pool_size等,全域共享的記憶體段
以上是Linux Swap空間使用率過高怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!