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周りの話したりでした。ワインでちょっち酔っ払った。