您好,登錄后才能下訂單哦!
今天小編給大家分享一下Linux Swap空間利用率過高怎么解決的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
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等,全局共享的內存段
這也是我覺得我們DBA不專業的地方,并沒有考慮第一種情況,去查看回話級別的內存消耗情況,而是直接跟我說要調小innodb_buffer_pool_size
緩存表數據與索引數據,把磁盤上的數據加載到緩沖池,避免每次訪問都進行磁盤IO,起到加速訪問的作用。
給 Buffer Pool 分配越大的內存,MySQL 的并發性能就越好。那是不是都應該將百分之九十九的機器的內存都分配給 Buffe 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空間利用率過高怎么解決”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。