Ticket #25883

画像変換時にCPU99%になる現象を確認

Open Date: 2011-08-02 13:25 Last Update: 2011-08-03 21:54

Reporter:
Owner:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
9 - Highest
Resolution:
None
File:
None

Details

画像変換時にapacheの子プロセスのCPU使用率が99%になる現象を確認しました。
以下、デバッグログより
now color:182004 spec->color:65536
call MagickQuantizeImage() spec->color=65536
移行処理停止状態。

colorよりspec->colorの値が低い場合に、画像変換直後にhttpdのCPU使用率が99%になり、処理が固まる問題を確認いたしました。

動作環境
CentOS release 5.6 (Final)
Apache/2.2.3
mod_chxj/0.14.(0|1)

対処として、以下のパッチを作成してあてました。

--- src/chxj_img_conv_format.c.org 2011-07-31 14:37:55.000000000 +0900
+++ src/chxj_img_conv_format.c 2011-07-31 16:07:06.000000000 +0900
@@ -1443,6 +1443,29 @@

unsigned long colors = MagickGetImageColors(magick_wand);
DBG(r,"REQ%X now color:%ld spec->color:%ld", TO_ADDR(r),colors, (unsigned long)spec->color);

+
+ if (colors >= (unsigned long)spec->color) {
+ if (colors > 262144) {
+ spec->color = 15680000;
+ } else if (colors > 65536) {
+ spec->color = 262144;
+ } else if (colors > 4096) {
+ spec->color = 65536;
+ } else if (colors > 256) {
+ spec->color = 4096;
+ } else if (colors > 16) {
+ spec->color = 256;
+ } else if (colors > 8) {
+ spec->color = 16;
+ } else if (colors > 4) {
+ spec->color = 8;
+ } else if (colors > 2) {
+ spec->color = 4;
+ } else {
+ spec->color = 2;
+ }
+ DBG(r,"REQ%X Change spec color spec->color:%ld (now color:%ld)", TO_ADDR(r), (unsigned long)spec->color, colors);
+ }

if (colors < (unsigned long)spec->color) {
DBG(r,"REQ%X Pass s_fixup_color proc. color:%ld spec->color:%d", TO_ADDR(r),colors, spec->color);
DBG(r,"REQ%X end %s()",TO_ADDR(r),func);


そもそも使い方が悪いのか、他に解決方法はございますでしょうか

Ticket History (3/9 Histories)

2011-08-02 13:25 Updated by: hogenull
  • New Ticket "画像変換時にCPU99%になる現象を確認" created
2011-08-02 15:47 Updated by: konn
  • Owner Update from (None) to konn
Comment

ありがとうございます。

早速確認します。

よろしくお願いします。

2011-08-03 03:24 Updated by: konn
Comment

役に立たない情報かもしれませんが、 Debian squeeze x86_64環境にて今のところ再現していません. が、以前よりも別次元でMagickQuantizeImage()が重いですね・・・

該当部分は減色を行っている部分なので非常に困るのですが おそらくcolorとspec->colorの差が大きくなれば99%再現できそうです.

>そもそも使い方が悪いのか、他に解決方法はございますでしょうか

使い方が悪いということは無いと思います。

他の解決方法としては、画像が多い場合には現実的ではないのですが ChxjImageRewriteディレクティブ ChxjImageRewriteUrlディレクティブ ChxjImageRewriteModeディレクティブ を使う方法と、あらかじめある程度画像を減色しておく方法が考えられます。

引き続き調べます.

よろしくお願いいたします.

2011-08-03 03:24 Updated by: konn
  • Severity Update from 5 - Medium to 9 - Highest
2011-08-03 03:52 Updated by: hogenull
Comment

ご連絡ありがとうございます。

>他の解決方法としては、画像が多い場合には現実的ではないのですが ChxjImageRewriteディレクティブ ChxjImageRewriteUrlディレクティブ ChxjImageRewriteModeディレクティブ を使う方法と、あらかじめある程度画像を減色しておく方法が考えられます。

image系のディレクティブや元画像の色数を下げる案も検討しましたが、複数のシステム(サーバ)の素材をHTTP経由で取得し、本サーバでリアルタイム変換しているため対応が難しい状態でした。

こちらでも引き続き調査いたします。
よろしくお願いいたします。

2011-08-03 06:46 Updated by: konn
Comment

たびたびすみません。。

お願いが2点あります。

1) 不要な18万色の画像がありましたら、いただけないでしょうか・・?

2) 以下のとおり修正して実行してみることは可能でしょうか・・・?


diff --git a/src/chxj_img_conv_format.c b/src/chxj_img_conv_format.c
index 0ed36a8..2f55765 100644
--- a/src/chxj_img_conv_format.c
+++ b/src/chxj_img_conv_format.c
@@ -1456,7 +1456,7 @@ s_fixup_color(MagickWand *magick_wand, request_rec *r, device_table *spec, img_c
     if (MagickQuantizeImage(magick_wand,
                            spec->color,
                            RGBColorspace,
-                           0,
+                           4,   /* tree depth of 4 */
                            1,
                            0) == MagickFalse) {
       EXIT_MAGICK_ERROR();

もちろん不可能でしたら、結構です。

お忙しいところ、申し訳ありません。 どうぞ、よろしくお願いいたします。

2011-08-03 12:05 Updated by: hogenull
Comment

ご連絡ありがとうございます。

>1) 不要な18万色の画像がありましたら、いただけないでしょうか・・?
試験で利用している画像はお出しできないのですが、18万色以上ある画像を探しました。
同様の現象を確認しましたので、こちらでご確認いただけますと幸いです。

* http://hd-wallpaper.org/95__Phoenix_Bird_Rising.htm

ログは以下の通りです

now color:483025 spec->color:65536
call MagickQuantizeImage() spec->color=65536
処理停止

>2) 以下のとおり修正して実行してみることは可能でしょうか・・・?

頂きましたパッチをあてまして再度確認いたしました。
変換できているようです。
Android端末で試験しております。
以下デバッグログを抽出いたしました。

start s_fixup_color()
now color:182004 spec->color:65536
call MagickQuantizeImage() spec->color=65536
call end MagickQuantizeImage() spec->color=65536
end s_fixup_color()

1)でご返答いたしました画像も問題なく変換できました。
ログは以下の通りです

call s_fixup_color()
start s_fixup_color()
now color:483025 spec->color:65536
call MagickQuantizeImage() spec->color=65536
call end MagickQuantizeImage() spec->color=65536
end s_fixup_color()

よろしくお願いいたします。

2011-08-03 18:16 Updated by: konn
Comment

遅くなりまして、申し訳ありません。。

画像の方、ありがとうございます。 いただいた画像で確認したところ、CentOSにて再現できました。

tree depth of 4の修正について、こちらでテストしてみて 異常がなければそのままリリースしてしまおうと考えています。

また、問題を回避するためのパッチを張っていただいたため、 問題の特定に時間がかかりませんでした。 ありがとうございました。 また、お手数お掛けして申し訳ありません。

以上、よろしくお願いいたします。

2011-08-03 21:54 Updated by: hogenull
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2011-08-03 21:54
Comment

ご連絡ありがとうございます。
こちらでも頂きましたパッチを適応して、再度確認いたします。
迅速な対応ありがとうございました。
こちらのチケットは完了とさせて頂きます。
以上、よろしくお願い致します。

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login