Docker container random crash

記錄追蹤 docker container 隨機 crash 時碰到的一些狀況與紀錄。最後發信問題解決的辦法。

Docker container random crash
Photo by Ian Taylor / Unsplash

紀錄一下最近遇到一個很神奇的問題,我有一台 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

CleanShot-2021-10-26-at-12.30.39

WTF 我的 swap 居然是空的!這就都說得通了。

調整 swap

某天升級伺服器的時候,順手調整了 swap disk 空間,無知的我以為,只要分割硬碟就可以了,沒想到自己還要自己新增 swap

後來參照著這篇 How to Add Swap Space on Ubuntu 18.04

教學設定

free -m

CleanShot-2021-10-26-at-12.40.02

收工

結論

我自己對 swap 的認知是,當系統記憶體不夠用時,會主動觸發 OOM killer,去把很消耗記憶體的服務給刪除,在瞬間大流量的時候記憶體可能不太夠用,又沒有 swap 可以當作緩衝,所以系統就把 mysql 的 container 給砍掉了。

現在加上了 swap 之後 random crash 的問題也已經解決了,長遠的方向來看,還是要針對 mysql 的設定進行最佳化才行。