當實體記憶體的數量不能容納資料的時候,os會把虛擬記憶體中的資料寫到磁碟上,此時的交換對於運行在作業系統中的進程是透明的。
交換對與MySQL效能有很大的影響,對於Innodb儲存引擎它對記憶體中的資料鎖住全域互斥量,如果此時導致了磁碟的IO,那麼所有的動作都會等到IO完成之後才能進行。
我們可以通過vmstat 命令。檢查s1,s0攔的IO變化狀態。
如果完全禁止檔案交換,極端情況下,系統核心強制進行交換,這樣會降低os的效能。拷貝一個大檔案,用mysqldump 匯出一個很大的資料庫時,檔案系統往往會向linux申請大量的記憶體作為cache,此時MySQL 可能會耗盡記憶體、崩潰,或者被作業系統強制殺掉。
可以通過下面的幾種方式進行調整:
1、/proc/sys/vm/swappiness的內容改成0(臨時),/etc/sysctl.conf上添加vm.swappiness=0(永久).這樣當記憶體比較緊張的時候資料值越低linux越傾向於使用實體記憶體。
2、修改MySQL重新整理磁碟的方法:
對於Innodb 儲存引擎,其自身可以進行資料和索引的緩衝的緩衝管理我們可以考慮由Mysql自己的進程來管理IO緩衝區保過緩衝機制和寫延遲等,這樣也可以降低系統的開銷。可以使用raw 分區來實現(這樣的執行個體還不錯多)或者innodb_flush_method,開啟O_DIRECT模式。這種情況下,InnoDB的buffer pool會使用直接IO的方式繞過SWAP交換區來訪問磁碟,redo log依舊會使用swap,由於Redo log是覆寫入模式的,所以需要空間較少。與O_DIRECT類似的一個選項是O_SYNC,後者只對寫資料有效。
3、添加MySQL的配置參數memlock
個人不推薦這個方式,這樣會把MySQL鎖定到記憶體中,這樣雖然避免了交換,如果沒有足夠的記憶體進行鎖定,那麼MySQL在試圖分配更多的記憶體的時候就會崩潰,如果鎖定太多記憶體,留給作業系統的記憶體不足的話,同樣會有問題。
本欄目更多精彩內容:http://www.bianceng.cn/database/MySQL/