現象
selenium/standalone-chromeのcontainerをGCEでしばらく使っていたらsshに接続できなくなった。
ローカルのMacbookでは発生していなかった。
メモリ関連が原因だと考え調査したところ、Out Of Memoryが発生していた。
docker run -d -p 4444:4444 --shm-size=2g selenium/standalone-chrome:latest
解決策
VMのメモリを監視しswap領域を追加した。
(お金のある人はメモリがたくさん乗ったインスタンスを使うのが理想的です。)
swapの追加方法
sudo dd if=/dev/zero of=/swapfile bs=1M count=3000
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapが追加されていることを確認する
free -m
total used free shared buff/cache available
Mem: **** *** *** *** *** ***
Swap: 2999 *** ***
次回起動時に自動でmountできるように /etc/fstab
に追記する。
# /etc/fstab
/swapfile none swap sw 0 0
現象の究明
メモリ状態を監視する
stackdriver-agentを導入し、Cloud Monitoring にメモリのグラフが出るようにした。
https://cloud.google.com/monitoring/agent/installation?hl=ja
Out Of Memoryが起きたときの状態
- Timeoutしてssh接続できない
- Cloud Monitoring でメモリ状態を監視したところ、徐々にFreeが減少し、最終的にVMは起動しているがグラフが出ない状態になる。
swapの容量
- メモリ3Gのインスタンスを使っていたので3Gを設定
システム内の RAM の容量 | 推奨されるスワップ領域 | ハイバネートを許可する場合に推奨されるスワップ領域 |
---|---|---|
⩽ 2 GB | RAM 容量の 2 倍 | RAM 容量の 3 倍 |
2 GB ~ 8 GB | RAM 容量と同じ | RAM 容量の 2 倍 |
8 GB ~ 64 GB | 最低 4GB | RAM 容量の 1.5 倍 |
64GB 未満 | 最低 4GB | ハイバネートは推奨されない |
※ ハイバネートはwindowsのsleepみたいなやつで、メモリの状態を一時的にHDDに保存する機能です。