Out of memory: Kill process (mysqld)


早上發現無法瀏覽自己某些網站,瀏覽器錯誤訊息顯示無法連線資料庫,由於那是程式判斷出來顯示,所以表示 Apache 還活著,但 MySQL 掛了。
馬上登入雲端主機重啟 MySQL 服務,並查看錯誤訊息。
看來昨晚就因為記憶體不足而被砍掉行程了…

Mar 17 19:03:43 mercury kernel: Killed process 1448, UID 27, (mysqld) total-vm:729860kB, anon-rss:32048kB, file-rss:8kB
Mar 17 19:03:43 mercury kernel: Out of memory: Kill process 1448 (mysqld) score 53 or sacrifice child

由於這台雲端主機都是放自己的東西而以,所以是租用等級最低的方案,記憶體只有 0.6GB,之前在設定時沒有考慮到這件事。
首先增加 swap
Linux Add a Swap File – Howto
Linux 增加 Swap 空間
然後可以使用 MySQL Tuner 優化 MySQL
Optimising MySQL settings – mysqld running out of memory
How to Install MySQL on CentOS 6
下載 MySQL Tuner

wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl

執行 MySQL Tuner

perl ./mysqltuner.pl

然後輸入 root 帳號密碼,就會開始分析這台主機,給出建議的 MySQL 設定值

Variables to adjust:
    query_cache_size (>= 8M)
    tmp_table_size (> 16M)
    max_heap_table_size (> 16M)
    thread_cache_size (start at 4)

再修改 /etc/my.cnf 設定檔,加入或修改設定值

query_cache_size = 8M
tmp_table_size = 16M
max_heap_table_size = 16M
thread_cache_size = 4

重啟 MySQL 服務