2020正月明けの障害の原因・報告
原因が判明し、対応を完了できたので報告いたしますshokai.icon (2020/1/20)
行った操作
2019年末に、Node.jsのバージョンを11.15から12.14(最新版)に更新した
問題
この問題は年末から存在していたが
年末年始はアクセスが少なかったので顕在化しなかった
正月明けで初めて500MBを超え、障害が発生した
一時的な復旧
Node.jsのバージョンを11.15に一旦戻す事で復旧しました (2020/1/6 14:30ごろ)
障害の原因
Node.jsは12系から、メモリ使用量の上限をサーバー環境を見て自動的に決定する様になった
サーバープロセスが停止し、数分後に強制終了する
停止している間は
減ったサーバーの分の処理を、残ったサーバーが引き受ける事になる
残ったサーバーも高負荷となり、次々と停止してしまう
Herokuとnode12のメモリ使用量判定の相性が悪かった
Scrapboxのサーバーを置いているHerokuは
メモリ1GBでCPUが8個のマシンであると、Node.jsに認識されている
しかし実際に使えるCPUは2個だけ
普通、CPUが8個もあればメモリはもっと積んでいるはず
Herokuは仮想環境なので、この様な不思議なサーバー構成に(プログラム側からは)見えてしまう
おそらくNode.jsの中のメモリ上限を決める計算が想定していないサーバー構成なのだと思いますshokai.icon
障害の解決
--max-old-space-size=1024を指定しました
このオプションにより、メモリ使用量の上限を自動的にではなく、手動で設定できました
--max-old-space-sizeオプションとは
2020/1/20時点のNodejsの最新バージョンは12.14です
--max-old-space-sizeオプションは、2019年夏ごろの12.4.0の時点でbugがありました
そのため、正しく機能するかどうか確信が持てませんでした
負荷テストを行った(2020/1/10)
Node.js 12.14で、--max-old-space-sizeを指定しない場合はメモリ使用量500MB程度でJavasciprt heap out of memoryが発生する事を確認
Node.js 11で起動したScrapboxは、メモリを1GBまで使える事を確認
--max-old-space-sizeを指定すればメモリを1GBまで使える事を確認
Node.jsを再び12.14に更新した(2020/1/14 12時ごろ)
その後は問題なく動作しています (2020/1/20 10:57)
お詫び
本来は、1時間近いサーバー停止を2回も発生させるのではなく、最初の15分ほどで原因を特定して対応できる簡単な内容の障害でした
突然の障害にあわててしまい、効率的に原因を特定する手順を取れていませんでした
大変申し訳なく思っていますshokai.icon
今後の改善
サーバー障害時の原因特定フローのマニュアルを作成しました