Mysql

mysqld記憶體消耗持續上升

  • March 16, 2019

mysqld 記憶體消耗永遠上升,似乎永遠不會被釋放。它開始時大約 6GB,但在幾週內逐漸增加到大約 10GB,在檢查 innodb 狀態時,緩衝池和字典分別使用 10GB 和 4GB 和 50MB。

這是在具有 12GB 記憶體的伺服器上使用 MySQL 5.6.16。一些表是分區的,大約有 8000 個 idb 文件。每天還會創建一張桌子。

我試圖刷新表格但沒有成功。表已關閉,但記憶體根本沒有被釋放。事實上,更多的記憶體被消耗。

為什麼記憶體被消耗?使用分區表時是否有任何已知的記憶體未被釋放的問題?

我的.cnf

query_cache_size = 512M
query_cache_limit = 16M
max_allowed_packet = 16M
table_open_cache = 1024
sort_buffer_size = 2M
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 2MB
myisam_sort_buffer_size = 1M
max_connections = 1024
thread_cache = 1024
tmp_table_size = 16M
max_heap_table_size = 16M
wait_timeout = 20
join_buffer_size = 256KB
thread_cache_size = 50
table_definition_cache = 400
key_buffer_size = 256M

我們追踪到 glibc。使用 glibc-2.12-1.149.el6_6.4.x86_64,關閉表時記憶體不會完全釋放。

似乎在高並發連接下,訪問分區表會增加 Open_tables 從而增加記憶體使用量,但是當使用 glibc 關閉表時記憶體並沒有完全釋放。

較新的 glibcs​​ 也面臨同樣的問題。切換到 jemalloc-3.6.0-1.el6.x86_64 解決了我們的問題。

測試環境

CentOS release 6.6 (Final)

kernel 2.6.32-504.el6.x86_64

mysql-5.6.16

物理記憶體 2G

緩衝池 256M

其他預設

gblic-2.12-1.166.el6_7.7.x86_64 的記憶體使用量

第一輪

mysqlslap 並發連接:70,訪問的分區:800 -> 1.3G

“刷新表” -> 1.0G

第二輪

mysqlslap 並發連接:70,訪問分區:800 -> 1.6G

“flush table” -> 1.2G

第三輪

mysqlslap 並發連接:70,訪問分區:800 -> 1.6G

“flush table” -> 1.4G

jemalloc-3.6.0-1.el6.x86_6第一輪

mysqlslap 並發連接的記憶體使用量:70,訪問的分區:800 -> 1.3G

“刷新表” -> 582M

第二輪

mysqlslap並發連接:70,訪問partitions:800 -> 1.3G

“flush table” -> 583M

第三輪

mysqlslap並發連接:70,訪問partitions:800 -> 1.2G

“flush table” -> 584M

8000 個 idb 文件…每天還會創建一個表。

不是一個好的設計。請提供詳細資訊,以便我們討論可行的替代方案。

您每天使用這 8000 台中的多少台?

query_cache_size = 512M

超過大約 50M,QC 會導致性能不佳的尖峰。

你有多少記憶體?

你在使用 InnoDB 嗎?還是 MyISAM?或兩者?

STATUS價值是Max_used_connections多少?

僅適用於 12GB 機器上的 InnoDB,key_buffer_size=20M以及innodb_buffer_pool_size=8G.

您提到了“分區”;任何表中有多少個分區?大約 50 是一個實際的上限;遠不止於此,性能明顯受到影響。

引用自:https://dba.stackexchange.com/questions/131911