前幾天業務線發現一例mysql資料庫記憶體增長異常案例,現象如下:
資料庫版本:percona mysql 5.0.67
資料量:670m+
記憶體大小:16g
innodb buffer pool size:4g
其它回話記憶體分配並不大,基本在100m以內,並且連線數非常少
伺服器負載不高,開啟binlog,資料庫和程式都已經進行過遷移,問題仍然存在。通過top命令檢視mysql占用記憶體一直在增長,且開始使用swap。
分析排除過程:
1.懷疑到的是innodb記憶體占用,使用show engine innodb status檢視,發現free buffer佔很大部分,因此可以判斷分配給innodb引擎的記憶體夠用
2.檢視回話,回話數基本在3~4個,且回話分配的記憶體大小與現在mysql占用的回話總和相差很大,因此也不會是回話的問題
3.程式、資料庫軟體問題。已經遷移過兩次,版本與外網一致,問題依舊,因此也排除了這個問題
4.mysql重啟後記憶體釋放,因此問題還是在mysql身上,根據網上說的flush tables的做法發現無效,所以也不是開啟的表數量過大的問題導致。
現在有245、246兩台機器:
246是客戶端、245是伺服器端
(root:245:thu apr 24 16:37:28 2014)[information_schema]> select count(*) from client_statistics;
+———-+
| count(*) |
+———-+
| 2 |
+———-+
1 row in set (0.00 sec)
可以看到表裡面的資料是2條
[dba@ ~]$ mysql -h 245 -uwuwl_test -p
mysql: can』t create/write to file 『/home/mysql/query.log』 (errcode: 13)
error logging to file 『/home/mysql/query.log』
logging to file 『/home/dba/mysql/query.log』
enter password:
welcome to the mysql monitor. commands end with ; or \g.
your mysql connection id is 556
server version: 5.0.67-percona-highperf-log source distribution
type 『help;』 or 『\h』 for help. type 『\c』 to clear the buffer.
(wuwl_test:$:thu apr 24 16:39:19 2014)[(none)]> show processlist;
+—–+———–+———————————+——+———+——+——-+——————+
| id | user | host | db | command | time | state | info |
+—–+———–+———————————+——+———+——+——-+——————+
| 556 | wuwl_test | gs_438_friuha_fgesihs_fsd:50768 | null | query | 0 | null | show processlist |
+—–+———–+———————————+——+———+——+——-+——————+
1 row in set (0.00 sec)
連線了一下,並進行了一次查詢操作
(root:nj-245:thu apr 24 16:38:38 2014)[information_schema]> select count(*) from client_statistics;
+———-+
| count(*) |
+———-+
| 5 |
+———-+
1 row in set (0.01 sec)
發現資料有增長,再次進行幾次查詢,發現每次查詢都會有增長,這個正常現象麼?我修改了下主機名進行了再次查詢,發現表資料不再增長。
修改方法:主機名需要小於16位元組。
目前在5.5和5.6版本上進行了測試,發現這個表資料為空,因此這個問題可能是在5.0版本上面的乙個bug。
總結:本次問題現象主要是:記憶體異常被mysql占用不釋放並持續**,更換過程式和資料庫伺服器仍沒有效果,伺服器資料量很小,innodb buffer空閒很大。
問題原因:由於資料庫自身的統計資料表information_schema.client_statistics 資料量過大導致記憶體占用,client_statistics是一張記憶體表。
問題處理方法:由於client_statistics表裡面的host列是16個位元組的,因此如果主機名過長,會導致客戶端每一次的操作都會在表裡面新增一條資料,無論操作是否成功。因此只需要修改連線的主機名不要超過16位就不會導致記憶體占用不釋放的問題。
思考:修改了預設的東西,需要在小部分伺服器上進行測試,並詳細記錄修改後的異常,用於對比不同伺服器之間的差別。
延伸:client_statistics 用於統計客戶端連線,目前5.5、5.6以及maria已經將client欄位公升級為64個位元組,且該統計功能預設關閉,所以如果大家有統計需要,一定要記得主機名不能大於64個位元組!
mysql記憶體釋放 MySQL記憶體不釋放
歡迎進入linux社群論壇,與200萬技術人員互動交流 進入 連線了一下,並進行了一次查詢操作 root nj 245 thu apr 24 16 38 38 2014 information schema select count from client statistics count 5 1 ...
nginx php fmp 記憶體不釋放
由於伺服器只有600m的記憶體,上面跑了乙個併發並不是很大的php應用,當執行一段時間後,發現記憶體不斷增長,其中一部分是pagecache的增長,這個可以通過echo 3 proc sys vm drop caches 命令來進行有效的釋放,另外乙個應用記憶體的增長,且無法釋放,通過top命名 輸...
malloc記憶體管理器記憶體不釋放的解決方法
最近在對程式測試時發現,程式在執行某項操作後記憶體有一部分不會釋放,但是,在多次執行後又不會繼續增加,執行緒數越多,多次執行同樣的操作,記憶體占用還會增大。檢查 並沒有 上的記憶體洩漏,甚是苦惱。網上搜尋發現是malloc的原因 程式在delete空間以後,這塊記憶體被c 記憶體管理器放在空閒記憶體...