首頁  >  文章  >  運維  >  Linux Swap空間使用率過高怎麼解決

Linux Swap空間使用率過高怎麼解決

WBOY
WBOY轉載
2023-05-27 12:37:262921瀏覽

    什麼是swap?

    swap space是磁碟上的一塊區域,可以是一個分割區,也可以是一個文件,或是他們的組合。

    簡單點說,當系統物理記憶體吃緊時,Linux會將記憶體中不常存取的資料保存到swap上,這樣系統就有更多的物理記憶體為各個進程服務,而當系統需要存取swap上儲存的內容時,再將swap上的資料載入記憶體中,這就是我們常說的swap out和swap in。

    為什麼需要swap?

    要回答這個問題,就需要回答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空間的使用情況,當出現swap空間使用超預期或swap in/out頻繁時,要及時採取措施,不然對性能影響很大

    內存充裕

    理論上,如果物理內存足夠多並且不需要休眠功能,那swap就沒什麼用,可關鍵問題是我們很難保證物理內存在任何情況下都夠用,因為總有意想不到的情況發生,例如某些進程耗內存超預期,伺服器壓力超預期,內存洩漏等。

    目前,我們是明顯記憶體不夠用了,是什麼導致記憶體不夠用了呢?為什麼mysql會直接導致伺服器記憶體不夠了

    那我們的mysql的伺服器為什麼會發生swap呢?

    假設我們的物理記憶體是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等,全域共享的記憶體段

    ##這也是我覺得我們DBA不專業的地方,並沒有考慮第一種情況,去查看回話等級的記憶體消耗情況,而是直接跟我說要調小innodb_buffer_pool_size

    InnoDB的緩衝池快取什麼?有什麼用?設定多大合適呢?

    快取表資料與索引數據,把磁碟上的資料載入到緩衝池,避免每次存取都進行磁碟IO,起到加速存取的作用。

    MySQL的同時效能與Buffer Pool所分配的記憶體大小成正比,分配的記憶體越大,其並發效能越好。是否應該將所有99%的機器記憶體都分配給Buffer Pool呢?

    當然不是!先不說作業系統核心也需要幾個G內存,MySQL 除了 Buffer Pool 還有很多別的內存資料結構呢,這些都是需要內存的,所以說,上面的想法是絕對不行的!

    比較合理的比例,應該是 Buffer Pool 的記憶體大小佔機器總記憶體的 50% ~ 60%。

    可以透過show engine innodb status\G; 看命中情況. 當命中沒達到97%以上,都可以考慮加內存,當然這個和業務也有關例如對一個master的寫入量大,讀少就是特例.

    其它情況如果沒達到97%以上,對於讀取多的情況,如果沒達到98%以上,都說明buffer不夠.可以擴. 再從另一方面來講如果給分了20%的內存命中都能達到100%了,而且還有大量的free page那說明,那就夠用了,另外也可以跟據free page去算一下可以再減少點內存. 把那些內存用到別用呢

    以上是Linux Swap空間使用率過高怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除