Linux

Linux 上的 MySQL 記憶體不足

  • January 29, 2015

作業系統:Redhat Enterprise Linux Server Release 5.3 (Tikanga)

架構:英特爾至強 64 位

MySQL Server 5.5.20 企業伺服器高級版。

應用:Liferay。

我的數據庫大小是 200MB。記憶體為 64GB。 記憶體消耗逐漸增加**,記憶體耗盡**。然後只有重新啟動釋放所有記憶體,但隨後記憶體消耗過程再次開始,不到一天就達到了 63-64GB。

參數詳情

key_buffer_size=16M

innodb_buffer_pool_size=3GB

inndb_buffer_pool_instances=3

最大連接數=1000

innodb_flush_method=O_DIRECT

innodb_change_buffering=插入

read_buffer_size=2M

read_rnd_buffer_size=256K

這是我面臨的一個嚴重的生產伺服器問題。這可能是什麼原因以及如何解決。

這是今天下午 2 點的報告,在昨天晚上 10 點左右重新啟動 Linux 之後。

free -m 的輸出

記憶體的已用空閒共享緩衝區總數
電話:64455 22053 42402 0 1544 1164
-/+ 緩衝區/記憶體:19343 45112
交換:74998 0 74998

vmstat 2 5 的輸出

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu ------ 
rb swpd 免費 buff 記憶體 si so bi bo in cs us sy id wa st
0 0 0 43423976 1583700 1086616 0 0 1 173 22 27 1 1 98 0 0
2 0 0 43280200 1583712 1228636 0 0 0 146 1265 491 2 2 96 1 0
0 0 0 43421940 1583724 1087160 0 0 0 138 1469 738 2 1 97 0 0
1 0 0 43422604 1583728 1086736 0 0 0 5816 1615 934 1 1 97 0 0
0 0 0 43422372 1583732 1086752 0 0 0 2784 1323 545 2 1 97 0 0

top -n 3 -b 的輸出


top - 14:16:22 up 16:32,5 個使用者,平均負載:0.79、0.77、0.93
任務:總共 345 個,1 個正在執行,344 個正在睡覺,0 個停止,0 個殭屍
Cpu (s): 1.0% us, 0.9% sy, 0.0% ni, 98.1% id, 0.1% wa, 0.0% hi, 0.0% si, 0.0% st
記憶體:總計 66002772k,已使用 22656292k,空閒 43346480k,1582152k 緩衝區
交換:總共 76798724k,使用 0k,免費 76798724k,記憶體 1163616k

PID 使用者 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令 
6434 mysql 15 0 4095m 841m 5500 S 113.5 1.3 426:53.69 mysqld 
1 根 15 0 10344 680 572 S 0.0 0.0 0:03.09 初始化 
2 根 RT -5 0 0 0 S 0.0 0.0 0:00.01 遷移/0 
3 根 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 
4 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看門狗/0 
5 根 RT -5 0 0 0 S 0.0 0.0 0:00.01 遷移/1 
                                       

我有一個類似的問題,基本上我更改了 mysqltuner.pl 腳本並使其更詳細並知道發生了什麼。

基本上,記憶體使用情況,如果您使用my-innodb-heavy-4G.cnf配置文件的任何變體,記憶體使用的主要部分幾乎是這樣的:

memory usage = min(tmp_table_size, max_heap_table_size) 
   + key_buffer_size + query_cache_size 
   + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size
   + (max_connections * 
       (read_buffer_size + read_rnd_buffer_size 
          + sort_buffer_size + thread_stack + join_buffer_size
       )
   )

這個總和不是所有的因素,請參考 mysqltuner.pl 腳本程式碼(並執行它)來查看它們。

因此,您似乎需要降低很多read_buffer_sizeread_rnd_buffer_size、和sort_buffer_size,因為它的總和是從 乘以 1000 。thread_stack``join_buffer_size``max_connections

其他解決方案是降低一點max_connections數字。有了這個用於執行緒緩衝區的巨大記憶體,innodb_buffer_pool_size所有與 InnoDB 相關的變數都成為了一個小問題。

您還可以嘗試確定您的應用程序是否真的有大量的sort_buffer_sizejoin_buffer_size. 如果沒有,請記下這些值。

希望它有所幫助。

引用自:https://serverfault.com/questions/400463