線上mysql內存持續增長直至內存溢出被killed分析(已解決)


 來新公司前,領導就說了,線上生產環境Mysql庫經常會發生日間內存爆掉被killed的情況,結果來到這第一天,第一件事就是要根據線上服務器配置優化配置,同時必須找出現在mysql內存持續增加爆掉的原因,雖然我主業已經不是數據庫更不是dba了。看了下mysql占用內存區域的分布:

[root@iZ23nn1p4mjZ osm-all]# pmap -x 5524
5524: /usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/bin/mysqld --basedir=/usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101 --datadir=/usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/data --plugin-dir=/usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/lib/mysql/plugin --user=mysql --log-error=/usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/data/iZ23nn1p4mjZ.err --open-files-limit=32767 --pid-file=/usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/data/iZ23nn1p4mjZ.pid --po
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 22772 4876 0 r-x-- mysqld
0000000001c3c000 1628 616 272 rw--- mysqld
0000000001dd3000 836 428 428 rw--- [ anon ]
00000035c2c00000 128 20 0 r-x-- ld-2.12.so
00000035c2e1f000 4 4 4 r---- ld-2.12.so
00000035c2e20000 4 4 4 rw--- ld-2.12.so
00000035c2e21000 4 4 4 rw--- [ anon ]
00000035c3000000 4 4 0 r-x-- libaio.so.1.0.1
00000035c3001000 2044 0 0 ----- libaio.so.1.0.1
00000035c3200000 4 0 0 rw--- libaio.so.1.0.1
00000035c3400000 1576 336 0 r-x-- libc-2.12.so
00000035c358a000 2048 0 0 ----- libc-2.12.so
00000035c378a000 16 16 8 r---- libc-2.12.so
00000035c378e000 4 4 4 rw--- libc-2.12.so
00000035c378f000 20 12 12 rw--- [ anon ]
00000035c3800000 92 52 0 r-x-- libpthread-2.12.so
00000035c3817000 2048 0 0 ----- libpthread-2.12.so
00000035c3a17000 4 4 4 r---- libpthread-2.12.so
00000035c3a18000 4 4 4 rw--- libpthread-2.12.so
00000035c3a19000 16 4 4 rw--- [ anon ]
00000035c3c00000 8 0 0 r-x-- libdl-2.12.so
00000035c3c02000 2048 0 0 ----- libdl-2.12.so
00000035c3e02000 4 0 0 r---- libdl-2.12.so
00000035c3e03000 4 0 0 rw--- libdl-2.12.so
00000035c4000000 28 4 0 r-x-- librt-2.12.so
00000035c4007000 2044 0 0 ----- librt-2.12.so
00000035c4206000 4 4 4 r---- librt-2.12.so
00000035c4207000 4 0 0 rw--- librt-2.12.so
00000035c4400000 524 0 0 r-x-- libm-2.12.so
00000035c4483000 2044 0 0 ----- libm-2.12.so
00000035c4682000 4 4 4 r---- libm-2.12.so
00000035c4683000 4 4 4 rw--- libm-2.12.so
00000035c4800000 116 0 0 r-x-- libselinux.so.1
00000035c481d000 2044 0 0 ----- libselinux.so.1
00000035c4a1c000 4 0 0 r---- libselinux.so.1
00000035c4a1d000 4 0 0 rw--- libselinux.so.1
00000035c4a1e000 4 0 0 rw--- [ anon ]
00000035c5000000 12 0 0 r-x-- libcom_err.so.2.1
00000035c5003000 2044 0 0 ----- libcom_err.so.2.1
00000035c5202000 4 0 0 r---- libcom_err.so.2.1
00000035c5203000 4 0 0 rw--- libcom_err.so.2.1
00000035c5400000 88 0 0 r-x-- libresolv-2.12.so
00000035c5416000 2048 0 0 ----- libresolv-2.12.so
00000035c5616000 4 0 0 r---- libresolv-2.12.so
00000035c5617000 4 0 0 rw--- libresolv-2.12.so
00000035c5618000 8 0 0 rw--- [ anon ]
00000035c7000000 452 0 0 r-x-- libfreebl3.so
00000035c7071000 2044 0 0 ----- libfreebl3.so
00000035c7270000 8 0 0 r---- libfreebl3.so
00000035c7272000 4 0 0 rw--- libfreebl3.so
00000035c7273000 16 0 0 rw--- [ anon ]
00000035c7400000 28 0 0 r-x-- libcrypt-2.12.so
00000035c7407000 2048 0 0 ----- libcrypt-2.12.so
00000035c7607000 4 0 0 r---- libcrypt-2.12.so
00000035c7608000 4 0 0 rw--- libcrypt-2.12.so
00000035c7609000 184 0 0 rw--- [ anon ]
00000035c8800000 8 0 0 r-x-- libkeyutils.so.1.3
00000035c8802000 2044 0 0 ----- libkeyutils.so.1.3
00000035c8a01000 4 0 0 r---- libkeyutils.so.1.3
00000035c8a02000 4 0 0 rw--- libkeyutils.so.1.3
00000035c9800000 1764 72 0 r-x-- libcrypto.so.1.0.1e
00000035c99b9000 2044 0 0 ----- libcrypto.so.1.0.1e
00000035c9bb8000 108 4 0 r---- libcrypto.so.1.0.1e
00000035c9bd3000 48 12 12 rw--- libcrypto.so.1.0.1e
00000035c9bdf000 16 8 8 rw--- [ anon ]
0000003891400000 928 116 0 r-x-- libstdc++.so.6.0.13
00000038914e8000 2048 0 0 ----- libstdc++.so.6.0.13
00000038916e8000 28 20 12 r---- libstdc++.so.6.0.13
00000038916ef000 8 8 8 rw--- libstdc++.so.6.0.13
00000038916f1000 84 12 8 rw--- [ anon ]
0000003891800000 88 0 0 r-x-- libgcc_s-4.4.7-20120601.so.1
0000003891816000 2044 0 0 ----- libgcc_s-4.4.7-20120601.so.1
0000003891a15000 4 0 0 rw--- libgcc_s-4.4.7-20120601.so.1
0000003d4a800000 260 0 0 r-x-- libgssapi_krb5.so.2.2
0000003d4a841000 2048 0 0 ----- libgssapi_krb5.so.2.2
0000003d4aa41000 4 0 0 r---- libgssapi_krb5.so.2.2
0000003d4aa42000 8 0 0 rw--- libgssapi_krb5.so.2.2
0000003d4ac00000 164 0 0 r-x-- libk5crypto.so.3.1
0000003d4ac29000 2048 0 0 ----- libk5crypto.so.3.1
0000003d4ae29000 4 0 0 r---- libk5crypto.so.3.1
0000003d4ae2a000 4 0 0 rw--- libk5crypto.so.3.1
0000003d4ae2b000 4 0 0 rw--- [ anon ]
0000003d4b000000 40 0 0 r-x-- libkrb5support.so.0.1
0000003d4b00a000 2044 0 0 ----- libkrb5support.so.0.1
0000003d4b209000 4 0 0 r---- libkrb5support.so.0.1
0000003d4b20a000 4 0 0 rw--- libkrb5support.so.0.1
0000003d4b400000 392 0 0 r-x-- libssl.so.1.0.1e
0000003d4b462000 2044 0 0 ----- libssl.so.1.0.1e
0000003d4b661000 16 0 0 r---- libssl.so.1.0.1e
0000003d4b665000 28 4 4 rw--- libssl.so.1.0.1e
0000003d4b800000 876 0 0 r-x-- libkrb5.so.3.3
0000003d4b8db000 2044 0 0 ----- libkrb5.so.3.3
0000003d4bada000 40 0 0 r---- libkrb5.so.3.3
0000003d4bae4000 8 0 0 rw--- libkrb5.so.3.3
0000003f13600000 32 0 0 r-x-- libnuma.so.1
0000003f13608000 2048 0 0 ----- libnuma.so.1
0000003f13808000 4 4 4 rw--- libnuma.so.1
00007f46ddc00000 3776512 2380752 2380668 rw--- [ anon ]
00007f47c4639000 4 0 0 ----- [ anon ]
00007f47c463a000 256 24 24 rw--- [ anon ]
00007f47c467a000 4 0 0 ----- [ anon ]
00007f47c467b000 256 20 20 rw--- [ anon ]
00007f47c46bb000 4 0 0 ----- [ anon ]
00007f47c46bc000 256 120 120 rw--- [ anon ]
00007f47c46fc000 4 0 0 ----- [ anon ]
00007f47c46fd000 256 72 72 rw--- [ anon ]
00007f47c473d000 4 0 0 ----- [ anon ]
00007f47c473e000 256 72 72 rw--- [ anon ]
00007f47c477e000 4 0 0 ----- [ anon ]
00007f47c477f000 256 120 120 rw--- [ anon ]
00007f47c47bf000 4 0 0 ----- [ anon ]
00007f47c47c0000 225536 111736 111688 rw--- [ anon ]
00007f47d27bf000 4 0 0 ----- [ anon ]
00007f47d27c0000 53504 31016 31016 rw--- [ anon ]
00007f47d5fbf000 4 0 0 ----- [ anon ]
00007f47d5fc0000 16640 7868 7868 rw--- [ anon ]
00007f47d72bb000 4 0 0 ----- [ anon ]
00007f47d72bc000 256 120 120 rw--- [ anon ]
00007f47d72fc000 4 0 0 ----- [ anon ]
00007f47d72fd000 256 36 36 rw--- [ anon ]
00007f47d733d000 4 0 0 ----- [ anon ]
00007f47d733e000 256 56 56 rw--- [ anon ]
00007f47d737e000 4 0 0 ----- [ anon ]
00007f47d737f000 256 72 72 rw--- [ anon ]
00007f47d73bf000 4 0 0 ----- [ anon ]
00007f47d73c0000 61696 34148 34136 rw--- [ anon ]
00007f47db3bf000 4 0 0 ----- [ anon ]
00007f47db3c0000 16640 9692 9692 rw--- [ anon ]
00007f47dc7bf000 4 0 0 ----- [ anon ]
00007f47dc7c0000 16640 13124 13096 rw--- [ anon ]
00007f47dd838000 4 0 0 ----- [ anon ]
00007f47dd839000 256 120 120 rw--- [ anon ]
00007f47dd879000 4 0 0 ----- [ anon ]
00007f47dd87a000 256 20 20 rw--- [ anon ]
00007f47dd8ba000 4 0 0 ----- [ anon ]
00007f47dd8bb000 256 120 120 rw--- [ anon ]
00007f47dd8fb000 4 0 0 ----- [ anon ]
00007f47dd8fc000 256 116 116 rw--- [ anon ]
00007f47dd93c000 4 0 0 ----- [ anon ]
00007f47dd93d000 256 72 72 rw--- [ anon ]
00007f47dd97d000 4 0 0 ----- [ anon ]
00007f47dd97e000 256 84 84 rw--- [ anon ]
00007f47dd9be000 4 0 0 ----- [ anon ]
00007f47dd9bf000 256 120 120 rw--- [ anon ]
00007f47dd9ff000 4 0 0 ----- [ anon ]
00007f47dda00000 43008 17168 17140 rw--- [ anon ]
00007f47e0772000 4 0 0 ----- [ anon ]
00007f47e0773000 256 0 0 rw--- [ anon ]
00007f47e07b3000 4 0 0 ----- [ anon ]
00007f47e07b4000 256 0 0 rw--- [ anon ]
00007f47e07f4000 4 0 0 ----- [ anon ]
00007f47e07f5000 10240 0 0 rw--- [ anon ]
00007f47e11f5000 4 0 0 ----- [ anon ]
00007f47e11f6000 10240 8 8 rw--- [ anon ]
00007f47e1bf6000 4 0 0 ----- [ anon ]
00007f47e1bf7000 10240 36 36 rw--- [ anon ]
00007f47e25f7000 4 0 0 ----- [ anon ]
00007f47e25f8000 10240 0 0 rw--- [ anon ]
00007f47e2ff8000 4 0 0 ----- [ anon ]
00007f47e2ff9000 10240 24 24 rw--- [ anon ]
00007f47e39f9000 4 0 0 ----- [ anon ]
00007f47e39fa000 10240 24 24 rw--- [ anon ]
00007f47e43fa000 4 0 0 ----- [ anon ]
00007f47e43fb000 10240 28 28 rw--- [ anon ]
00007f47e4dfb000 4 0 0 ----- [ anon ]
00007f47e4dfc000 10240 20 20 rw--- [ anon ]
00007f47e57fc000 4 0 0 ----- [ anon ]
00007f47e57fd000 10240 12 12 rw--- [ anon ]
00007f47e61fd000 4 0 0 ----- [ anon ]
00007f47e61fe000 10240 8 8 rw--- [ anon ]
00007f47e6bfe000 4 0 0 ----- [ anon ]
00007f47e6bff000 10240 8 8 rw--- [ anon ]
00007f47e75ff000 4 0 0 ----- [ anon ]
00007f47e7600000 26624 10412 10284 rw--- [ anon ]
00007f47e93ff000 16388 13536 13516 rw--- [ anon ]
00007f47ea7f3000 4 0 0 ----- [ anon ]
00007f47ea7f4000 10240 8 8 rw--- [ anon ]
00007f47eb1f4000 4 0 0 ----- [ anon ]
00007f47eb1f5000 10240 16 16 rw--- [ anon ]
00007f47ebbf5000 4 0 0 ----- [ anon ]
00007f47ebbf6000 10240 8 8 rw--- [ anon ]
00007f47ec5f6000 4 0 0 ----- [ anon ]
00007f47ec5f7000 10240 8 8 rw--- [ anon ]
00007f47ecff7000 4 0 0 ----- [ anon ]
00007f47ecff8000 10240 8 8 rw--- [ anon ]
00007f47ed9f8000 4 0 0 ----- [ anon ]
00007f47ed9f9000 10240 8 8 rw--- [ anon ]
00007f47ee3f9000 4 0 0 ----- [ anon ]
00007f47ee3fa000 10240 16 16 rw--- [ anon ]
00007f47eedfa000 4 0 0 ----- [ anon ]
00007f47eedfb000 10240 24 24 rw--- [ anon ]
00007f47ef7fb000 4 0 0 ----- [ anon ]
00007f47ef7fc000 10240 16 16 rw--- [ anon ]
00007f47f01fc000 4 0 0 ----- [ anon ]
00007f47f01fd000 10240 24 24 rw--- [ anon ]
00007f47f0bfd000 4 0 0 ----- [ anon ]
00007f47f0bfe000 10240 8 8 rw--- [ anon ]
00007f47f15fe000 4 0 0 ----- [ anon ]
00007f47f15ff000 100356 49516 49484 rw--- [ anon ]
00007f47f7a00000 1107968 747476 745544 rw--- [ anon ]
00007f483b7f1000 4 0 0 ----- [ anon ]
00007f483b7f2000 10240 0 0 rw--- [ anon ]
00007f483c1f2000 48 0 0 r-x-- libnss_files-2.12.so
00007f483c1fe000 2048 0 0 ----- libnss_files-2.12.so
00007f483c3fe000 4 0 0 r---- libnss_files-2.12.so
00007f483c3ff000 4 0 0 rw--- libnss_files-2.12.so
00007f483c400000 4096 4096 4096 rw--- [ anon ]
00007f483c9ff000 4 0 0 ----- [ anon ]
00007f483ca00000 182272 57240 57208 rw--- [ anon ]
00007f4847d2f000 152 68 68 rw--- [ anon ]
00007f4847d55000 84 0 0 r-x-- libz.so.1.2.3
00007f4847d6a000 2044 0 0 ----- libz.so.1.2.3
00007f4847f69000 4 0 0 r---- libz.so.1.2.3
00007f4847f6a000 4 4 4 rw--- libz.so.1.2.3
00007f4847f6b000 12 4 4 rw--- [ anon ]
00007f4847f6f000 32 4 4 rw--- [ anon ]
00007f4847f77000 256 72 0 r-x-- libjemalloc.so.1
00007f4847fb7000 2048 0 0 ----- libjemalloc.so.1
00007f48481b7000 8 8 8 rw--- libjemalloc.so.1
00007f48481b9000 8 8 8 rw--- [ anon ]
00007ffffdd5c000 108 12 12 rw--- [ stack ]
00007ffffddff000 4 4 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------ ------ ------
total kB 5971940 3496304 3488036

anon用途:'[ anon ]' for allocated memory,應該是glibc分配的內存。

一共有6列
第一列代表內存段的虛擬地址
第二列代表執行權限,r,w,x不必說,p=私有 s=共享
不用說,heap和stack段不應該有x,否則就容易被xx,不過這個跟具體的版本有關
第三列代表在進程地址里的偏移量
第四列映射文件的主設備號和次設備號
通過 cat /proc/devices
得知fd是253 device-mapper

第五列映像文件的節點號,即inode

第六列是映像文件的路徑
以前我很奇怪怎么會有兩個相同的文件路徑,原來
08048000-08067000 r-xp 00000000 fd:00 843075     /sbin/init
08067000-08068000 rw-p 0001e000 fd:00 843075     /sbin/init
一個是只讀的,是代碼段,一個是讀寫的,是數據段

這個業務上基本山算是OLTP,盤中都是很簡單的SQL,所以性能上雖然有些SQL有些慢,但看過slow-log和performance_schema,可以忽略不計。

初步了解,應用是java開發的,但是應用端沒有出現過OOM的情況,也不見卡死或者越來越慢的情況。

從周一開始查到今天下午,尼瑪mysql跟memory leak有關的幾乎任何能夠查到的buglist都被一個個review驗證了,差不多能遇到的各種可能性都測試過,包括但不限於concat可能存在內存分配泄露,google版jemalloc可能導致內存增長,2.6.32版本vm.swappiness=0行為發生變化可能導致內存bug,mysql memory臨時表釋放可能存在問題,大量表的drop/create會導致dict_mem無限增長,幾乎驗證了mariadb/percona/mysql社區版本5.5,5.6,5.7各個版本,分析了各種mysql內存組成情況的腳本以及驗證工具,尼瑪都沒找到問題。。。

嘗試過將mysql 臨時表從memory改到innodb,又改到myisam已驗證可能存在問題,均沒有發現明顯問題。

有帖子又提及LOB可能會釋放存在問題,仔細檢查發現,業務表沒有LOB類型,但似乎有定時任務不停在查詢mysql.proc,需要跟開發確認原因。

某個帖子又提及5.0版本中client_statisitics中host超過16導致/tmp空間持續增長導致內存持續增長,我們用的percona server 5.6,經驗證后,不是該問題所致。。不過順帶發現一個運維用python寫的腳本不停地create/drop連接,要求整改了。。

線上環境基本上所有業務編寫在存儲過程中,一個過程套用其他五六個存儲過程,各種奇葩邏輯。。。無奈只能做到運維旁邊守着控制台盯着,已經排除了各種mysql服務器自身導致的問題,且驗證了肯定不可能是innodb和其他服務器端可見的內存的問題之后,開始從應用程序入手,基本上連接就50個不到,有差不多一半的連接都是兩個定時任務在實時更新風控相關的值,有數據更新程序就整個過程跑,不然就基本上跳過,里面使用了mysql臨時表。沒數據更新時雖然一直跑,但是mysql內存沒有增長,到了盤中有數據之后,內存就每隔幾秒nM到一二十M的增長,然后增長到了mysqld的內存占整個OS內存的90%左右,然后top RES維持在該值,VIRT開始繼續增長,直到盤后的備份時因為OOM被os killed。盯着看了兩天之后,本來昨天就打算在內存90%時逐台應用程序掐掉看下是不是客戶端連接導致的,只是運維后來走了。。今天收市后讓運維把接入機重啟了下,瞬間mysqld內存占用回到了50%。問題的現狀總算是可以重現了。

查看了下應用配置並跟框架確認了下,目前用的c3p0。

現在剩下的就是明天繼續盯盤檢查時c3p0連接配置問題所致,還是mysql臨時表問題(在測試環境各個版本都模擬了,都沒重現線上問題,估計不是這個問題所致是大概率),要是還不是這兩個問題所致, 只能代碼慢慢debug優化下去,然后再找到根本原因。

。。。嚴重吐槽。。。

mysql查看innodb/myisam之外內存使用情況的工具基本上沒有。網上的各種什么mysqltuner.pl,my_memory,包括mysql 5.7的memory performance_schema,各種的瞎猜測。。

唯一可靠的估計就是valgrind,可惜沒法attach到線上進程。。

周五繼續跟蹤了下,不是mysql臨時表的原因,大概確定為mysql 存儲過程 最后返回結果給jdbc客戶端時使用了select * from ...的原因,純粹的存儲過程select並沒有這個問題,這個使用mysqlslap跑了幾千萬次驗證過。這兩天具體測試是否這原因所致。

問題現在已經初步解決:應用端jdbc連接池的minIdle默認值降低,不和maxActive相同。並加上testOnBorrow=true。下午跟蹤下來內存在達到65%之后,基本上不再上升,innodb大概實際使用了1.5g,最多40個並發連接左右最高觸及2.4g之后基本上沒有在上升,mysql進程占用的內存在56%到65%之間波動。

業務結束后調整增加minEvictableIdleTimeMillis,timeBetweenEvictionRunsMilis參數,minIdle設置為1,明后天再觀察兩天,確保庫的穩定。

PS: mariadb 10.0.2開始,show processlist有個額外的列memory_used,可查看每個進程的內存占用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM