【SWAP產生原理】
先從swap產生的原理來分析,由於linux內存管理比較復雜,下面以問答的方式列了一些重要的點,方便大家理解:
1、swap是如何產生的
swap指的是一個交換分區或文件,主要是在內存使用存在壓力時,觸發內存回收,這時可能會將部分內存的數據交換到swap空間。
2、內存回收的機制
<1>Linux內核使用cache對部分文件進行緩存,提升文件讀寫效率。所以 引入了kswapd進程進行周期性檢查,保證剩余內存空間。
<2>當內存分配沒有足夠的空間時,直接內存回收。
3、內存回收如何實現
這部分實現非常復雜,簡單來說,內存回收操作主要針對內存的文件頁和匿名頁,這些頁都通過LRU鏈表來管理。
其中anon的匿名頁內存主要回收手段是swap,文件頁釋放方式是寫回和清空。
4、講幾個重要的概念
<1>內存節點node,在NUMA的情況下,CPU訪問不同位置的內存,會有本地內存和遠端內存之分,這兩個就是不同的節點。
<2>內存分區 zone,linux對內存節點做了進一步划分,將一個節點划分為不同的區。內存管理的邏輯以zone為單位。
<3>內存水位標記,分為high、low、min
通過下圖可以比較直觀的了解
5、內存回收行為
<1>當系統剩余內存低於low時,kswapd開始起作用進行內存回收,直到內存達到high水位。
<2>當剩余內存達到min時就會觸發直接回收。
<3>當觸發全局回收,並且file+free<=high時,一定會進行針對匿名頁的swap。
下面舉例:
在數據庫做全備份時cache大量使用,剩余可用空間不足,觸發內存回收,
上圖是/proc/zoneinfo的部分內容,可以看到滿足了file+free<=high的條件,同一時間觸發了swap,將內存匿名頁的數據寫入交換區
有大量的文件頁cache,為什么會出現file+free<=high的情況,分析下來全備文件緩存時,node 0的nr_inactive_file很低,大部分非活動的文件頁都分布在node 1上,是由於開啟NUMA導致的。
【關閉NUMA的方案】
1、 在mysqld_safe腳本中加上“numactl –interleave all”來啟動mysqld
2、 Linux Kernel啟動參數中加上numa=off,需要重啟服務器
3、 在BIOS層面關閉NUMA
4、 MySQL 5.6.27/5.7.9開始引用innodb_numa_interleave選項
對於2、3、4關閉NUMA的方案比較簡單,不做詳細描述,下面重點描述下方案1
【開啟numa interleave訪問的步驟】
1、 yum install numactl -y
2、修改/usr/bin/mysqld_safe文件
cmd="`mysqld_ld_preload_text`$NOHUP_NICENESS"下新增一條腳本
cmd="/usr/bin/numactl --interleave all $cmd"
3、service mysql stop
4、#寫入硬盤,防止數據丟失
sync;sync;sync
5、#延遲10秒
sleep 10
6、#清理pagecache、dentries和inodes
sysctl -q -w vm.drop_caches=3
7、service mysql start
8、驗證numactl –interleave all是否生效,可以通過下面命令,interleave_hit是采用interleave策略從該節點分配的次數,沒有啟動interleave策略的服務器,這個值會很低
numastat -mn -p `pidof mysqld`