こんにちは。Takitaです。
railsで運用しているサービスでHTMLをPDFに変換する機能を、wkhtmltopdfを用いて実現しているのですが、本番環境でPDF変換する際に terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
というエラーで落ちてしまう現象が発生しました。
Rails 5.2.0.beta2
wkhtmltopdf 0.12.3 (with patched qt)
EC2 t2.micro (メモリ1G)
以下のissueを確認したりした結果、本番環境でHTMLからPDFに変換する時にメモリを一時的に激しく消費してしまい、out of memoryで落ちてしまうということが分かりました。
念のためサーバーにSSHして top
でメモリ使用量を確認して、概ねその通りだろうということも分かりました。(ちょっと分かりにくいです)
解決策としてぱっと思いつくのは、以下のふたつです。
メモリを増やすためにスケールアップする
金で殴るのがてっとり早いですね。
ただ、ELBを使ってなかったりするとダウンタイムが発生したりするので、予算と環境、サービスの性質を考慮して選択するのが良さそうです。
メモリ使用量を抑える
メモリ使用を抑える方法としては、以下のふたつが考えられますが、どちらも現実的ではありません。
ライブラリを読んで対応となると楽しそうですが、工数がすごくとられそうですね。
wkhtmltopdfで解像度を落とす場合は、 dpi
オプションで対応できます。
Error "std::bad_alloc" wicked pdf wkhtmltopdf - Stack Overflow
上記のようなことを考えながら、今回はスケールアップを解決策としてとることにしました。