Linux
Linux 上的 MySQL 記憶體不足
作業系統: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_size
、read_rnd_buffer_size
、和sort_buffer_size
,因為它的總和是從 乘以 1000 。thread_stack``join_buffer_size``max_connections
其他解決方案是降低一點
max_connections
數字。有了這個用於執行緒緩衝區的巨大記憶體,innodb_buffer_pool_size
所有與 InnoDB 相關的變數都成為了一個小問題。您還可以嘗試確定您的應用程序是否真的有大量的
sort_buffer_size
和join_buffer_size
. 如果沒有,請記下這些值。希望它有所幫助。