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...
If you only care about performance use Haskell or c.
Sergej
That's not surprising at all, you are performing the same thing exactly
all the time, so of course Haskell is going to be fast at this. Same
goes for JIT enabled environments like Java. The JIT can easily compile
it to machine code once and be done with it.
You're not actually testing the HTTP server, or even the language
performance, you are testing the ability of the platform to optimize one
operation to death.
> 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 doesn't do that. Closest is at compile time when A = 1 + 1
becomes A = 2 in the compiled file, but it's only done for a very small
subset of all expressions.
Erlang shines not in synthetic benchmarks, but in production, when
thousands of clients connect to your server and expect their requests to
arrive as quick as if they were alone on the server. Erlang is optimized
for latency, and this latency will be the same regardless of there being
only one user or ten thousands.
Your benchmark on the other hand is evaluating throughput. Throughput is
boring, and not really useful for Web applications. (See Max' email for
more details on that.)
--
Loïc Hoguin
Erlang Cowboy
Nine Nines
http://ninenines.eu
[...]
Thank you so much, for your helpful and insightful explanation, which gives me a new
perspective on my current benchmark-strategy and expectations...
If it is not too much trouble, can you me some further advice regarding erlang
performance in general and using the cowboy library "efficiently", if there are some
issues/tricks which are not documented in the manual but I should be aware of?
by the way: can you recommend some opensource erlang projects incorporating the
cowboy library that I can learn from?
Again thank you for your time and advices!
-- bmk
The tricks are documented in either the Cowboy manual or the Ranch
manual (for things relating to sockets). But there aren't many of them
and you shouldn't start with these questions. Ask yourself whether the
project enables you to do what you need instead.
There's no doubt that Erlang fits your needs if it's a Web project. The
only gotcha would be that you want to use a NIF for image manipulation
(there isn't any pure Erlang lib anyway at this time), and you want to
use the OpenCL NIFs for any heavy computation. You can also use Erlang
to handle clusters of Python instances or any other platforms, like has
been done by many people (see CloudI for example, if you have that kind
of need).
> by the way: can you recommend some opensource erlang projects incorporating the
> cowboy library that I can learn from?
I'd look at n2o, axiom, ChicagoBoss, or other frameworks, in that order.
--
Loïc Hoguin
Erlang Cowboy
Nine Nines
http://ninenines.eu
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
> (as mentioned here:
> 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
>
> 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:
>
> erlang-q...@erlang.org <javascript:>
> http://erlang.org/mailman/listinfo/erlang-questions
> <http://erlang.org/mailman/listinfo/erlang-questions>
>
>
>
> _______________________________________________
> erlang-questions mailing list
> erlang-q...@erlang.org
> http://erlang.org/mailman/listinfo/erlang-questions
>
--
Loïc Hoguin
Erlang Cowboy
Nine Nines
http://ninenines.eu
Now if a request handler gets stuck for one reason or another, and the
process is supervised, it takes about 5 minutes to find what's wrong
because the OTP tools and libraries do all the work for you in figuring
it out. You don't have to think, you already know how to deal with issues.
If the process isn't supervised, you cut yourself from most of the
documented tools and techniques, for example none of your processes will
show up in observer. You also force your users to figure out the
alternative ways to debug things instead of what they use everywhere
else (see Fred's posts [1] and [2]). You have to write custom code to
extract metrics, logging will work in unexpected ways, etc. And the
worse part is that you essentially reimplemented a supervisor in your
Elli server process.
Yesterday I was debugging an issue and found out file:consult/1 calls
were getting stuck (bug report incoming, still testing things). If I was
using Elli, I would have cursed your name many times because of all the
time I'd have lost trying to understand how to debug this thing.
Following OTP principles is one of Cowboy's most important feature, and
this will soon be improved again by making even request processes
special processes that you can debug like you would a gen_server. At
this point everything will be a special process. This is especially
important since the Web continues moving toward long-running connections
with Websocket, SPDY and HTTP/2.0.
[1] http://ferd.ca/poll-results-erlang-maintenance.html
[2]
http://ferd.ca/code-janitor-nobody-s-dream-everyone-s-job-and-how-erlang-can-help.html
> 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> <http://gmail.com>> writes:
>
> >
> > W dniu 25.06.2013 13 <tel:25.06.2013%2013>:51, BM Kim pisze:
> ------------------------------__------------------------------__----------
> > >
> > > 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
> erlang-q...@erlang.org <mailto:erlang-q...@erlang.org> <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
> erlang-q...@erlang.org <mailto:erlang-q...@erlang.org>
> 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
> erlang-q...@erlang.org <mailto:erlang-q...@erlang.org>
> http://erlang.org/mailman/__listinfo/erlang-questions
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
Me too, but I'm not sure how that would help someone trying to debug an
issue in production quickly to avoid losing money.
You shouldn't make the product's usability dependent on the author's
availability. (And yep, I am also in the process of learning that,
except in my case it's with regards to documentation.)
--
Loïc Hoguin
Erlang Cowboy
Nine Nines
http://ninenines.eu