Index: [Article Count Order] [Thread]

Date: Sat, 31 Aug 2002 15:03:28 +0900 (JST)
From: GOTOU Yuuzou <gotoyuzo@notwork.org>
Subject: [webrickja:47] Re: accelerator
To: webrickja@notwork.org
Message-Id: <20020831.150327.68538307.gotoyuzo@kotetsu.does.notwork.org>
In-Reply-To: <20020831055901.0d574070.keita@kyomu.info>
References: <20020827130711.011063b7.keita@kyomu.info>	<20020828.031958.45271872.gotoyuzo@kotetsu.does.notwork.org>	<20020831055901.0d574070.keita@kyomu.info>
X-Mail-Count: 00047

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 で実装してるんだとすると、仕方ないかもしれませんねえ。

-- 
ごとうゆうぞう