YAPC::Asia 2009 二日目

快晴。

セッション内容

ちょっとメモが適当になってきてる感もありますが、こちらも備忘録的に記します。

DeNA loves Perl?

by tokiharu notoさん。DeNAはperlプログラマが100人程度いる為、社内にちょっとしたperlコミュニティがあるようなものこと。mobamailという携帯向けメール配信デーモンが一番興味が引かれたんで、主にその周りを。

  • きっかけ
    • もともとqmail, postfix
    • 動きがスロー、制御も難しい
    • 送信専用(受信なし)のSMTPサーバ開発
  • 機構
    • 送信時にDBにつっこむ(enqueue)する
    • 各携帯キャリア用のworkerがDB上の情報見て送信する
    • キャリアごとのパラメータが設定が出来る
      • 同時接続数設定
      • 接続インターバル
      • bang食らったあとのwait秒数
      • とかとか...
        *携帯以外(PCはdefaultのデーモンが送信する
  • パフォーマンス
    • docomo, au: 500,000 mail/h
    • softbank: 20,000 mail/h
  • 現在
    • mobamailを2台並列
    • そのさきにSIELLA ENGINE
    • SIELLA ENGINEやっぱり早い。
    • コストかかっても送信増やしたい場合は使ったほうがいい。

前職でSIELLA ENGINEにお世話になったことあります。自分の経験上でもやっぱり携帯メール送信は専用のエンジンに任せた方が効率はいいという感はいなめないですね。それでもmobamailのパフォーマンスは魅力的なので、どこかで使ってみたいです。

perl hacks on vim (by Mr. Lin You-An (c9s))

by c9s。資料分かりやすかったです。

  • ちゃんと使いこなさないとスゲー時間の無駄
  • %で対応の(、{の終点にいける
  • ~/.vim/syntax以下にいろいろつくってSyntax hilight使う
  • key binding使う
    • :h map.txt
  • FOLD使う。
    • :h folding
  • perltidy :set equalprg=perltidy
  • SQL:beautify
  • Data::Dumperでリバースエンジニアリングできるかも
  • plugin使え
    • perlprove.vim
    • xml.vim, FuzzyFinder.vim DB::Ext.vim,
  • Vimmanaでvim scriptを管理する
    • cpan Vimana (by c9s)

自分全然vim使えてないなーと思いました。要修行。

mixi画像配信

by kazeburoさん。WEB+DB PRESS vol.50にも詳しい説明あるらしい。

  • コンテンツ系(広告系の画像)
    • 1000枚くらいなんで、各台にrsyncで同期
  • ユーザコンテンツ画像がめっちゃ多い。
    • ImageCluster
      • 自作の画像クラスタ
      • 画像受付、コンテンツと画像のマッピングをDBに格納、裏のApacheサーバに送って格納(2台1組)
      • Squidの多重キャッシュとマッピングを参照するアプリサーバ
    • MogileFSと比較して
      • Pros
        • 実装の理解
        • ストレージ障害時の復旧が明確
      • Cons
        • JPEG only
        • 手作業がおおい(サーバ追加、復旧)
        • 2台以上の冗長性
  • モバイル画像
    • モバイルのアクセス73%(150億PV)
    • 画像は動的生成
      • Apacheのリバースプロキシ間でコンバータを挟んでいる
      • perlで画像操作
        • 速度比較 -> Image::Imlib2が最速
        • Epegはサムネイル用なので、画像荒い。
      • まとめ
        • Speed: Epeg > Imlib2 > Imager >>> Image::Magick
        • Quality: Image::Magick > Imlib2 >>> Epeg
        • 最終的にImlib2でFix
      • Image::JpegCheck, Image::Size
      • mobileのconverterと裏のApacheの高速化
        • WWW::Curl >>> LWP
  • 質問
    • 画像認証は、URLをハッシュとタイムスタンプから自動生成で短期間限定(画像にリクエストあるたび)
    • URLを他に渡しても見れない

モバイル画像が動的配信というのはビックリでしたがパフォーマンス出てるとのこと。リサイズ・サムネイルした画像をストアしなくて済むのは容量削減にもなるので、参考になりそうです。階層型のSquidとかいいよなー。てかまずは一階層導入から。

Perlbal Tutorial (by takatsugu Shigeta)

by Takatsugu Shigetaさん。Perlbalチュートリアル。

  • singlethreaded event-based
  • cacheサーバ(squid)を前に立てて、その後ろにPerlbalおくといい
  • roles
    • reverse_proxy
      • role = reverse_proxy
      • ノードのリストを別ファイルに書き出すこともできる
    • web_server
      • role = web_server
    • management
      • role = management
      • telnetでアクセスすると色々管理できる
      • 設定確認、動作確認が出来る
      • perlbal再起動要らない -> 設定ファイルには反映されない
      • see also document @ six apart
    • selecteor
      • role = selector
      • plugin = vhosts
    • upload_tracker
  • squid + perlbal同居させてるけど大丈夫
  • AnyEvent対応した

confファイルのincludeが出来るようになっていること、managementのroleは今回初めて知りましたー。

Asynchronous Programming for (A)synchronous Communication

by malaさん。非同期処理の重要さなどについて、概念的なところから実際のモジュールまでハイペースのプレゼンでした。

  • AnyEvent, coroがいけてる
    • poll, epoll(linux), kqueue(bsd)
      • 非同期処理:AnyEvent
      • 継続(状態の維持):Coro
        • session維持とは別
        • スレッドの切り替え
        • ディスクI/Oの停止と再開
        • 他言語でも機構、アプローチがある。
      • 非同期処理にはジョブ、キューの機構が相性がいい
        • Q4M
        • POEよりAnyEventがパフォーマンスよい
      • Coro::Mysql!
        • Coroモジュール内に色々Utilあり
      • お勧めはAnyEvent::HTTP or Coro::LWP
      • Guard
  • WebHooks
  • Multicast Massage Queue
  • lighhttpd + FastCGI + AnyEvent + MMQ

非同期処理が負荷対策やチューニングに必要ということと、具体的にperlだとどう実装できるのかというのがざっくり知れました。すごい難しそうだという先入観あったんですが(まあ、実際やってみたら難しいんだろうけど)、全く分からないよりイメージが沸いたのが良かったなと思います。

はてなブックマークのシステムについて

by naoyaさん。はてなブックマークについて。

  • C++
    • perlよりパフォーマンス出したいときにC++で書いた
  • Thrift
    • perlからXML, JSON等でアクセスする。
    • facebooks開発
  • 中で使われているアルゴリズムとその実装について説明がありました。適材適所でC++で書いて、Thriftでperlとやりとりとか初めて知りました。あと関係ないけど、hibomaとnaoyaさん声激似。やっぱり兄弟ってすごいすねー。

    そのほか

    昼休み中yusukebeさんと話す機会がありました。

    • LTのとり2連チャン(当日決定)で疲れてる様子。おつかれさまです。
    • 俺も81世代なんで今年の忘年会楽しみにしてます。

    感想

    • 非同期・並列処理が流行ってる。アプリはもちろん、インフラもノウハウ得て対応しないと。
    • 熱いConferenceでした。内容ももちろんなんだけどそれよりなにより
    • コミュニティとスピーカーの情熱に触れることが出来て、色々と感化されました。
    • Perlって楽しい言語だなー。ホント上から下までって感じ。

    スタッフの皆さん、スピーカーの皆さん、お疲れ様でした。ありがとうございました。

    YAPC::Asia 2009 一日目

    カンファレンスとか勉強会といった類のものには今までまったく縁がなかったperlが書けないサーバエンジニアのYAPC初参加レポートです。セッションの内容は書いてある他にももちろん色々ありましたが、このエントリの内容はミドルウェア周りに偏りあります。あしからず。

    本日のセッション

    セッションのメモから備忘録的に書いていきます。

    prettyfs 分散ファイルストレージ

    by fushiharaさん。ストレージシステム、prettyfsについて。fushiharaさんが開発中だということをmizzyさん経由で聞きまして、内容にすごく興味があったの行ってきました。

    • ストレージの実装例
      • livedoor apache+mod_perlで実装 -> 4Gbps?
      • amazon S3もあるよね
      • MogileFS
    • MogileFSのパフォーマンス向上の為
      • X-REPROXY-CACHE-FORヘッダ
    • mogilefsの不満点
      • 同じキーのデータ更新で、storeのURLが変わる
        • X-REPROXY-CACHE-FORが微妙
      • class, deviceの概念が無駄に複雑
      • 運用処理の動作が不安定(均等化、store毎コピー)
    • prettyfsの特徴
      • 1hostに一対以上のtracker, storaが動く前提
      • trackerがreverse proxyとしても動く
      • db層を抽象化してあるので、RDBMSを使うこともKVSを使うことも出来る
      • ファイルコピー数も指定できる
      • ファイル登録
        • content-typeも同時に登録できる
        • workerも抽象化してあるのでqueueに何を使うか指定できる
        • URLが更新されない
      • 運用
        • mogilefs+α
        • 足りないところを補う
    • 今後の展望
      • trackerをplack
      • webベースの管理

    ストレージシステムをHTTPみたいな疎なプロトコルでやりとりするよう作るのは、結構セオリーぽいですね。pretyfsもそうだし、この後のmixiのセッションもそうだった。prettyfsは、他のRDBMSや、KVSを使用できるというのがイケてますね。実際のファイル格納のキューシステムも色々選べるということでさらに素敵。

    CPAN::PackagerによるRPM/Debの自動生成 (Build packages with CPAN::Packager)‎

    by dannさん。CPANモジュールをrpm/debパッケージングするCPAN::Packagerの紹介。前からあるのはcpan2fluteとか。ちなみに私もこないだ担当したサービスでcpanのrpm化しましたが、その時ははてなcpan-dependencyでガッツリ作成しました。こちらも素敵です。

    • 概要
      • 依存関係を再帰的に解決
      • cpanflute2, dh-make-perl
        • 依存関係を解決してくれない
      • CPANPLUS::Dist::{Deb,RPM}
        • 依存関係の解決が1段階(再帰的ではない)
        • 依存関係が間違っているケースも手動で修正が行えない
    • 要件
      • 依存関係を再帰的に解決
      • 手動で既存モジュールのFix
    • 特徴
      • モジュールの依存関係を再帰的に解決
      • パッケージング間違いは手動で修正可
      • 壊れすぎているものはビルドスキップ
    • 使い方
      • sudo cpan-packager --module Moose --builder RPM --conf conf/config.yaml
      • 設定ファイル
        • see yaml (設定のスコープは2種類)
        • global:
        • modules:

    CPAN::Packager自体が依存関係が多いというツッコミが質問時にあがってました。CPANPLUSの依存が結構でかいとのことで、確かに導入の敷居が高いかもしれないですね。コミッタさんが、rpm, debをビルドして、すぐ使えるように提供すると言ってたのでちょっと待ってると幸せになれるかも。demoを見た限りだと動作的にはすごくよさそうなので今度使ってみようと思います。

    『Ficia』インフラとPerlにまつわるエトセトラ

    by hirose31さんのFiciaのセッション。

    • mod_perl
      • Linux 2.6.29.X
      • Apache 2.2.X (Prefork)
      • mod_perl 2.0.4
    • 計測
      • ps, topでざっくりと負荷は分かる
      • fork(2) - Copy on Write
      • 親との共有領域と固有領域
      • /proc/PID/smaps
      • 共有領域 = Shared_Clean + Shared_Dirty
      • 時間が経つと固有領域が増える。実メモリのサイズが太る
      • 子プロセスが、後でロードしたモジュール分
      • 親プロセスでロードさせるとそこから出来る子プロセスは即戦力
      • PerlResponseHandler Apach2::Status
      • PerlPostConfigRequire startup.pl
      • Apache2::Status + B::TerseSize -> Webからモジュール一覧とメモリサイズ分かる
    • パラメータ調整
      • httpd.conf
      • {Start,{Min,Max}Spare}Server, MaxClient
      • smapの結果 + 搭載メモリ
      • 「swapしたら負けかなと思ってる」
      • 全部同じにして、起動時に一気にfork(2)する
      • 立ち上げ時と負荷時のプロセス数が同じ
      • 起動したてに大量リクエストがこないようにするのがポイント
      • forkはリソースを結構食うのでダウンしかねない
    • MATRIX
      • 構成管理情報一元管理
      • テキスト形式
      • ミドルウェアの設定ファイル等をここから自動生成する

    mod_perlのプロセスのforkにリソースがかかるので、閾値を見極めて最初からモジュールを読み込んだ親プロセスをギリギリまでいっぱい作っておくとピーク時も安心というのは、目からうろこでした。大体ここら辺のパラメータって最初はおっかなビックリでちょっとずつパラメータ上げていくという感じ多いと思うんですけど(自分もそういうとこある)、改めないと。

    懇親会

    prettyfsのfushiharaさんに、MogileFSの変な挙動とか、実際にprettyfsを導入していくときの運用の想定について話をうかがったり、makotokagaさんとpostgres周りの話したりでした。ワインでちょっち酔っ払った。