[erlang-questions] fast file sending - erlang & nginx

Roberto Ostinelli <>
Sun Nov 21 17:10:43 CET 2010


2010/11/21 Morten Krogh <>:
> Robert, what throughput do you get by sending a preloaded binary instead?
>
> In other words, read the file into a binary once, and then just serve the
> replies from that binary.
>
> Morten.

here are the details, running ab -n 50000 -c 5
http://ubuntu.loc/image.jpeg with Document Length = 4163 bytes

NGINX:
Time per request:       0.410 [ms] (mean)
Time per request:       0.082 [ms] (mean, across all concurrent requests)
Transfer rate:          52161.96 [Kbytes/sec] received
Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      1
  95%      1
  98%      1
  99%      1
 100%      6 (longest request)

MISULTIN:
Time per request:       1.428 [ms] (mean)
Time per request:       0.286 [ms] (mean, across all concurrent requests)
Transfer rate:          14525.79 [Kbytes/sec] received
Percentage of the requests served within a certain time (ms)
  50%      1
  66%      2
  75%      2
  80%      2
  90%      2
  95%      2
  98%      2
  99%      2
 100%      6 (longest request)

MISULTIN WITH FILE READ IN MEMORY:
Time per request:       0.795 [ms] (mean)
Time per request:       0.159 [ms] (mean, across all concurrent requests)
Transfer rate:          26088.81 [Kbytes/sec] received
Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      1
  95%      1
  98%      1
  99%      1
 100%      2 (longest request)

ratios:

nginx : misultin = 1 : 3.6
nginx : misultin with cache = 1 : 2

code to perform these tests is hereby provided.

r.

============== normal file sending ==============================

-module(misultin_file).
-export([start/1, stop/0]).

% start misultin http server
start(Port) ->
	misultin:start_link([{port, Port}, {loop, fun(Req) -> handle_http(Req) end}]).

% stop misultin
stop() ->
	misultin:stop().

% callback on request received
handle_http(Req) ->	
	Req:file("image.jpeg").

===========================================================

============== cached file sending =============================

-module(misultin_file2).
-export([start/1, stop/0]).
-include_lib("kernel/include/file.hrl").

% start misultin http server
start(Port) ->
	% load file
	FilePath = "roberto2.jpeg",
	{ok, Binary} = file:read_file(FilePath),
	{ok, FileInfo} = file:read_file_info(FilePath),
	FileSize = FileInfo#file_info.size,
	HeadersFull = [{'Content-Type',
misultin_utility:get_content_type(FilePath)}, {'Content-Length',
FileSize}],
	misultin:start_link([{port, Port}, {loop, fun(Req) ->
handle_http(Req, Binary, HeadersFull) end}]).

% stop misultin
stop() ->
	misultin:stop().

% callback on request received
handle_http(Req, Binary, HeadersFull) ->
	Req:stream(head, HeadersFull),
	Req:stream(Binary).

===========================================================


More information about the erlang-questions mailing list