MySQL記憶體不釋放

2021-06-21 16:27:13 字數 2659 閱讀 9956

前幾天業務線發現一例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 記憶體管理器放在空閒記憶體...