Linux有不少很好的內存、IO調度機制,可是並不會適用於全部場景。對於DBA來講Linux比較讓人頭疼的一個地方是,它不會由於MySQL很重要就避免將分配給MySQL的地址空間映射到swap上。對於頻繁進行讀寫操做的系統而言,數據看似在內存而實際上在磁盤是很是糟糕的,響應時間的增加極可能直接拖垮整個系統。這篇blog主要講講咱們做爲DBA,怎樣儘可能避免MySQL慘遭swap的毒手。
首先咱們要了解點基礎的東西,好比說爲何會產生swap。假設咱們的物理內存是16G,swap是4G。若是MySQL自己已經佔用了12G物理內存,而同時其餘程序或者系統模塊又須要6G內存,這時候操做系統就可能把MySQL所擁有的一部分地址空間映射到swap上去。html
cp一個大文件,或用mysqldump導出一個很大的數據庫的時候,文件系統每每會向Linux申請大量的內存做爲cache,一不當心就會致使L使用swap。這個情景比較常見,如下是最簡單的三個調整方法:
一、/proc/sys/vm/swappiness的內容改爲0(臨時),/etc/sysctl.conf上添加vm.swappiness=0(永久)
這個參數決定了Linux是傾向於使用swap,仍是傾向於釋放文件系統cache。在內存緊張的狀況下,數值越低越傾向於釋放文件系統cache。
固然,這個參數只能減小使用swap的機率,並不能避免Linux使用swap。
二、修改MySQL的配置參數innodb_flush_method,開啓O_DIRECT模式。
這種狀況下,InnoDB的buffer pool會直接繞過文件系統cache來訪問磁盤,可是redo log依舊會使用文件系統cache。值得注意的是,Redo log是覆寫模式的,即便使用了文件系統的cache,也不會佔用太多。
三、添加MySQL的配置參數memlock
這個參數會強迫mysqld進程的地址空間一直被鎖定在物理內存上,對於os來講是很是霸道的一個要求。必需要用root賬號來啓動MySQL才能生效。mysql
還有一個比較複雜的方法,指定MySQL使用大頁內存(Large Page)。Linux上的大頁內存是不會被換出物理內存的,和memlock有殊途同歸之妙。具體的配置方法能夠參考:http://harrison-fisk.blogspot.com/2009/01/enabling-innodb-large-pages-on-linux.htmllinux