『ひみつの階段』紺野キタ
少し前に書いた日記のブクマコメントで、こちらも良いと言ってらしたので買ってみた (他にも数冊買った、徐々に読むつもり)。
まだ2の途中なのだけれど、こちらのシリーズも心の底からじわっと沸いてくるものがあって、素敵だ。ある種、こういう、心から感じられるものには、いくらか共通点があり、例えば、本作で「ヨソイキの服」と「ひとすくいのきれいな水」というフレーズがでてくるが、それぞれ僕が好きな「よそ行きに着替えておいでよ (Good Dog Happy Men)」というフレーズや BURGER NUDS のテーマである「冷たい水」を想起してリンクするし、あるいは、この作品は古い寄宿舎が舞台だけれども、古い何かしらに感じる、ある種の懐しさみたいなのが良く滲みでていて、これを読みとるときの感覚というのは、神社を巡って、スッっと心穏かになるときと一緒なのだ。
人と違う行動や
秘境を巡る旅ばかりが
冒険じゃないと思うんだ
というのが出てきて、正確な世界の捉えかただと深く思った。
関連エントリー
- 『夜の童話』紺野キタ 夜の童話 (バーズコミックス) cho45 紺野 キタ ★ 3.0 / 5.0 cho45 これもまた大変良かった…… 何度も読みかえすだろ...
- 今年 子ども関係で買ったもの 先にまとめておくと、おむつの支出が支配的で、それ以外だと直接子ども用のものをあんまり買ってない。絵本とかをあんまり買ってない気がする。 おし...
- Elecraft KX3 での初交信 8月1日に注文 8月9日に届いて組み立て TSSに申請 9月5日に保証 総通に申請 9月10日に総通審査終了 9月11日に免許状と証票受取 ...
- EOS R6 Mark II+ EF-EOS R を買った 2017年4月からSONY α7R+SIGMA MC-11 を使っていたが、思い立ってキヤノンに戻ることにした。 αはコストパフォーマンスも...
- SIGMA MC-11 + α7R II でいろいろ試す SIGMA シグマ EF-E用 キヤノン⇔ソニーEマウント マウントコンバーター MC-11 フルサイズ 一眼レフ ミラーレス cho45 ...
✖
✖
gerry++
✖
Starman や Starlet で Apache の mod_status 相当の情報を得られるようにする
最近リリースされた Hatena::Let (ラボ) や、1年ぐらい前にリリースしたはてなコピィ (ラボ) は PSGI を喋るように対応した Ridge (はてな社内フレームワーク) を使っています。 (過程で Plack を利用させてもらっています)。今のところは現状それぞれ、let は Starman, copie は mod_perl2 で動いています (copie も mod_perl2 でなくす予定です)。
他のサービスに導入してみて実際のところどれほど嬉しいことがあるのか未知数なため、とりあえずやってみて測定してみる方針にしました (PSGI を喋れるようにしておかないと、そもそも選択肢がないので)。が、実際 production 環境に投入してみようとすると Apache の mod_status 相当の情報を得られることが運用上必須であるとのことだったので、PSGI 実装の Starman, Starlet においてその機能を実現する方法を考えて実装してみました。
本家に取り込める類のものなのかなんとも言えないので、fork してあります。
- http://github.com/cho45/Starman/tree/server-status
- http://github.com/cho45/Starlet/tree/server-status
概要
ps の表示に各ワーカープロセスが何をやっているか、具体的には以下のような情報を表示するようになっています。
- リクエスト処理数
- 状態 (Read=R, Write=W, Wait=_)
- クライアントIPアドレス
- リクエストメソッド
- リクエストパス
- プロトコル
$ ps | grep server-status 47167 7.8 0.4 S+ 0:00.15 server-status[let] (req=2) R ? 47164 0.0 0.5 S+ 0:00.35 server-status[let] (req=2) _ 127.0.0.1 local.hatena.ne.jp:5000 GET /debug_toolbar/jquery.js HTTP/1.1 47163 0.0 0.5 S+ 0:00.34 server-status[let] (req=2) _ 127.0.0.1 local.hatena.ne.jp:5000 GET /favicon.ico HTTP/1.1 47162 0.0 0.1 S+ 0:00.01 server-status[let] (req=1) _ 127.0.0.1 local.hatena.ne.jp:5000 GET /debug_toolbar/information.gif HTTP/1.1 47161 0.0 0.1 S+ 0:00.02 server-status[let] (req=1) _ 127.0.0.1 local.hatena.ne.jp:5000 GET /debug_toolbar/jquery.js HTTP/1.1 47170 0.0 0.1 S+ 0:00.01 server-status[let] (req=1) _ 127.0.0.1 local.hatena.ne.jp:5000 GET /debug_toolbar/toolbar.min.css HTTP/1.1 47169 0.0 0.3 S+ 0:00.08 server-status[let] (req=1) _ 127.0.0.1 local.hatena.ne.jp:5000 GET /favicon.ico HTTP/1.1 47168 0.0 0.5 S+ 0:00.28 server-status[let] (req=2) _ 127.0.0.1 local.hatena.ne.jp:5000 GET /debug_toolbar/toolbar.min.css HTTP/1.1 47166 0.0 0.1 S+ 0:00.04 server-status[let] (req=2) _ 127.0.0.1 local.hatena.ne.jp:5000 GET /debug_toolbar/toolbar.min.js HTTP/1.1 47165 0.0 0.3 S+ 0:00.07 server-status[let] (req=1) _ 127.0.0.1 local.hatena.ne.jp:5000 GET /favicon.ico HTTP/1.1
これらの情報により、「なんかバックエンドの調子がおかしい」という場合に、原因究明の指標が増えます。
- ワーカープロセスを全て使いきっているかいないか
- 使いきっているなら、worker を増やすか、アプリサーバを増やす必要がある
- リクエスト処理数が多いプロセスのメモリ使用量が著しく多くないか
- リークしている可能性があるので、リークをなおすか max reqs/child を小さくする必要がある
- どこか特定のリクエストで詰まっていないか
- 地雷リクエストを迅速に発見し対処
などです。アクセスログ解析で解ることもありますが、実際処理しているのがリアルタイムで解るのは多少安心感があります。
Plack::Middleware::ServerStatus
また、mod_status のように http 経由で見れるよう、/server-status を奪ってハンドリングする Middleware も一緒に書きました。これは単に ps の結果をパースして統計をとって出力しているだけです。(ミドルウェアとして実装すべきものなのか微妙な気もしますがこのほうが便利なので)
- /server-status
- /server-status?auto (mod_status のように機械可読なフォーマット)
に表示するようになっています。
パフォーマンス
この機能追加でのパフォーマンスの劣化を測定しておきます。ついでに、mod_perl2 も含めた実際のところのベンチもとっておきます。
手元の MacBook 2.4G Core 2 Duo でサーバも ab も動かし、何度か測定して最速の結果を出しています。
とりあえず、最高速がでると思われる Starman (keep-alive) で ab してみます。
ab -c 10 -t 1 -k http://127.0.0.1:5000/
# Starman (master: c1a991a) perl -Ilib bin/starman --workers 10 ~/project/Plack/eg/dot-psgi/Hello.psgi Requests per second: 7079.76 [#/sec] (mean)
# Starman (server-status: 7b4430d) SERVER_STATUS_CLASS=hello starman --workers 10 ~/project/Plack/eg/dot-psgi/Hello.psgi Requests per second: 6812.11 [#/sec] (mean)
この処理を挟んだことによる多少のパフォーマンス劣化は残念ながら避けられません。(SERVER_STATUS_CLASS を定義しない場合は処理をしないため元のパフォーマンスがでます)
実際使うのは必ず Apache の reverse proxy の裏なので keep-alive をオフにしてみます。(Starman のデフォルトを参考に、1ワーカープロセスあたりのリクエスト数を 1000 にあわせています)
ab -c 10 -t 1 http://127.0.0.1:5000/
# Starman (master: c1a991a) perl -Ilib bin/starman --workers 10 ~/project/Plack/eg/dot-psgi/Hello.psgi --disable-keepalive Requests per second: 2889.89 [#/sec] (mean)
# Starman (server-status: 7b4430d) SERVER_STATUS_CLASS=hello starman --workers 10 ~/project/Plack/eg/dot-psgi/Hello.psgi --disable-keepalive Requests per second: 2805.02 [#/sec] (mean)
# Starlet (master: c3100dd) PLACK_ENV=production perl -Ilib =plackup -s Starlet -p 5000 --max-workers=10 ~/project/Plack/eg/dot-psgi/Hello.psgi --max-reqs-per-child 1000 Requests per second: 2645.74 [#/sec] (mean)
# Starlet (server-status: 68608ef) PLACK_ENV=production SERVER_STATUS_CLASS=let perl -Ilib =plackup -s Starlet -p 5000 --max-workers=10 ~/project/Plack/eg/dot-psgi/Hello.psgi --max-reqs-per-child 1000 Requests per second: 2533.56 [#/sec] (mean)
# mod_perl2 MaxRequestsPerChild=1000 (http://gist.github.com/412767 ) Requests per second: 2975.45 [#/sec] (mean)
このケースだと mod_perl2 > Starman > Starlet になっています。
さらに、1つのワーカプロセスが処理するリクエストの数を減らしてみます。
実際のところ、この値を少なくせざるを得ないケース (=メモリリークしてる) が多々あり、安定性重視のため、128 ぐらいに設定されていたりします。
# Starman (master: c1a991a) perl -Ilib bin/starman --workers 10 ~/project/Plack/eg/dot-psgi/Hello.psgi --disable-keepalive --max-requests 128 Requests per second: 2320.12 [#/sec] (mean)
# Starman (server-status: 7b4430d) SERVER_STATUS_CLASS=hello starman --workers 10 ~/project/Plack/eg/dot-psgi/Hello.psgi --disable-keepalive --max-requests 128 Requests per second: 2319.89 [#/sec] (mean)
# Starlet (master: c3100dd) PLACK_ENV=production perl -Ilib =plackup -s Starlet -p 5000 --max-workers=10 ~/project/Plack/eg/dot-psgi/Hello.psgi --max-reqs-per-child 128 Requests per second: 2309.88 [#/sec] (mean)
# Starlet (server-status: 68608ef) PLACK_ENV=production SERVER_STATUS_CLASS=let perl -Ilib =plackup -s Starlet -p 5000 --max-workers=10 ~/project/Plack/eg/dot-psgi/Hello.psgi --max-reqs-per-child 128 Requests per second: 2250.82 [#/sec] (mean)
# mod_perl2 MaxRequestsPerChild=128 Requests per second: 898.81 [#/sec] (mean)
このケースだと Starman >= Starlet > mod_perl2 になっています。
mod_perl2 は fork のコストが多大なのか MaxRequestsPerChild を低くすると急激にパフォーマンスが劣化しました。
✖
✖
雨の日こそ外に出ようと思い、歩きで平野神社・北野天満宮へ。写真を撮るのは大変だけれど、雨の中歩くのは、なかなか楽しくて良い (靴と足がずぶ濡れになってしまった)。ポンチョとカメラにかけるレインコートが欲しいところ。雨の中で初めて発見できるものは思いのほか多い。カメラはタオルをかけながら持ち運びました。
関連エントリー
- ✖ 平野神社 → 北野天満宮 → 天龍寺 → 嵐山竹林
- ✖ 龍安寺 → 平野神社 → 北野天満宮 35mm をつけて出掛けたけれど、途中から 100mm に変えた。
- ✖ 部屋の掃除とかをした。 でかけようと思ったら、自転車がパンクしていたので、ひっぱって自転車屋までいった。割と遠くて疲れた。たてこんでいて時間...
- ✖ 神社はだいたいどこも、新年の準備をしていた。年の初めは実家に帰っているので京都の神社は巡れないが、境内に人がいっぱいになるのを想像して帰って...
- ✖ 平野神社・北野天満宮にいき、そのまま嵐山までいこうと思って自転車をこいでいたけれど、途中で右目にゴミが入りまぶたが開けられなくなり、それどこ...
TODO
- 靴を買う
- ポンチョを買う
- インフラ費の支払いをする
















