見出し画像

【メモ】AWS EC2上に立てたRailsアプリでサイズの大きいファイルをアップロードすると 502 Bad Gateway となった話

はじめに

あるAWS EC2上にRailsアプリをデプロイし、nginx + unicornの環境で動かしていたんですが、少しサイズの大きいファイル(excelのファイルで数万行とかだった記憶)をアップロードすると『502 Bad Gateway』とエラーが返ってきました。
他の画面を表示したり遷移したりは出来るので、タイムアウト周りの設定かなーと思いnginxとunicornの設定を見直すも解決せず。
「何じゃこれ」と更に調べてみると、どうやらOOM Killerが原因のようでした。
OSはCentOS 7です。

OOM Killerとは

OOM KillerとはLinuxカーネルの持つ機能で、システムがメモリ不足となった時、リソースを多く消費しているプロセスを強制的に殺すというものです。
今回はでかいファイルをアップロードしようとしてunicornの処理でメモリが枯渇し、このOOM Killerによってプロセスが殺されていたようですね。

Swap領域が用意されていれば、メインメモリが不足した際にデータをSwap領域に移してメモリ不足のエラーを回避できます。
が、AWS EC2インスタンスはSwap領域がデフォルトでは設定されていないので、意識的にSwap領域を作成しておかないと、ふとした瞬間にプロセスが殺されてトラブルになるかもしれないです。

まあそもそもSwapを使ってるってことは素でメモリが足りてないということなので、サービスの性質とかメモリ不足になるタイミングにもよりますが、基本的にはSwapを作成するだけで済ませようとせず、インスタンスのグレードを上げる方向で調整した方が良さそう。

後はそもそも、アプリケーションのコーディングならびにアルゴリズムが、大量データの取り扱いに適したものになってるかも気をつけないといけませんね。Railsならバルクインサート出来るようにactiverecord-importのgemを使うとか。

参考リンク

https://donbulinux.hatenadiary.org/entry/20130910/1378803040
https://sys-guard.com/post-11945/

この記事が気に入ったらサポートをしてみませんか?