[erlang-questions] Cowboy (Erlang) VS Haskell (Warp)

Knut Nesheim <>
Wed Jun 26 11:23:26 CEST 2013


I'm a bit curious to your comments about unsupervised processes in Elli and
Elli not following the OTP principles. Why do you think unsupervised
request processes is a bad thing? They are short-lived and you cannot
restart them in any meaningful way.

It is true that Elli does not hook any of the processes it creates into a
supervisor. As a user of Elli, you include the Elli "server" inside your
supervision tree. This server starts linked acceptor processes which
accepts a new connection, then handles the request (and keep-alive) before
they die and the Elli server starts a new acceptor. If any of these
processes exits abnormally, Elli knows about it. If you wish to find these
processes to debug something, you can use elli:get_acceptors(ElliPid) or
process_info(ElliPid, links). Mochiweb and Yaws does more or less the same.

Knut


On Tue, Jun 25, 2013 at 10:06 PM, Loïc Hoguin <> wrote:

> You'd also end up with tons of unsupervised processes, which isn't a good
> thing when you want to see what's wrong in your production system later on
> (something I last did today and do quite regularly when consulting). That's
> the biggest difference between the two, Cowboy follows OTP principles, elli
> doesn't. Unfortunately supervision does have a cost when you need to accept
> many short-lived processes quickly, but we have done a lot of work in Ranch
> to reduce that cost as much as possible. You could always replace Ranch
> with something that doesn't supervise if you really need to optimize to
> death, but so far even the handful of companies that I know that use it for
> ad bidding and other high frequency purposes haven't had the need to do
> that.
>
> In short: removing supervision only looks good on benchmarks.
>
>
> On 06/25/2013 09:52 PM, okeuday wrote:
>
>> When I use their benchmark here:
>> https://github.com/yesodweb/**benchmarks<https://github.com/yesodweb/benchmarks>
>> (as mentioned here:
>> http://www.yesodweb.com/blog/**2011/03/preliminary-warp-**
>> cross-language-benchmarks<http://www.yesodweb.com/blog/2011/03/preliminary-warp-cross-language-benchmarks>
>> )
>> to test elli, here:
>> https://github.com/knutin/elli
>>
>> I get 99000 req/s.  The (httperf) test of CloudI's http_req erlang
>> service using cowboy gives 13358 req/s.  cowboy has more features, so
>> that can explain the extra average latency which limits throughput.
>>
>> If you want to understand why their benchmark isn't decent, read this:
>> http://www.mnot.net/blog/2011/**05/18/http_benchmark_rules<http://www.mnot.net/blog/2011/05/18/http_benchmark_rules>
>>
>> So, if you want something faster in Erlang, you could use ellis,
>> however, keep in mind their testing isn't long enough to be meaningful
>> (due to garbage collection and other impacts on performance).
>>
>>
>> On Tuesday, June 25, 2013 10:38:25 AM UTC-7, BM Kim wrote:
>>
>>     Damian Dobroczyński <qoocku <at> gmail.com <http://gmail.com>>
>> writes:
>>
>>      >
>>      > W dniu 25.06.2013 13:51, BM Kim pisze:
>>      > > Hi folks,
>>      > >
>>      > > First of all, I want to apologise for my poor english skills,
>>      > > since english is not my first language, but I'll try my best
>>      > > to formulate my quesions as clear as possible.
>>      > >
>>      > > Second, I've just begun to learn erlang, so if I'm asking
>>      > > obvious "noob" questions I apologise for that too in advance...
>>      > >
>>      > > Anywho, now to my actual question:
>>      > >
>>      > > I am planning to write a high-performance server application in
>>     erlang,
>>      > > which will primarily handle HTTP requests. After some reseach
>> with
>>     google,
>>      > > I narrowed down my choices to cowboy, misultin and mochiweb and
>>     decided
>>      > > to go with the cowboy library first...
>>      > >
>>      > > Looking at some tutorials, I've quickly built a small server
>>     capable of
>>      > > serving static files and was eager to see first
>>     benchmark-results...
>>      > > I've also built a small Haskell server using Warp library to
>>     compare it
>>      > > with erlang's cowboy...
>>      > >
>>      > > But my first impression was, that my cowboy server is much much
>>     slower
>>     than
>>      > > expected when serving static-files and after some research I
>>     found a
>>     presentation
>>      > > of the cowboy's author claiming that cowboy shouldn't be used for
>>     serving
>>      > > static-files. So I modified the server code, so that it replies
>>     to every
>>      > > request with in-memory 4Kb binary blob and compared it with my
>>     haskell
>>     warp
>>      > > server serving 4kb static file...
>>      > >
>>      > > this is my simple cowboy's http handler:
>>      > >
>>      > >
>>     ------------------------------**------------------------------**
>> ----------
>>      > >
>>      > > blob() ->
>>      > >     [<<0:8>> || _ <- lists:seq(1,4096)].
>>      >
>>      > First, try to replace blob/0 function with this:
>>      >
>>      >   blob() -> <<0:(4096*8)>>.
>>      >
>>      > Then, restart the test and report ;)
>>      >
>>
>>
>>     Hi,
>>
>>     Thank you very much for pointing out the obvious mistake...
>>     After correcting it, I got improvement from 5940 req/s to 8650
>> req/s...
>>
>>     But still much slower than the haskell warp-server, which has
>> throughput
>>     of 38000 req/s...
>>
>>     But I have another question regarding blob/0. Is it going to be
>>     evaluated
>>     only once (like GHC would do) since it is a pure expression? I'm not
>>     so sure, since erlang is not pure and any function can have
>> side-effects
>>     which you can't mark as with the IO monad in Haskell...
>>
>>     ______________________________**_________________
>>     erlang-questions mailing list
>>      <javascript:>
>>     http://erlang.org/mailman/**listinfo/erlang-questions<http://erlang.org/mailman/listinfo/erlang-questions>
>>     <http://erlang.org/mailman/**listinfo/erlang-questions<http://erlang.org/mailman/listinfo/erlang-questions>
>> >
>>
>>
>>
>>
>> ______________________________**_________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/**listinfo/erlang-questions<http://erlang.org/mailman/listinfo/erlang-questions>
>>
>>
>
> --
> Loïc Hoguin
> Erlang Cowboy
> Nine Nines
> http://ninenines.eu
> ______________________________**_________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/**listinfo/erlang-questions<http://erlang.org/mailman/listinfo/erlang-questions>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20130626/688adcdf/attachment.html>


More information about the erlang-questions mailing list