[Vm-dev] Squeak socket problem ... help!

Göran Krampe goran at krampe.se
Fri Oct 10 01:03:35 UTC 2014


On 10/10/2014 02:50 AM, Eliot Miranda wrote:
> On Thu, Oct 9, 2014 at 5:09 PM, Göran Krampe <goran at krampe.se
>     Well, it most probably *is* broke - I mean - I haven't read anywhere
>     that our Socket code is limited to 1024 concurrent sockets and that
>     going above that limit causes the Socket code to stop working? :)
> "Broke" is the wrong word.  You're running into a soft resource limit
> that you can raise.  But you should only raise it if you know the server

No, see below. When I say 1024 I am not referring to the soft limit. I 
am referring to the fact that select() can not handle more than 1024, 
let me quote from the net:

"The limitation comes from the way select() works, most concretely the 
data type used to represent the list of file descriptors, fd_set. Let’s 
take a look at fd_set in /usr/include/sys/select.h

You will see a definition pretty much like:

typedef struct  {
     long int fds_bits[32];
} fd_set;

I removed a bunch of macros to make the code more clear. As you see you 
have a static array of 32 long ints. This is just a bit map, where each 
bit represents a file descriptor number. 32 * sizeof(long int), for 32 
bit platforms is 1024. So, if you do fd_set(&fd, 10), to add file 
descriptor 10 to an fd_set, it will just set to 1 the 10th bit in the 
bit map, what happens then if you do fd_set(&fd, 2000) ?, you guessed 
right, unpredictable. May be some sort of array overflow (fd_set is, at 
least on my system, implemented using the assembly instruction btsl, bit 
test and set)."

>     But it sounds broke to me, nevertheless. ;)
> If it is broke it is the OS that is broke.  But not really.  Having a
> soft limit is a great way to find problems (leaks) while providing
> flexibility.  With no limit the system runs until catastrophe, probably

But... I am not sure if you are misunderstanding or not. We did raise 
the limit but then we got the "Bad descriptor file" not the "Too many 
files open". What I mean with "broke" is the fact that select() can not 
handle more than 1024 *regardless* of limits.

So I think we can not go above 1024 if we still use select(). This is 
the bug I am talking about.

regards, Göran

More information about the Vm-dev mailing list