Symfoware

Symfowareについての考察blog

nginx + ngx_small_lightの高速化対応

Debian 7にngx_small_lightをインストールして、
動的に画像のリサイズが行えるようにしてみました。

nginxで動的に画像をリサイズする(ngx_small_light使用)

各種オプションでどれが高速に変換してくれるか試してみます。



JMeter



計測はJMeterで行いました。

スレッド数:10
Ramp-Up期間(秒):1
ループ回数:50

で計測します。

597_01.png


HTTPリクエストパスの設定は以下のとおりです。

small_light(dw=250,dh=250,da=l,q=95,e=imagemagick,jpeghint=n)/img/sample.jpg
small_light(dw=250,dh=250,da=l,q=95,e=imagemagick,jpeghint=y)/img/sample.jpg
small_light(dw=250,dh=250,da=l,q=95,e=gd)/img/sample.jpg
small_light(dw=250,dh=250,da=l,q=95,e=imlib2,jpeghint=n)/img/sample.jpg
small_light(dw=250,dh=250,da=l,q=95,e=imlib2,jpeghint=y)/img/sample.jpg


計測結果はこちら

モード#SampleAverageMedian90%lineMinMaxError%ThroughputKB/sec
imagemagick,jpeghint=n5007023633712907772474270.01.256955.539
vimagemagick,jpeghint=y5004404038045328970.019.704867.399
GD500333630706198393245360.02.58235.196
imlib2,jpeghint=n500174016053248202125460.04.94171.987
imlib2,jpeghint=y5001135203208200912770.04.89271.274


スループットを見ると、imagemagick,jpeghint=yが最速でした。
imlib2はjpeghitが有効になるかと思いましたが、効果はないようです。

imagemagick,jpeghint=yのオプションに絞り、更に高速化できないか調べてみます。




OMP_NUM_THREADS=1



OMP_NUM_THREADSを1に設定するといいよとのことなので、
/etc/init.d/nginxスクリプトで起動時に読み込むよう指定している
/etc/default/nginxに一行追加します。


# vi /etc/default/nginx




他のコメントは、nginxをデフォルトでインストールしたものから
コピーしてきています。


# Note: You may want to look at the following page before setting the ULIMIT.
# http://wiki.nginx.org/CoreModule#worker_rlimit_nofile
# Set the ulimit variable if you need defaults to change.
# Example: ULIMIT="-n 4096"
#ULIMIT="-n 4096"
export OMP_NUM_THREADS=1;




これで計測してみるとこんな結果になりました。

モード#SampleAverageMedian90%lineMinMaxError%ThroughputKB/sec
OMP_NUM_THREADS5005404919866234340.016.227714.340



私の環境ではスコアが下がったのですが、効果があるパターンも見たことがあるので、
設定して計測してみるのが良いかと思います。




nginxのワーカーを増やす



nginx.confでワーカーの数を増やしてみます。


worker_processes 2;



結果は当然のように高速になりました。

モード#SampleAverageMedian90%lineMinMaxError%ThroughputKB/sec
worker25002932735575712100.026.1361150.502


アクセス数を捌きたいときには、worker数をいくつまで並べられるか
(プロセッサをいくつ搭載できるか)が勝負になる気がします。





libjpeg-turbo



http://sourceforge.net/projects/libjpeg-turbo/
インストールしただけで速くなるのかな?と思い試してみました。

以下手順です。


# cd /usr/local/src
# wget http://downloads.sourceforge.net/project/libjpeg-turbo/1.4.0/libjpeg-turbo-official_1.4.0_amd64.deb
# sudo dpkg -i libjpeg-turbo-official_1.4.0_amd64.deb



ライブラリをロードするよう設定ファイルを作成し、再ロード。


# echo /opt/libjpeg-turbo/lib64/ > /etc/ld.so.conf.d/libjpeg-turbo.conf
# ldconfig




結果は変化なしでした。

モード#SampleAverageMedian90%lineMinMaxError%ThroughputKB/sec
jpeg-turbo5004474078165128970.019.598862.707






small_light_buffer



nginx.confでsmall_light_bufferを増やしてみます。


user www-data;
worker_processes 1;

pid        /var/run/nginx.pid;

events {
    worker_connections 1024;
}


http {
    include     mime.types;
    default_type application/octet-stream;

    sendfile        on;
    keepalive_timeout 65;
    
    server {
        listen     80;
        server_name localhost;
        root /var/www;
        
        # small_lightを有効化
        small_light on;
        small_light_pattern_define msize dw=500,dh=500,da=l,q=95,e=imagemagick,jpeghint=y;
        small_light_pattern_define ssize dw=120,dh=120,da=l,q=95,e=imlib2,jpeghint=y;
        
        small_light_buffer 100M;

        location ~ small_light[^/]*/(.+)$ {
            set $file $1;
            rewrite ^ /$file;
        }


    }

}




こちらも変化なし。

モード#SampleAverageMedian90%lineMinMaxError%ThroughputKB/sec
buffer5004454068135228850.019.677866.171





キャッシュの有効化



nginxのキャッシュを有効化してみます。

こちらを参考にしました。
nginxを使った簡単快速reverse proxy+cacheサーバ構築法


user www-data;
worker_processes 1;

pid        /var/run/nginx.pid;

events {
    worker_connections 1024;
}


http {
    include     mime.types;
    default_type application/octet-stream;

    sendfile        on;
    keepalive_timeout 65;
    
    # キャッシュパスを指定
    proxy_cache_path /opt/nginx/cache levels=1:2 keys_zone=cache-space:4m max_size=50m inactive=120m;
    
    server {
        listen     80;
        server_name localhost;
        root /var/www;
        
        # small_lightを有効化
        small_light on;
        
        small_light_buffer 100M;
        
        # プロキシのバッファを増やす
        proxy_buffers 8 1m;
        proxy_buffer_size 1m;
        
        location ~ ^/resize/(.+)$ {
            proxy_cache cache-space;
            proxy_cache_valid 200 60m;
            proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
            proxy_pass http://127.0.0.1/small_light(dw=250,dh=250,da=l,q=95,e=imagemagick,jpeghint=y)/$1;
        }
        

        location ~ small_light[^/]*/(.+)$ {
            set $file $1;
            rewrite ^ /$file;
        }


    }

}




当然ですが、めっちゃ高速になりました。

モード#SampleAverageMedian90%lineMinMaxError%ThroughputKB/sec
cache500001020.0530.22323340.672



関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2015/03/13(金) 22:41:10|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:2
  5. | 編集
<<ngx_small_light 画像の中心を繰り抜いて表示する | ホーム | nginxで動的に画像をリサイズする(ngx_small_light使用)>>

コメント

small_light_bufferの用途

small_light_bufferはngx_small_lightのフィルタハンドラに処理が回ってきた際にContent-Lengthが空だった場合にアロケートするメモリサイズなのでパフォーマンスには直接影響を与えません。たまに行儀の悪い(Content-Lengthを付けない)アップストリームサーバがいるのでそのためのワークアラウンドです。
  1. 2015/03/26(木) 20:42:57 |
  2. URL |
  3. cubicdaiya #-
  4. [ 編集 ]

Re: small_light_bufferの用途

なるほど、そういうことですか。
コメントありがとうございます。
  1. 2015/03/26(木) 21:22:36 |
  2. URL |
  3. symfo #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1691-b4a14da0
この記事にトラックバックする(FC2ブログユーザー)