読者です 読者をやめる 読者になる 読者になる

煙と消えるその前に

一服してるうちに忘れる、自分のための備忘録。とかとか

JIRA/Confluenceをamazon linuxに立ててみたらレスポンスが激遅だった話

背景

前回、別のネタで紹介しましたが、Atlassianのプロジェクト管理ツールJIRAとコラボレーションソフトウェアConfluenceをEC2上に立ててみました。

今回は、実際に使ってみたらレスポンス激遅だったので改善しようってネタです。
apacheの設定に手を入れて速度改善してみました。

環境

  • ELB
    • 社内からのアクセスのみ許可するように制限をかけてます
  • EC2
  • JIRA/Confluence
  • apache
    • JIRA/Confluenceと同じインスタンスに立てて、JIRA/Confluenceへリバースプロキシ
    • proxy以外は初期設定のままだったり

最初の状態

なにはともあれ数字で見てみます。サンプルはConfluenceにログインした時に出てくるダッシュボード。
データ取得はchromeデベロッパーツールを使いました。
結果は以下の通り。12.88sとか(笑)
うちの環境からだと、社内プロキシを経由してる都合もあってことさら遅いのかなー・・・。
f:id:paty_fakename:20130315175016j:plain

KeepAliveでconnect回数削減

これじゃ使ってられん!てことで、改善していきます。
まず目についたのは、やたらとconnectしてるところ。てか毎リクエストでconnect走ってるし。
f:id:paty_fakename:20130315175037j:plain
1回あたりの平均はmsオーダですけど、たまーにsオーダが出てます。
しかも35リクエストとか投げてるから目も当てられない。キャッシュが効いてもかなりキツイ状況です。

・・・てことで、apacheにKeepAliveを設定します。
設定はとてもシンプルに、confファイルに以下を書くだけ。全体に効かないようvirtual host内に書きます。

<VirtualHost *:443>
  KeepAlive ON
  ....
  ....
</VirtualHost>

※ 本当はKeepAliveTimeoutとかMaxKeepAliveRequestsとかチューニングすべきだし、コネクションの最大数にも気を配るべきなのですが、現状はelbでアクセス制限してるし、利用する人数もわかってるので気にしません。

でもってapacheを再起動してみると、平均4sほど改善!えー、これだけですっごい効果出たし・・・。
f:id:paty_fakename:20130315180553j:plain

※参考画像では、ステータスにblockingが出てます。これはchrome内の空きスレッドがなくてコネクションの再利用待ち状態らしいです。詳しくは調べてないですが、異常ではなさそう。

mod_deflateでDLサイズ圧縮

KeepAliveだけでやたら速くなりましたが、それでもダッシュボード取るのに8sぐらいかかってます。
次はどうしようかなーと見てたら、こんなリクエストが目につきました。
f:id:paty_fakename:20130315175040j:plain

おいおい、672Kbとか大きいな。ほぼDLするために1.92sもかかってるし。
他にもあれこれ取ってきてるため、総DLサイズは1.2Mb(ただしキャッシュ無しの数値)
いやー、これ圧縮したらけっこう幸せになれるんじゃないかな。
f:id:paty_fakename:20130315175043p:plain

てことで、mod_deflateでレスポンスを圧縮してみます。
設定はこんな感じ

<VirtualHost *:443>
  SetOutputFilter DEFLATE
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
  SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE application/rdf+xml
  ...
  ...
</VirtualHost>

ええ、この設定もほとんどあちこちのコピペなんです。mod_deflateで検索すればすぐわかる情報なので説明は割愛。
で、apacheを再起動してみると、463kbまで減った!さっきの大きい672Kbファイルも198Kbまで圧縮されてます。ついでにレスポンスも(キャッシュが効いてなければ)平均3sほど改善。キャッシュが効くとあまり効果が出ないですが、それでも悪くないなー。

f:id:paty_fakename:20130315175039j:plain

f:id:paty_fakename:20130315175035p:plain

ただしこれ、サーバ側で圧縮処理が走るのでCPU使用率が上がります。その辺はサーバ状況との相談になります。一概に圧縮すればいいってものじゃないのでご注意を。

とはいえ、これで12sもかかってたレスポンスを4s台まで改善することができました。
元がアレなんでなんともいえませんが、頑張った気がする。
今日のところはこの辺にして、また速度改善したら記事にしよっと。