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

マルチコア環境下でOpenMP対応のImageMagickがconvert処理で異常に高負荷になるという問題があります。

ImageMagickは、Webなどの世界でも画像のサイズ変更などをするときに使っていることが多い画像変換ライブラリです。 しかし、このライブラリがOpenMPの機能を使うと、非常に高負荷になるという問題があります。

この問題の影響は以下のような感じです。

  • 通常の何倍もの処理時間がかかってしまうようです。 たくさんのコアを並列で使って短時間で処理が完了するというのであればよいのですが、結果はまったく逆です。

  • 負荷が高すぎる 手元の環境でtopコマンドを眺めていると4コアのマシンの全コアの使用率が100%になってます。 これではほかの処理がすべて止まってしまいます。

  • OpenMPを無効にする手順が煩雑 この問題、そもそもCentOSなどの多くのパッケージではデフォルトでOpenMP対応の機能が有効になっており、 無効にするにはリビルドが必要ということになっていることも多くの人が困っている原因になってたりします。

通常yumやrpmでインストールしていた環境を、リビルドしたものに置き換えるのは結構ハードルがあります。 リビルドの場合はコツコツ依存関係を解決した上で、ソースからインストールしたり、 適切な設定値を考えたり、他への影響はないかなど、できればやりたくないですね。 それまで1コアのVMで運用していてまったく問題なかったサイトが多コアになった瞬間発動したりもしますので OpenMP関係ないという人も他人事ではないかもしれません。

この問題について、最もシンプルで対処が簡単な方法はOMP_NUM_THREADSという環境変数を設定することではないかと思います。

実行ユーザの.bash_profile等で以下の1行で対応できます。

export OMP_NUM_THREADS=1

またデーモンとして起動するサービスで利用する場合はそれぞれの/etc/init.d配下のスクリプトに記載でも動作すると思います。 また、apacheを利用している場合は/etc/httpd/conf/httpd.confの先頭でも最後にでも以下の1行を設定するだけです。

SetEnv OMP_NUM_THREADS 1

と設定して

$ sudo service httpd configtest
Syntax OK
$ sudo service httpd reload

これでOKです。

あまり前後で時間を真面目に計測していませんが、自分の環境(4コアのVM)では処理時間が約1/5になったものがありました。

環境変数に設定するだけなので、戻すのも簡単です。 ImageMagick(PerlMagickやrmagickなどのラッパ)の負荷が高い、OpenMPを無効にした再インストールを検討している方は、一度試してみる価値があると思います。

OpenMPのその他の環境変数はこのあたりをご確認ください。




記事一覧へ