Linux Swap空間利用率過高問題
在單獨(dú)部署的mysql數(shù)據(jù)庫服務(wù)器中發(fā)現(xiàn),在高并發(fā)的情況下發(fā)現(xiàn)內(nèi)存不夠用,進(jìn)一步發(fā)現(xiàn)swap的利用率很高。
公司的DBA提了兩點(diǎn)建議:
- 1、建議先減小數(shù)據(jù)庫緩沖池(buffer pool)的大?。?/li>
- 2、進(jìn)行數(shù)據(jù)庫內(nèi)存擴(kuò)容
1、首先,不是內(nèi)存不夠用嗎?swap利用率為什么高呢?swap是什么呢?
什么是swap?
swap space是磁盤上的一塊區(qū)域,可以是一個(gè)分區(qū),也可以是一個(gè)文件,或者是他們的組合。
簡單點(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給我們帶來了哪些好處。
對于一些大型的應(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,那么對系統(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上,對桌面程序來說,有可能會(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)境對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)定性,但對服務(wù)器來說,一定要限制或者監(jiān)控swap空間的使用情況,當(dāng)出現(xiàn)swap空間使用超預(yù)期或者swap in/out頻繁時(shí),要及時(shí)采取措施,不然對性能影響很大
內(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)存的,所以說,上面的想法是絕對不行的!
比較合理的比例,應(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)例如對一個(gè)master的寫入量大,讀少就是特例.
其它情況如果沒達(dá)到97%以上,對于讀取多的情況,如果沒達(dá)到98%以上,都說明buffer不夠.可以擴(kuò). 再從另一方面來講如果給分了20%的內(nèi)存命中都能達(dá)到100%了,而且還有大量的free page那說明,那就夠用了,另外也可以跟據(jù)free page去算一下可以再減少點(diǎn)內(nèi)存. 把那些內(nèi)存用到別用呢
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux在應(yīng)用層讀寫寄存器的方法及實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了Linux在應(yīng)用層讀寫寄存器的方法及實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02Linux虛擬機(jī)修改ip地址,查看網(wǎng)關(guān),網(wǎng)絡(luò)環(huán)境配置的教程
這篇文章主要介紹了Linux虛擬機(jī)修改ip地址,查看網(wǎng)關(guān),網(wǎng)絡(luò)環(huán)境配置的教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11在 CentOS 8/RHEL 8 上安裝和使用 Cockpit的方法
Cockpit 是一個(gè)基于 Web 的服務(wù)器管理工具,可用于 CentOS 和 RHEL 系統(tǒng)。最近發(fā)布的 CentOS 8 和 RHEL 8,其中 cockpit 是默認(rèn)的服務(wù)器管理工具。這篇文章主要介紹了在 CentOS 8/RHEL 8 上安裝和使用 Cockpit的方法,需要的朋友可以參考下2019-10-10CentOS系統(tǒng)下Apache配置多域名或多端口映射的方法
我們大多情況是一臺(tái)服務(wù)器一個(gè)IP,這樣配置起來很簡單,但是如何想多域名多端口映射的話就沒那么簡單了,下面這篇文章主要介紹了CentOS系統(tǒng)下Apache配置多域名或多端口映射的方法,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。2016-12-12Linux通用java程序啟動(dòng)腳本代碼實(shí)例
這篇文章主要介紹了Linux通用java程序啟動(dòng)腳本代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05