Linux
排除來自 mysql 的記憶體不足錯誤消息
我們有一個 web 應用程序(racktables),它讓我們對我們的生產箱感到悲痛。每當使用者嘗試執行搜尋時,都會出現以下錯誤:
Pdo exception: PDOException SQLSTATE[HY000]: General error: 5 Out of memory (Needed 2057328 bytes) (HY000)
我無法在我們的備份伺服器上重現該問題。除了在生產中我們有 16GB RAM 和我們的備份我們有 8GB 的事實之外,伺服器匹配。這是一個有爭議的問題,因為兩者都執行 32 位作業系統,因此只使用 4GB 的 RAM。我們還設置了一個交換分區…
這是我從生產中的“free -m”命令得到的結果:
prod:/etc# free -m total used free shared buffers Mem: 3294 1958 1335 0 118 -/+ buffers: 1839 1454 Swap: 3817 109 3707 prod:/etc#
我已經檢查以確保兩個盒子上的 my.cnf 匹配。生產中的數據庫被複製到備份伺服器上……所以數據也匹配。
我想我們的選擇是:
A) convert the o/s to 64 bit so we can use more RAM. B) start tweaking some of the innodb settings in my.cnf.
但在我嘗試 A 或 B 之前,我想知道我是否應該在兩台伺服器之間進行比較……看看備份是如何正常工作的。一定有我們沒有考慮到的差異。
我正在考慮嘗試的一件事就是重新啟動伺服器以查看是否可以修復它。如果是這樣,則可能表明記憶體洩漏問題。?? 任何建議,將不勝感激。
編輯 1
這些是執行 ulimit 命令的結果(兩台伺服器的結果相同)
prod:/etc# ulimit -a -f: file size (blocks) unlimited -t: cpu time (seconds) unlimited -d: data seg size (kb) unlimited -s: stack size (kb) 8192 -c: core file size (blocks) 0 -m: resident set size (kb) unlimited -l: locked memory (kb) 64 -p: processes 26303 -n: file descriptors 1024 -v: address space (kb) unlimited -w: locks unlimited -e: scheduling priority 0 -r: real-time priority 0
我創建了一個腳本來模擬我們備份伺服器上的負載。然後我能夠重現問題。我最終不得不將“join_buffer_size”設置添加到 my.cnf 並解決了問題。
我預測問題是由一個關閉了 VM 過量使用的系統引起的。
使用 sysctl vm.overcommit_memory 檢查值
請參閱https://www.kernel.org/doc/Documentation/sysctl/vm.txt
順便說一句,對於數據庫伺服器,我不建議重新打開 overcommit。您不想使用交換文件。