現(xiàn)象:
一臺高配的MySQL數(shù)據(jù)庫
服務(wù)器,雙CPU48線程.
CentOS 7
本機(jī)磁盤是一萬五千轉(zhuǎn)的Raid 0.系統(tǒng)文件,Swap都分配在了本機(jī)磁盤.
服務(wù)器掛載了一個SSD的磁盤陣列.數(shù)據(jù)庫文件都存放在磁盤陣列中.
系統(tǒng)運行之后,發(fā)現(xiàn)系統(tǒng)Swap大量使用,并且本機(jī)磁盤的IO使用率持續(xù)100%.
權(quán)宜之計:
我把Swap挪到了盤陣中
原因:
swap insanity
NUMA架構(gòu)
引用:
對于單CPU,多核心的情況,每個核心訪問內(nèi)存的速度是一樣的,這種架構(gòu)稱為SMP(Symmetric multiprocessing, 對稱多處理器),又叫UMA(Uniform Memory Architecture,與NUMA相對,一致性內(nèi)存訪問架構(gòu))。
可以看到,每個CPU都有一組配套的內(nèi)存槽。每個CPU訪問自身的內(nèi)存插槽,速度都很快,但對于主板上的其他內(nèi)存插槽,訪問速度就會下降。這種架構(gòu)被稱為NUMA。
對于Linux來說,加載的時候就會檢測內(nèi)存,計算CPU到內(nèi)存的訪問開銷,將CPU和內(nèi)存分成一組組的。每個進(jìn)程和線程,都會繼承父進(jìn)程的NUMA策略,這種策略包括這個進(jìn)程/線程會在哪個CPU上運行,分配的內(nèi)存應(yīng)該用哪組插槽的。
面對內(nèi)存分配,只要一經(jīng)分配到指定的CPU—內(nèi)存槽,就不會再挪動了。對于數(shù)據(jù)庫這類應(yīng)用,理想情況下是一個單一的多線程進(jìn)程,吃掉了幾乎所有的系統(tǒng)內(nèi)存,并盡可能多的消耗其余的系統(tǒng)資源例如IO。
對于兩個CPU的NUMA架構(gòu)來說,如果一個核心分配的內(nèi)存超過系統(tǒng)內(nèi)存的一半,就會出現(xiàn)問題。而Linux的分配策略是,首先使用CPU 0,然后再使用CPU 1。這時候就會出現(xiàn)一種情況,CPU 0的內(nèi)存組已經(jīng)率先使用完了,但系統(tǒng)還有很多空閑內(nèi)存,都在CPU 1上。這時候,Linux會選擇將CPU 0的內(nèi)存刷到磁盤上,以換取可用內(nèi)存。但是,swap過程遠(yuǎn)比跨CPU訪問內(nèi)存要慢啊。這就會造成內(nèi)存還沒用光,但數(shù)據(jù)庫瘋狂刷盤的現(xiàn)象了。
參考:
http://www.cnblogs.com/Lifehacker/p/database_swap_insanity_on_Linux.html
https://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/
https://yq.aliyun.com/articles/50933
新聞標(biāo)題:MySQL大量使用swap文件
轉(zhuǎn)載來源:
http://weahome.cn/article/gihjih.html