Docker container random crash
記錄追蹤 docker container 隨機 crash 時碰到的一些狀況與紀錄。最後發信問題解決的辦法。
紀錄一下最近遇到一個很神奇的問題,我有一台 VPS 上面用 docker host 了 WordPress 的服務,架構是 web server 跟 mysql 各一台 container 做 link,可是會零星的出現 error establishing a database connection
錯誤訊息,馬上就知道是 mysql 連不上了。
錯誤追蹤
如果去追查一下 mysql 的錯誤 log 會看到
[ERROR] InnoDB: Cannot allocate memory for the buffer pool
大約能猜測跟記憶體有關係,所以調整一些 mysql 的參數,例如 innodb_buffer_pool_size
之類的。
可是,停擺的狀況都沒有改善,container 依然會隨機性的 crash ,甚至補上了 health check 想讓 container 自動重新啟動,這種逃避性的想法🤡
再發生了幾個月之後 health check 也沒辦法把 container 自動重啟。
順手地看了一下記憶體配置
docker stats
container 記憶體使用率也不過 20 %
照理來說,一台有 8G 記憶體的 VPS 這種流量的網站,應該對 mysql 是小意思才對。
直到某天我絕望的看了一下記憶體
free -m
WTF 我的 swap 居然是空的!這就都說得通了。
調整 swap
某天升級伺服器的時候,順手調整了 swap disk 空間,無知的我以為,只要分割硬碟就可以了,沒想到自己還要自己新增 swap
後來參照著這篇 How to Add Swap Space on Ubuntu 18.04
教學設定
free -m
收工
結論
我自己對 swap 的認知是,當系統記憶體不夠用時,會主動觸發 OOM killer,去把很消耗記憶體的服務給刪除,在瞬間大流量的時候記憶體可能不太夠用,又沒有 swap 可以當作緩衝,所以系統就把 mysql 的 container 給砍掉了。
現在加上了 swap 之後 random crash 的問題也已經解決了,長遠的方向來看,還是要針對 mysql 的設定進行最佳化才行。