[erlang-questions] Why is gen_server:call/1 so slow (3s) when used with {global, Name}?

Dowse, Malcolm <>
Mon Jun 22 20:24:51 CEST 2009


Hi,

(It looks like my original response didn't make it to the list. It can
be found below.)

I don't know if you need to send a mail to the bugs mailing list.

Anyway, the problem looked fairly simple to solve, and so I've attached
a patch for global.erl in R13B01 which appears to fix the problem. If
OTP are happy and think it's a worthwhile change, perhaps they can
include it in a later Erlang release.

Cheers,

Malcolm

"""
Hi,

I played around with your example a bit. If you put a 'timer:sleep(1)'
just after 'global:sync()' then the problem goes away.. or at least it
does for me.

Looking at the global.erl, it seems that some sort of low-level global
lock is set on all nodes during, and shortly after, a call to
global:sync/0. If you do a global whereis query when this lock is still
set (ie. by calling a globally registered gen_server), it waits a random
interval between 0 and 4 seconds and then tries again. See the call
'random_sleep(5)' in global.erl.

The comments in the code suggests that some sort of exponential backoff
should instead be done. So it's quite possible that this is a bug.

all the best,

malcolm
"""

-----Original Message-----
From: Sergey Samokhin [mailto:] 
Sent: 20 June 2009 18:27
To: Dowse, Malcolm
Cc: 
Subject: Re: [erlang-questions] Why is gen_server:call/1 so slow (3s)
when used with {global, Name}?

Hi!

> I played around with your example a bit. If you put a 'timer:sleep(1)'
just
> after 'global:sync()' then the problem goes away.. or at least it does
for
> me.

Adding 'time:sleep(1)' has made init/1 so fast as I wanted it to be,
thanks!

> The comments in the code suggests that some sort of exponential
backoff
> should instead be done. So it's quite possible that this is a bug.

Should I forward this thread to erlang-bugs mailing list?

-- 
Sergey Samokhin


More information about the erlang-questions mailing list