Yak shaving logs


My life is just yak shaving.

terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc

2018/10/10 #EC2 #wicked_pdf

By Yusuke Takita


こんにちは。Kajitz inc.の瀧田です。

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で落ちてしまうということが分かりました。

Command Error: terminate called after throwing an instance of 'std::badalloc' · Issue #559 · mileszs/wickedpdf · GitHub

念のためサーバーにSSHして top でメモリ使用量を確認して、概ねその通りだろうということも分かりました。(ちょっと分かりにくいです)

Image from Gyazo

解決策としてぱっと思いつくのは、以下のふたつです。

  1. メモリを増やすためにスケールアップする
    金で殴るのがてっとり早いですね。
    ただ、ELBを使ってなかったりするとダウンタイムが発生したりするので、予算と環境、サービスの性質を考慮して選択するのが良さそうです。

  2. メモリ使用量を抑える
    メモリ使用を抑える方法としては、以下のふたつが考えられますが、どちらも現実的ではありません。
    ライブラリを読んで対応となると楽しそうですが、工数がすごくとられそうですね。

  • ライブラリをチューニングする
  • 解像度を落とす

wkhtmltopdfで解像度を落とす場合は、 dpi オプションで対応できます。

Error "std::bad_alloc" wicked pdf wkhtmltopdf - Stack Overflow

上記のようなことを考えながら、今回はスケールアップを解決策としてとることにしました。

このエントリーをはてなブックマークに追加

categories


最新記事


tags