<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
Of course you need to  run a profiler such as fprof to see what's going on.<div><br></div><div>Sounds like a classic head of line blocking problem. Many requests, possibly from processes on different schedulers/cores, all getting serialized on a single gen_server.</div><div><br></div><div>The obvious, and maybe non-OTP, answer is to hold some of this state information in a public or protected named ETS table that your clients read from directly. A single gen_server can still own and write to that ETS table. </div><div><br></div><div>Another obvious answer is to provide back-pressure of some kind to prevent clients from requesting data when it is under load.<br><br>You might find that a particular infrequent  gen_server:call operation is taking a long time to complete causing a message queue to suddenly grow. You might want to change such an operation from:</div><div><br></div><div>handle_call({long_operation,Data},From,State) -></div><div>    Rsp = do_lengthy_operation(Data),</div><div>    {reply, Rsp, State};</div><div><br></div><div>to:</div><div><br></div><div><div>handle_call({long_operation,Data},From,State) -></div><div>    spawn(fun() -></div><div>            Rsp = do_lengthy_operation(Data),</div><div>            gen_server:reply(Rsp,From)</div><div>     end),   </div><div>    {noreply, State};</div><div><br></div><div><br></div><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">From: goddang@hotmail.com<br>To: erlang-questions@erlang.org<br>Date: Sat, 28 Jan 2012 00:06:04 +0000<br>Subject: [erlang-questions] Slow when using chained gen_server:call's,  redesign or optimize?<br><br>

<meta http-equiv="Content-Type" content="text/html; charset=unicode">
<meta name="Generator" content="Microsoft SafeHTML">
<style>
.ExternalClass .ecxhmmessage P
{padding:0px;}
.ExternalClass body.ecxhmmessage
{font-size:10pt;font-family:Tahoma;}

</style>
<div dir="ltr">
I'm creating a system where I've ended up with alot of gen_servers that provides a clean interface. When I run this under load I see that the gen_server:call's is becoming a bottleneck.<div>For instance, In a handle_request I might ask an other gen_server to get me a cached object, then ask the database something, then etc...</div><div>and in some cases I have my-gen_server->cache-gen_server->memcache-client-gen_server as you see it stacks up to alot of steps. I've tried to optimize with deferring gen_server responses and that has given a slight performance improvement but not as drastical as if I for instance bypass one gen_server instance.</div><div><br></div><div>Is there a better way to go about this or some smart optimization to do? And FYI, I use gen_server when I need to keep a state of a connection or something so if the answer is to scrap  or reduce the number of gen_servers I will need to keep those connections somewhere else.</div><div><br></div><div>Thanks, Dang</div><div><br></div>                                        </div>
<br>_______________________________________________
erlang-questions mailing list
erlang-questions@erlang.org
http://erlang.org/mailman/listinfo/erlang-questions</div></div>                                       </div></body>
</html>