distributed performance test
Serge Aleynikov
serge@REDACTED
Thu Apr 21 22:56:23 CEST 2005
Gentlemen,
I'd like to ask for your advice on how to troubleshoot a problem related
to a severe performance drop of a gen_server:call() between a client and
a server running on different hosts.
The server is implementing a gen_server behavior, and a client's code is
shown below.
I've set up two nodes on different servers. I use a test function
drp_client:test_async(ConcurrentClients, TimesToRunPerClient) for stress
testing. The function uses spawn/3 to create concurrent processes,
where each one calls the drp_client:do_request/2 shown below.
When I call the server from the same node, the performance is:
- for a single client: 9434 calls/s
- for two clients....: 8771 calls/s (~ 4400 call/s per client)
(drp@REDACTED)6> drp_client:test_async(1, 1000).
Client 1 done. AvgTime=0.000 (9433.962 c/s)
(drp@REDACTED)7> drp_client:test_async(2, 1000).
Client 2 done. AvgTime=0.000 (4405.286 c/s)
Client 1 done. AvgTime=0.000 (4366.812 c/s)
----
When I call the server from a different host/node, the performance is:
- for a single client: 2538 calls/s
- for two clients....: 30 calls/s (~ 15 call/s per client) <--- !!!
(n1@REDACTED)9> drp_client:test_async(1, 1000).
Client 1 done. AvgTime=0.000 (2538.071 c/s)
(n1@REDACTED)10> drp_client:test_async(2, 100).
Client 2 done. AvgTime=0.067 (15.020 c/s)
Client 1 done. AvgTime=0.067 (15.017 c/s)
For some reason we observe a significant performance drop in case of
multiple clients issuing calls from a distributed node.
I tried to profile clients running on drp@REDACTED (local) and
n1@REDACTED (remote) nodes, but results are very similar.
Now - the exciting part. When I try to use the coverage tool on the
server, and just compile a few modules using cover:compile_module/1, the
invocation of clients on the remote node yields expected performance:
(drp@REDACTED)2> cover:start().
{ok,<0.115.0>}
(drp@REDACTED)3> lists:foreach(fun(M) -> cover:compile_module(M)
end, [drp_proto, drp_router, drp_server]).
ok
(n1@REDACTED)24> drp_client:test_async(2, 500).
Client 2 done. AvgTime=0.001 (1483.680 c/s)
Client 1 done. AvgTime=0.001 (1457.726 c/s)
So, the two questions are:
1. What can cause such a significant performance drop in case of
multiple concurrent clients accessing the server?
2. Why would conver:compile_module/1 eliminate this performance drop.
Your advice would be highly appreciated.
Regards,
Serge
drp_client:
===========
do_request(Args, Timeout) ->
case get_server_pid() of
{ok, Pid} ->
case catch gen_server:call(Pid, Args, Timeout) of
{ok, From, Response} ->
{ok, From, Response};
{error, Reason} ->
{error, Reason};
{'EXIT', {noproc, _Reason}} ->
{error, server_not_running};
{'EXIT', Reason} ->
{error, Reason}
end;
{error, Reason} ->
{error, Reason}
end.
get_server_pid() ->
case pg2:get_closest_pid(?MODULE) of
Pid when is_pid(Pid) ->
{ok, Pid};
{error, {no_process, _}} ->
{error, no_process}
end.
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: fprof_remote.txt
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20050421/843a19ed/attachment.txt>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: fprof_local.txt
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20050421/843a19ed/attachment-0001.txt>
More information about the erlang-questions
mailing list