當物理內存的數量不能容納數據的時候,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在試圖分配更多的內存的時候就會崩潰,如果鎖定太多內存,留給操作系統的內存不足的話,同樣會有問題。