[erlang-questions] max fds for epoll incorrectly reduced to FD_SETSIZE

Steve Vinoski <>
Mon Feb 23 23:41:43 CET 2009


On 2/23/09, Steve Vinoski <> wrote:
> On 2/23/09, Bjorn Gustavsson <> wrote:
>  > On Sat, Feb 21, 2009 at 8:16 PM, Steve Vinoski <> wrote:
>  >  > Since kernel poll is not on by default, select() is used as the
>  >  > fallback/default, and the following code from the erts_poll_init()
>  >  > function in erts/emulator/sys/common/erl_poll.c limits the max fds to
>  >  > FD_SETSIZE:
>  >
>  > Are you sure that select() is used as a fallback on Linux? On systems that have
>  >  a poll() that works for any type of file descriptor, poll() is supposed to be
>  >  used. (On Mac OS X, poll() does not work for devices, so we are forced to use
>  >  select() as a fallback.)
>
>
> Hi Bjorn, thanks for your response, and yes, that's a very good
>  question. I went back and thoroughly checked my normal Erlang builds
>  on Linux and sure enough, poll() is in effect. The build causing the
>  trouble I described in my original post is a slight cross-compilation
>  (i.e., compiling on one Linux/gcc combo for a different Linux/gcc
>  combo), so I suspect what might be happening is that the C code used
>  to determine whether poll works or not, which I just found thanks to
>  your question, is failing because of the cross-compile. I'll dig into
>  this theory further and let you know. I appreciate the pointer.

Yep, it's as plain as day once you know where to look. In the
configure script generated from erts/configure.in, the test for
working poll first checks to see if we're cross-compiling, and if so,
it unconditionally sets the "poll_works" variable to false. That's the
source of the problem I'm seeing.

Given how critical this is to being able to cross-compile a scalable
runtime, I think there has to be a way to assert to configure that it
can just assume poll works. One way to do this is to allow for setting
a environment variable, let's call it ASSERT_WORKING_POLL, while
running configure. Here's a patch to erts/configure.in to allow that:

 *** erts/configure.in~	Tue Nov  4 05:51:24 2008
 --- erts/configure.in	Mon Feb 23 16:48:16 2009
 ***************
 *** 2541,2547 ****
     exit(0);
   #endif
   }
 ! ], poll_works=true, poll_works=false, poll_works=false)
   case $poll_works in
   true)
         AC_DEFINE(ERTS_USE_POLL, 1, [Define if poll() should be used
instead of select()])
 --- 2541,2547 ----
     exit(0);
   #endif
   }
 ! ], poll_works=true, poll_works=false,
poll_works=${ASSERT_WORKING_POLL:-false})
   case $poll_works in
   true)
         AC_DEFINE(ERTS_USE_POLL, 1, [Define if poll() should be used
instead of select()])

 ---

This functionality is identical to the previous functionality when
ASSERT_WORKING_POLL isn't set or is set to false. Setting
ASSERT_WORKING_POLL=true as an environment variable for configure
forces it to assume that poll works.

--steve



More information about the erlang-questions mailing list