In message <20020831055901.0d574070.keita@kyomu.info>,
`keita yamaguchi <keita@kyomu.info>' wrote:
> > しかし、書いてから気付いたんですが、
> > http://www.FreeBSD.org/cgi/man.cgi?query=sendfile&manpath=Red+Hat+Linux%2Fi386+7.3
> > あたりを見ると、
> >
> > Presently the descriptor from which data is read cannot
> > correspond to a socket, it must correspond to a file which
> > supports mmap()-like operations.
> >
> > と書いてあったりします。もしかして、File と IO で挙動を分けた
> > ほうがよかったりするんですかねえ。
>
> これは自分も気になっていたんですが、
> まぁ socket to socket で転送するような状況はWEBrickに限っては
> まずなさそうなのでとりあえずこのままでも問題ないかとタカくくってました(^-^;
今回の変更で、FileHandler で大きなファイルを送るとリソースを食
いすぎるという問題は WEBrick 的にも解決できたので、あとは
sendfile(2) でどのくらい速くなるかというところでしょうか。
自分で行なった変更を忘れてしまいそうなので、いちおうメモしてお
くと、body に IO を指定した場合、
(1) res.chunked = true する
チャンクエンコーディング形式で EOF までボディを送信する
(2) res["content-length"] を設定する
_send_file(socket, read, content-length) する
(3) それ以外
Connection: close にして、
_send_file(socket, read, 0) する
となるようにしました。
> > あと、HP-UX や FreeBSD のマニュアルによれば、バイト数に 0 を指
> > 定すると EOF まで転送すると書かれていて、納得の仕様なんですが、
> > Solaris や Linux のマニュアルからは読み取れませんでした。
>
> Linuxについては実際に確認してみましたが、
> size = 0 では 0 byte 書き込むという意味になっちゃうみたいです。
> つまりEOFまでといった便利そうな解釈をしてくれません。
> うーん結構色々違ってるもんですね……
mmap で実装してるんだとすると、仕方ないかもしれませんねえ。
--
ごとうゆうぞう