Author Archive

    はてなブックマーク - Apacheのmod_cacheを利用して静的コンテンツをキャッシュさせた話(追記あり)
    このエントリーをはてなブックマークに追加

    Fusic 平田です。

    前のエントリの延長のようなそうでもない話です。

    あらすじ

    ある日「サーバがレスポンスをろくに返さない」と連絡があり、すわ障害発生かとおもむろにsshクライアントを立ち上げ、接続。
    この時点でよくあるのは

    • サーバがハングしていたりして接続できない
    • なんとか繋がるもののすごく重い・ロードアベレージが鬼のように高い
    • その他障害などでエラーが発生しているとかディスク障害が起きてるとかblog書いてる場合じゃない事態とか

    といったあたり(書いてる場合じゃない事態はそうそう起きません)なのですが。
    普通にssh接続できるし、dstatで眺めてもCPUなりメモリなりで刺さってるわけでもなし。
    はて。。。と思いつつ

    # tailf /var/log/httpd/access_log

    とかやってみると、滝のように流れまくるアクセスログ。

    「どうしてこうなった」はさておき、とにかく対応せないかんという話で。
    前のエントリの流れを汲むなら「よしvarnishでもさっくり突っ込んでキャッシュでぶん回して対処」といきたい1 んですが。

    で、アクセス状況をざっくり計測した感じだと

    • アクセスは特定の静的ページ(http://toaru-site.com/miwaku_no/contents/)に集中している
    • 特定の静的ページがいわゆるランディングページなので、何かしら宣伝なりを打った結果の一時的なアクセス集中だろう2

    といったあたりから、Apacheのmod_cacheで一時的に凌げる範疇だろうということで、さっくり設定を入れて対応してみました。

    1. キャッシュ設定を追加

    ※ OSはCentOS6で、Apacheは2.2.15です。
    /etc/httpd/conf.d/cache.confとして以下のファイルを作成。

    CacheRoot /tmp/cache
    CacheEnable disk /miwaku_no/contents
    CacheDirLevels 5
    CacheDirLength 3
    CacheIgnoreCacheControl On
    CacheIgnoreNoLastMod On

    のちapache再起動して、/tmp/cache以下にキャッシュファイルが作成されることと、対象ページのレスポンスが速くなることを確認。

    2. 他のパラメータを調整

    これでおおよそ大丈夫かなと思ったのですが、他の設定値を若干絞っていたりして、まだ動作がよろしくない。
    ということで、

    • Maxclientなどの値を、dstatで具合を見つつ増やす
    • KeepAliveをOff→Onに変更

    といったあたりを調整。

    3. キャッシュ設定を少し追加

    画像やCSSもキャッシュさせて、より負荷を下げるように調整。

    これでおおよそ安定して捌けるようになったので、この設定のまま1日様子見。
    のちアクセス具合も通常に戻ったので、設定を戻して事なきを得ました。

    てことで

    現状の構成をなるべく変えることなく、と言う観点で対応できたのは良かったのかなと。
    アクセスが集中しやすい箇所をあらかじめキャッシュさせるようにするなど、事前に戦略を練るべきではありましたが。。。

    追記

    cakephperさんからツッコミいただきました。
    ※ 回答としては、originサーバでの話です。

    言われてみれば若干腑に落ちないところもあるなー、ってことで実験。

    測ってみた

    手元のApache環境で、Cache設定あり/なしで、

    $ http_load -parallel 100 -seconds 10 ./miwaku_no_urllist

    てな感じで、100並列/10秒実行。
    実際にアクセス食らったページとおおよそ同様のページ/画像/他(計53リクエスト)で実験。

    ○ cacheなし

    $ http_load -parallel 100 -seconds 10 ./urllist 
    12186 fetches, 100 max parallel, 2.43872e+08 bytes, in 10 seconds
    20012.4 mean bytes/connection
    1218.6 fetches/sec, 2.43872e+07 bytes/sec
    msecs/connect: 0.119898 mean, 1.853 max, 0.046 min
    msecs/first-response: 81.5065 mean, 925.366 max, 1.622 min
    HTTP response codes:
      code 200 -- 12186

    ○ cacheあり

    $ http_load -parallel 100 -seconds 10 ./miwaku_no_urllist 
    15541 fetches, 100 max parallel, 3.18031e+08 bytes, in 10 seconds
    20464 mean bytes/connection
    1554.1 fetches/sec, 3.18031e+07 bytes/sec
    msecs/connect: 0.119447 mean, 6.493 max, 0.04 min
    msecs/first-response: 63.8984 mean, 988.844 max, 2.231 min
    HTTP response codes:
      code 200 -- 15541

    どちらも10回ほど実験してみて、結果としては

    • cacheなし:約11000~14000リクエスト
    • cacheあり:約14000~17000リクエスト

    てことで、平均すると25~30%程度のパフォーマンス向上が見られます。
    KeepAliveをOn/OffしたりMaxClientあたりをいじってみたりもしましたが、おおよそ同じような向上具合。
    静的コンテンツに対しても、一定の効果はあるようです。

    ついでなので

    varnish突っ込んで

    $ http_load -parallel 100 -seconds 10 ./miwaku_no_urllist_via_varnish

    というのもやってみました。

    ○ varnish

    $ http_load -parallel 100 -seconds 10 ./miwaku_no_urllist_via_varnish 
    65393 fetches, 100 max parallel, 1.35126e+09 bytes, in 10 seconds
    20663.7 mean bytes/connection
    6539.29 fetches/sec, 1.35126e+08 bytes/sec
    msecs/connect: 0.154726 mean, 6.537 max, 0.033 min
    msecs/first-response: 14.9211 mean, 44.383 max, 0.688 min
    HTTP response codes:
      code 200 -- 65393

    はやい。(小並感)

    1. 実際、その選択肢もなくはなかった。 []
    2. 対応する傍らで関係各位に確認した結果、やはりそういった類のアクセス集中だったようで。 []
      はてなブックマーク - ITインフラ勉強会@福岡でISUCONの予習をしてきました
      このエントリーをはてなブックマークに追加

      Fusic 平田です。
      会社で「ISUCONがんばる」って言っちゃったので、仕事の合間をぬってITインフラ勉強会に参加してきました。
      fukinfra.doorkeeper.jp/events/5367

      他の方のエントリは以下。
      第6回ITインフラ勉強会@福岡に参加してきました。 – 肉まん始めました
      【福岡】インフラ勉強会で ISUCON を疑似体験してきました。 – komiyakの通り道
      第6回 ITインフラ勉強会@福岡 (ISUCON夏期講習のAMIで、もくもくチューニング)を開催しました – まつざきの技術メモ

      1時間ほど遅刻して着いてみたら既に2チームのvsが進行していたので、ひとりチームでもくもくチューニングしてましたすみませんすみませんすみません。

      以下ざっくりやったこと。
      HeigiSQLでexplain結果眺めながら、MySQLのインデックスをぺたぺた
      ・ログとdstatの結果を流しつつ各ページの動きを確認
      ・/ticket/の描画とソースみてこりゃ重いなーと思って、普段使ってるとおりvarnishを突っ込む
      vclは↓くらいで、単にpost来たらキャッシュ消すくらいで。
      ※ リクエスト眺めていたらpostが連続で来てたりもしていたので、キャッシュの運用についてはもっと賢いやり方があるだろうなーと思いつつ。

      backend default {
        .host = "127.0.0.1";
        .port = "6000";
      }
      sub vcl_recv {
          if (req.request == "POST") {
              ban("req.url ~ /");
              return (pass);
          }
          elseif (req.request != "GET") {
              return (pass);
          } else {
              return (lookup);
          }
      }

      ・dstatで見る限りアプリ側に余裕が見られたので、starmanのworkerを30まで増やす
      ・メモリよりI/Oのほうがきつそうだったので、varnishのキャッシュ先をファイルからメモリに変更
      → /etc/sysconfig/varnish内で「VARNISH_STORAGE=”malloc,4G”」と変更
      ・たまに計測がこけて、理由が/admin/order.csvのデータの中身の不整合だったので、order.csvへのリクエストはキャッシュしないよう変更
      ・POSTをもっとさばくために、/admin/set_cacheという別アクションでキャッシュ作ったのち、/buyの処理をキャッシュで軽減できるように修正
      → の途上で時間切れ
      とあいなりました。

      で、結果としては

      とスコア11万程度までは減りました。
      計測具合からvarnish導入で一気にスコア減るだろうなーというのは予測通りでしたが、DBのチューニング具合やアプリ改修具合については全然足りていなかったですね。
      計測する→どうする、の「どうする」武器をいろいろ持っておかねば、というのが喫緊の課題です。

      参加していた方々の話を聞いていると
      ・MySQLのチューニングをカリカリやっていた方
      ・カーネルパラメータなど見直していた方
      ・Webサーバの入れ替え検討とか、検討はともかくApache入れるぜ!とか
      などと、やっぱり人によって狙いが違うなーというのが面白かったです。

      で、第3回ISUCONの予選が10/5,10/6と決まりまして。
      さっそくFulab(Fusic x nulab)なチームで登録しております。
      isucon2013.kayac.com/qualifier_round/2
      参加される方々が(自チームの他お二人含め)非常に強力でどうしたもんかとプルプルしておりますが、どうか皆様お手柔らかにお願いいたします。。。

        はてなブックマーク - RTX810とWindows7の標準VPNクライアントでL2TP/IPSecを利用する
        このエントリーをはてなブックマークに追加

        Fusic 平田です。
        ルータ買い換えの夏、というわけではないんですが。
        YAMAHA RTX810でL2TP/IPSecを試してみました、という話です。
        一旦社内ネットワークでオレオレVPNを組んで、接続できるかどうかを実験。

        YAMAHAの公式に
        > ※Microsoft社製Windows OSのL2TP/IPsec接続はサポートしません。
        と書かれててどうしたもんかと思ったのですが、なんとか接続できました。

        参考にしたのは以下。

        www.rtpro.yamaha.co.jp/RT/docs/l2tp_ipsec/index.html#setting3

        shirangana.info/115/?page_id=174

        support.microsoft.com/kb/926179/ja

        とりあえずルータ側の設定晒し。
        上位ルータ: 172.16.0.1
        WAN側ルータIPアドレス: 172.16.0.101/16
        LAN側ルータIPアドレス: 192.168.100.1

        # RTX810 Rev.11.01.06 (Tue Apr 10 07:09:02 2012)
        # MAC Address : 00:a0:de:80:a0:0e, 00:a0:de:80:a0:0f
        # Memory 128Mbytes, 2LAN
        # main:  RTX810 ver=00 serial=S3K013283 MAC-Address=00:a0:de:80:a0:0e MAC-Addre
        ss=00:a0:de:80:a0:0f
        # Reporting Date: Aug 9 11:46:20 2012
        administrator password *
        login user sshuser *
        ip route default gateway 172.16.0.1
        ip keepalive 1 icmp-echo 10 5 192.168.100.1
        ip lan1 address 192.168.100.1/24
        ip lan1 proxyarp on
        ip lan2 address 172.16.0.101/16
        ip lan2 secure filter out 101099
        ip lan2 nat descriptor 200
        provider lan1 name LAN:
        provider lan2 name PRV/0/1/0/0/0/0:
        pp select anonymous
         pp bind tunnel1
         pp auth request mschap-v2
         pp auth username l2tp_user *
         ppp ipcp ipaddress on
         ppp ipcp msext on
         ip pp remote address pool dhcp
         ip pp mtu 1258
         pp enable anonymous
        tunnel select 1
         tunnel encapsulation l2tp
         ipsec tunnel 1
          ipsec sa policy 1 1 esp aes-cbc sha-hmac
          ipsec ike keepalive log 1 off
          ipsec ike keepalive use 1 off
          ipsec ike nat-traversal 1 on
          ipsec ike pre-shared-key 1 *
          ipsec ike remote address 1 any
         l2tp tunnel auth off
         l2tp tunnel disconnect time off
         l2tp keepalive use on
         ip tunnel tcp mss limit auto
         tunnel enable 1
        nat descriptor type 200 masquerade
        nat descriptor address outer 200 primary
        nat descriptor masquerade static 200 1 192.168.100.1 udp 1701
        nat descriptor masquerade static 200 2 192.168.100.1 udp 500
        nat descriptor masquerade static 200 3 192.168.100.1 esp
        nat descriptor masquerade static 200 4 192.168.100.1 udp 4500
        ipsec auto refresh on
        ipsec transport 1 1 udp 1701
        dhcp service server
        dhcp server rfc2131 compliant except remain-silent
        dhcp scope 1 192.168.100.2-192.168.100.191/24
        dns server 172.16.0.1
        dns private address spoof on
        l2tp service on
        httpd host lan1
        sshd service on
        sshd host key generate *

        ルータ側設定の要点は以下の通り。

        # RTX810 Rev.11.01.06 (Tue Apr 10 07:09:02 2012)

        ファーム上げないとNATトラバーサル使えないので。

        ipsec ike nat-traversal 1 on

        NATトラバーサルを有効に。
        # GUIの管理画面では設定できないので、コマンドで。

        nat descriptor masquerade static 200 4 192.168.100.1 udp 4500

        NATトラバーサルではESPの代わりにUDPの4500番を使用するので、IKEで使われるUDPの500番と同時にUDPの4500番を静的IPマスカレードで設定。

        クライアント(Win7)側も、NATトラバーサルを有効に。

        support.microsoft.com/kb/926179/ja

        を参考にして、「AssumeUDPEncapsulationContextOnSendRule」を2としたレジストリを追加して再起動。

        あとは普通にWin7のVPN接続設定でL2TP/IPSecを選んだらうまくいきました。



        ついでにiPhoneも。



        まだこれからいろいろ手を加えていく予定ですが、とりあえず何かの参考になれば幸いです。まる。