mysql爆内存_线上MySQL数据库机器内存爆掉原因分析与解决
本文主要向大家介紹了線上MySQL數(shù)據(jù)庫機器內(nèi)存爆掉原因分析與解決,通過具體的內(nèi)容向大家展現(xiàn),希望對大家學(xué)習(xí)MySQL數(shù)據(jù)庫有所幫助。
現(xiàn)象:
阿里金融某業(yè)務(wù)的MySQL機器的內(nèi)存每隔幾天就會增長,漲上去后,卻不下來。累積后內(nèi)存爆掉。
分析:
此業(yè)務(wù)是間隔的對MySQL有大訪問,其它時間幾乎無訪問。排查發(fā)現(xiàn),內(nèi)存漲時,一般會有MySQL讀非常大,主要是InnoDB_DATA_READS。
結(jié)合此時的特性,業(yè)務(wù)同學(xué)給出此時的主要場景:
1、14個線程并發(fā);
2、寫入數(shù)據(jù)流程:先查詢再update;
select?pid,value from tableName where id=?;
查不到“id&pid”的記錄,執(zhí)行如下語句
insert into tableName values ( id,pid,value,now() )?on?duplicate key update value=values(value) ;
查到“id&pid”的記錄,執(zhí)行如下
update tableName?set?value=?? where id=??and?pid=?;
在分析過程,我們走了些彎路?,F(xiàn)在回想,我們可能會從如下幾個方面去思考:
1、近期升級過kernel,典型的阿里分庫分表集群,其中一臺升級未升級。所以,新版本內(nèi)核相關(guān)性不大。
2、innodb內(nèi)部統(tǒng)計的內(nèi)存使用量,沒有發(fā)現(xiàn)異常。
3、NUMA開關(guān)導(dǎo)致swap。這是MySQL swap中經(jīng)常會討論到的,但這幾臺沒有開(線上也全部是關(guān)掉的)。
4、臨時表、memory引擎表,可能會消耗大量的服務(wù)器端的內(nèi)存,但業(yè)務(wù)沒有用到或生成臨時表。
5、連接所消耗內(nèi)存。類似key_buffer_size等每個線程所占有的,是我們格外要注意的,但很明顯,這點可以否定,因為并發(fā)連接一直很小。
6、table cache相關(guān)的內(nèi)存。這點實現(xiàn)證明,效果非常明顯,是我們排查問題的突破點。
7、真正的mysqld內(nèi)存泄漏。結(jié)合業(yè)務(wù)的特性,在buglist中發(fā)現(xiàn)這個問題在很久很久之前確實存在并早已fix掉。
執(zhí)行FLUSH TABLES發(fā)現(xiàn)mysqld的RSZ直接減少10G~
flush之前:
PID USER PR NI VIRT RES SHR S %CPU?%MEM?TIME+?COMMAND
3018?mysql?20?0?44.2g 41g?4232?S?0.0?86.8?981:52.36?/u01/mysql/libexec/mysqld
$ free?-m
total used free shared buffers cached
Mem:?48384?46335?2048?0?344?2896
-/+?buffers/cache:?43094?5289
Swap:?8191?8?8183
flush之后:
PID USER PR NI VIRT RES SHR S %CPU?%MEM?TIME+?COMMAND
3018?mysql?20?0?34.7g 30g?4248?S?0.3?65.5?981:55.64?/u01/mysql/libexec/mysqld
$ free?-m
total used free shared buffers cached
Mem:?48384?36010?12373?0?345?2898
-/+?buffers/cache:?32766?15617
innodb層狀態(tài)幾乎沒有變化:
———————-
BUFFER POOL?AND?MEMORY
———————-
Total memory allocated?26361200640; in additional pool allocated?0
Dictionary memory allocated?7723336
Buffer pool size?1572863
Free buffers?1
Database pages?1556426
Old database pages?574520
Modified db pages?4
Pending reads?0
解決方法:
定時在業(yè)務(wù)低峰時flush tables或?qū)⑾嚓P(guān)的參數(shù)(table_open_cache 和 table_definition_cache)改小(從2048到512或更小)。
本文由職坐標(biāo)整理并發(fā)布,希望對同學(xué)們學(xué)習(xí)MySQL有所幫助,更多內(nèi)容請關(guān)注職坐標(biāo)數(shù)據(jù)庫MySQL數(shù)據(jù)庫頻道!
總結(jié)
以上是生活随笔為你收集整理的mysql爆内存_线上MySQL数据库机器内存爆掉原因分析与解决的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程关不掉应怎么办 如何关闭任务管理器关
- 下一篇: mysql产品优化方案_mysql的优化