溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux?Swap空間利用率過高怎么解決

發(fā)布時(shí)間:2023-04-19 10:49:00 來源:億速云 閱讀:139 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Linux Swap空間利用率過高怎么解決的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    什么是swap?

    swap space是磁盤上的一塊區(qū)域,可以是一個(gè)分區(qū),也可以是一個(gè)文件,或者是他們的組合。

    簡(jiǎn)單點(diǎn)說,當(dāng)系統(tǒng)物理內(nèi)存吃緊時(shí),Linux會(huì)將內(nèi)存中不常訪問的數(shù)據(jù)保存到swap上,這樣系統(tǒng)就有更多的物理內(nèi)存為各個(gè)進(jìn)程服務(wù),而當(dāng)系統(tǒng)需要訪問swap上存儲(chǔ)的內(nèi)容時(shí),再將swap上的數(shù)據(jù)加載到內(nèi)存中,這就是我們常說的swap out和swap in。

    為什么需要swap?

    要回答這個(gè)問題,就需要回答swap給我們帶來了哪些好處。

    對(duì)于一些大型的應(yīng)用程序(如LibreOffice、video editor等),在啟動(dòng)的過程中會(huì)使用大量的內(nèi)存,但這些內(nèi)存很多時(shí)候只是在啟動(dòng)的時(shí)候用一下,后面的運(yùn)行過程中很少再用到這些內(nèi)存。有了swap后,系統(tǒng)就可以將這部分不這么使用的內(nèi)存數(shù)據(jù)保存到swap上去,從而釋放出更多的物理內(nèi)存供系統(tǒng)使。

    很多發(fā)行版(如ubuntu)的休眠功能依賴于swap分區(qū),當(dāng)系統(tǒng)休眠的時(shí)候,會(huì)將內(nèi)存中的數(shù)據(jù)保存到swap分區(qū)上,等下次系統(tǒng)啟動(dòng)的時(shí)候,再將數(shù)據(jù)加載到內(nèi)存中,這樣可以加快系統(tǒng)的啟動(dòng)速度,所以如果要使用休眠的功能,必須要配置swap分區(qū),并且大小一定要大于等于物理內(nèi)存。

    在某些情況下,物理內(nèi)存有限,但又想運(yùn)行耗內(nèi)存的程序怎么辦?這時(shí)可以通過配置足夠的swap空間來達(dá)到目標(biāo),雖然慢一點(diǎn),但至少可以運(yùn)行。

    雖然大部分情況下,物理內(nèi)存都是夠用的,但是總有一些意想不到的狀況,比如某個(gè)進(jìn)程需要的內(nèi)存超過了預(yù)期,或者有進(jìn)程存在內(nèi)存泄漏等,當(dāng)內(nèi)存不夠的時(shí)候,就會(huì)觸發(fā)內(nèi)核的OOM killer,根據(jù)OOM killer的配置,某些進(jìn)程會(huì)被kill掉或者系統(tǒng)直接重啟(默認(rèn)情況是優(yōu)先kill耗內(nèi)存最多的那個(gè)進(jìn)程),不過有了swap后,可以拿swap當(dāng)內(nèi)存用,雖然速度慢了點(diǎn),但至少給了我們一個(gè)去debug、kill進(jìn)程或者保存當(dāng)前工作進(jìn)度的機(jī)會(huì)。

    如果看過Linux內(nèi)存管理,就會(huì)知道系統(tǒng)會(huì)盡可能多的將空閑內(nèi)存用于cache,以加快系統(tǒng)的I/O速度,所以如果能將不怎么常用的內(nèi)存數(shù)據(jù)移動(dòng)到swap上,就會(huì)有更多的物理內(nèi)存用于cache,從而提高系統(tǒng)整體性能。

    swap的缺點(diǎn)?

    上面介紹了swap的優(yōu)點(diǎn),那swap的缺點(diǎn)呢?swap是存放在磁盤上的,磁盤的速度和內(nèi)存比較起來慢了好幾個(gè)數(shù)量級(jí),如果不停的讀寫swap,那么對(duì)系統(tǒng)的性能肯定有影響,尤其是當(dāng)系統(tǒng)內(nèi)存很吃緊的時(shí)候,讀寫swap空間發(fā)生的頻率會(huì)很高,導(dǎo)致系統(tǒng)運(yùn)行很慢,像死了一樣,這個(gè)時(shí)候添加物理內(nèi)存是唯一的解決辦法。

    由于系統(tǒng)會(huì)自動(dòng)將不常用的內(nèi)存數(shù)據(jù)移到swap上,對(duì)桌面程序來說,有可能會(huì)導(dǎo)致最小化一個(gè)程序后,再打開時(shí)小卡一下,因?yàn)樾枰獙wap上的數(shù)據(jù)重新加載到內(nèi)存中來。

    到底要不要swap?

    上面介紹了什么是swap以及它們的優(yōu)缺點(diǎn),那么到底要不要配置swap呢?答案是:看情況。

    下面分別討論內(nèi)存不夠用、內(nèi)存勉強(qiáng)夠用和內(nèi)存很充裕這三種情況下服務(wù)器和桌面環(huán)境對(duì)swap的選擇。

    內(nèi)存不夠用

    不管是桌面還是服務(wù)器,當(dāng)物理內(nèi)存明顯不夠用,而又想跑程序的話,添加swap是唯一的選擇,慢點(diǎn)總比不能工作強(qiáng)。

    內(nèi)存勉強(qiáng)夠用

    建議配置swap,這樣內(nèi)核會(huì)將不常用的數(shù)據(jù)從內(nèi)存移到swap上,從而有更多的物理內(nèi)存供系統(tǒng)調(diào)用,提升系統(tǒng)性能,同時(shí)也避免因偶爾的物理內(nèi)存不夠造成進(jìn)程異常退出,提升系統(tǒng)穩(wěn)定性,但對(duì)服務(wù)器來說,一定要限制或者監(jiān)控swap空間的使用情況,當(dāng)出現(xiàn)swap空間使用超預(yù)期或者swap in/out頻繁時(shí),要及時(shí)采取措施,不然對(duì)性能影響很大

    內(nèi)存充裕

    理論上來說,如果物理內(nèi)存足夠多并且不需要休眠功能,那swap就沒什么用,可關(guān)鍵問題是我們很難保證物理內(nèi)存在任何情況下都?jí)蛴?,因?yàn)榭傆幸庀氩坏降那闆r發(fā)生,比如某些進(jìn)程耗內(nèi)存超預(yù)期,服務(wù)器壓力超預(yù)期,內(nèi)存泄漏等。

    目前,我們是明顯內(nèi)存不夠用了,是什么導(dǎo)致內(nèi)存不夠用了呢?為什么mysql會(huì)直接導(dǎo)致服務(wù)器內(nèi)存不夠了

    那我們的mysql的服務(wù)器為什么會(huì)發(fā)生swap呢?

    假設(shè)我們的物理內(nèi)存是16G,swap是4G。如果MySQL本身已經(jīng)占用了12G物理內(nèi)存, 而同時(shí)其他程序或者系統(tǒng)模塊又需要6G內(nèi)存,這時(shí)候操作系統(tǒng)就可能把MySQL所擁有的一部分地址空間映射到swap上去。

    說白了,就是系統(tǒng)認(rèn)為你mysql占用的空間太大了,不允許你搞特殊,必須騰出空間讓那個(gè)我的其它必要的進(jìn)程區(qū)使用內(nèi)存,所以你就去比較慢的swap去玩吧!

    而mysql中占內(nèi)存最大的就是innodb_buffer_pool_size了,所以第一時(shí)間應(yīng)考慮到這個(gè)值是不是設(shè)置的不合理?

    MySQL的內(nèi)存消耗分為:

    • 1.會(huì)話級(jí)別的內(nèi)存消耗:如sort_buffer_size等,每個(gè)會(huì)話都會(huì)開辟一個(gè)sort_buffer_size來進(jìn)行排序操作

    • 2.全局的內(nèi)存消耗:例如:innodb_buffer_pool_size等,全局共享的內(nèi)存段

    這也是我覺得我們DBA不專業(yè)的地方,并沒有考慮第一種情況,去查看回話級(jí)別的內(nèi)存消耗情況,而是直接跟我說要調(diào)小innodb_buffer_pool_size

    InnoDB的緩沖池緩存什么?有什么用?設(shè)置多大合適呢?

    緩存表數(shù)據(jù)與索引數(shù)據(jù),把磁盤上的數(shù)據(jù)加載到緩沖池,避免每次訪問都進(jìn)行磁盤IO,起到加速訪問的作用。

    給 Buffer Pool 分配越大的內(nèi)存,MySQL 的并發(fā)性能就越好。那是不是都應(yīng)該將百分之九十九的機(jī)器的內(nèi)存都分配給 Buffe Pool 呢?

    當(dāng)然不是!先不說操作系統(tǒng)內(nèi)核也需要幾個(gè)G內(nèi)存,MySQL 除了 Buffer Pool 還有很多別的內(nèi)存數(shù)據(jù)結(jié)構(gòu)呢,這些都是需要內(nèi)存的,所以說,上面的想法是絕對(duì)不行的!

    比較合理的比例,應(yīng)該是 Buffer Pool 的內(nèi)存大小占機(jī)器總內(nèi)存的 50% ~ 60%。

    可以通過show engine innodb status\G; 查看命中情況. 當(dāng)命中沒達(dá)到97%以上,都可以考慮加內(nèi)存,當(dāng)然這個(gè)和業(yè)務(wù)也有關(guān)例如對(duì)一個(gè)master的寫入量大,讀少就是特例.

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

    以上就是“Linux Swap空間利用率過高怎么解決”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI