mysqld記憶體消耗持續上升
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 是一個實際的上限;遠不止於此,性能明顯受到影響。