2015/02/16

PSGI Server がリクエストボディをどうしているのか知りたくなったので…

背景

諸般の事情により(お察しください)、巨大なファイル(おおむね2GB以上)が HTTP で POST された場合に、PSGIでどのように処理されるのかを調べてみましたよ。
観点としては、PSGIより下のレイヤー(PSGI server)でリクエストボディをどのように扱っているのかを調査。全体をバッファリングしてしまうのか、またボディの読み込みを遅延(あるいは拒否)できるのかを確認した。

また、想定しているシステムの temp 領域がかなり小さいということもあって、PSGI app の中で HTTP ヘッダの内容にもとづいてボディの扱いを変えたい(指定したディスクにバッファリングするのか、それともそもそもボディを無視するのか)。そのため、バッファリングが遅延できるようになっていると嬉しい。

結論

総じていうと、 Stream::Buffered を使って事前にリクエストボディ全体をバッファリングしてしまう方法がスタンダード。(Starman から発祥し、Starletで固められたコードが決定版的な扱いになっている)

Stream::Buffered の挙動として、デフォルトでは 1MB まではメモリにバッファし、それ以上は tempfile に書き出してバッファリングするようになっている。($Stream::Buffered::MaxMemoryBufferSize で調整可能)

PSGI app が呼ばれる前にバッファリングされてしまうので、メモリかディスクにボディ全体が一度保存されるのは避けられない模様(´・ω・`)

以下、それぞれの実装の該当箇所への参照とメモ↓

Starman

このあたり↓

Plack::TempBuffer を使っているけど、現在 Plack::TempBuffer は Stream::Buffered のエイリアスになっているため上述の挙動となる。

Starlet

このあたり↓

Plack::TempBuffer を利用。Starman とだいたい同じ。

Monoceros

このあたり↓

Plack::TempBuffer を利用。Starman とだいたい同じ、というか Starlet のコードをそのまま使ってますね。

Stream::Buffered を利用。Stream::Buffered を使っている以外は、ほぼ Starlet のコードそのまま。 

Twiggy

このあたり↓

PerlIOを利用して、すべてオンメモリにバッファリングしている。
ちなみに、リクエストの chunked エンコーディングには対応していないようだ(´・ω・`)

Feersum

や、やばい…何やってるのか全然理解できない…
タンさんのコードが天才的すぎるのか…((((;゚Д゚))))

追記: AnyEvent::HTTPD

ついでに AnyEvent::HTTPD も読んでみた。このへん↓
https://metacpan.org/source/AnyEvent::HTTPD::HTTPConnection#L352

Content-length 分だけ丸っとメモリに読み込んでいますね。
ちなみに、chunked エンコーディングには対応していない様子。

他にも読むべき PSGI Server があったら教えてください><

2013/09/25

YAPC::Asia Tokyo 2013 に行ってきたので、Log::Minimal::Indent というモジュールを公開したという話


2年ぶりに YAPC::Asia Tokyo に参加してきました!

一時は参加も危ぶまれましたが、皆さまのお力添えもあって、無事に参加することができました。ありがとうございましたm(_ _)m

また、YAPCに関わっていたすべての皆様、お疲れ様でした><!

……というのが既に先週末で、時すでに水曜日というこの体たらくなわけですが、

というわけで、ブログ書きますよ><!

2012/10/30

Surfaceのファーストインプレッションをまとめたので…

 いきおいに任せてSurfaceを買ってしまいましたよっと。

 「周辺機器メーカー勤務者たるもの、つねに新しいものにふれて勉強しないとね!」などという言い訳をしつつ、発売日に購入してしまいました。断っておきますが、ちゃんと自腹です。だって、自腹じゃないと胸を張って人に自慢できないし、自腹ならずっと自分が使っていても誰に気兼ねすることもありませんしね!

 というわけで、Surface開封の儀から、リアルタイムでつぶやいていたツイートをまとめ代わりに貼っておきますよっと。

2012/09/10

QemuでARM上にDebianをインストールしたので…

 諸般の事情で、ARMの実行環境が欲しくなったので、Qemuを使ってARM上のDebian Linux環境を用意しましたよ。

 基本的な方法としては、Qemuを使ってDebianのネットブートインストーラを使うだけなんだけど、ところどころハマったので、自分用にメモっときますよ。
というわけで、以下メモ。

教訓1: MacじゃなくてUbuntuを使う

2012/03/11

未踏カンファレンス2012でスポンサーとしてLTしてきたので…

 3/10(土)に開催された未踏カンファレンス2012に飛び入り参加してきました。
企画・運営されていた皆さん、本当にお疲れ様でした。素晴らしいイベントをありがとうございます><!

 弊社メルコホールディングスもスポンサーとして協力させていただいておりまして、スポンサー枠ということでスピーチ(LT)してきました。発表スライドはこちらです↓

 事前に人事の現場の人(今回お金出してるのは人事)には「時間もないし、好き勝手にやらせてもらいますから( ・`ω・´)!」と言っておいたのですが、よもや当日、人事部長が来ることになっているとはいざ知らず、でもLTの内容を変えるわけにもいかず「えいやっ(゚д゚)」っとやってしまいましたw(スライドの中で「そこの人事の偉い人」と言っているのは、部長のことです)

 で、しゃべったあとに「好き勝手に言っちゃってスンマセン │・ω・;)」って謝りに行ったら「いいよ いいよ〜」って軽く流してくれたので、結果オーライですた(・∀・)!

本心をお話ししたつもりです

 プログラミング系のカンファレンスに出かけると、やっぱり、企業の方は皆さん、「プログラマ募集中です」とか「入社してください」とか発表に付け加えてて、それを半ばネタにしたりする発表も時折ありますよね。今回のパネルディスカッション中にも、そんな"お約束"なシーンがありました。

 でも個人的には、そういっていらっしゃるエンジニアの皆さんから、何というか、今ひとつ本気を感じることができないときがあったのです。

 それが悪いと言っているわけではありません。もちろん、お金や発表者を送り込んでいる企業としてはリクルーティングが最大の目的でしょうし、現場の人間の視点から見てみても、人手が増えるのは助かるし優秀な人が入ってくれるのは大歓迎ですから。たとえば自分がエンジニアとして登壇してときのことを想像しても、会社から何も言われていなかったとしても、一言「ウチはイイトコ、一度はおいで!」と言わない積極的な理由はないわけです。

 でも、「入社してくださいね」という一言が、本当に自分が伝えたい事なのかな?そんなことを会場で考えながら、スライドを作っていました。

 結果、人事の意図とはそぐわなかったとしても、正直に自分の伝えたいことをしゃべったほうが良いな、と思ったので、独断でスピーチさせていただきました。

 っていうか、ぶっちゃけ、LTは自分が楽しんで話せる内容じゃないと、勢いがキープできませんからね><!

 「そんなのキレイ事だよ」とか「そんなこと言って下心あるんでしょ?」とか思われるかもしれません。もちろん、他社さんと同じく「ウチにももっと入社してください><!!」っていうのも本心ではあります。

 でも、ウチはどっちかといえば昔気質のメーカー系でそんなに羽振りが良いわけでもないので、「誰でも彼でも来てちょうだい!」というわけにはいかないんですよね。だから、本当に我々と方向性が合って、「一緒にやろうよ!」と意気投合できる人に来て欲しいし、そういう人と一緒に仕事がしたいと思っているのです。

 ちょっと長くなりましたが、とりあえず言いたいのは、やっぱり「一緒に楽しいこと、そしてデカいことしましょう!」そのためにまずは「一緒に飲みましょう!」ってことですよ><!

2012/01/29

パワポとかワードのファイルをコマンドラインからPDFに変換したかったので…

 Evernoteを使っているので、ドキュメントをなんでもかんでも放り込んでおくのですが、doc形式とかppt形式のまま放り込んでも、Evernoteでそのまま表示されないのです。もちろん、本文を検索することもできません。
 それではあんまりにも不便なので、PDFにして放り込んでいます。
 しかしまぁ、自分のいる会社ではあらゆる書類がOffice文書でとびかっているので、日々手作業でPowerPointを開いてはPDFで保存、保存、保存……とやっていたのです。

 で、いいかげんバカらしくなってきて、オフィスで「パワポをコマンドラインから呼び出す方法はないもんかなぁ」とかぼやいていたら、@_8bit_さんが「C#でコントロールすればいいんじゃないですか?」とか教えてくれた。

「そうか!COMで操作すればいんじゃね?なるほど、その手があったか!」

 やっぱりWindowsのことは@_8bit_さんに聞いとけば間違いないなぁ、などと思いつつやってみた。

2012/01/04

Galaxy Nexusを買ったので…



 というわけで、Galaxy Nexusを買って約24時間が経過したので(執筆時点)、ちょっくらレビューでも書くとしますよ。
 あ。ちなみに、喪中につき、新年祝賀のご挨拶は控えさせて頂きます。ご了承下さい。