[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

DRb connection error with more than 250+ DRb services

J. Wook

5/11/2007 8:26:00 AM


Simple test codes are here:


class TestServer
include DRb::DRbUndumped

def initialize
@obj = Array.new
end

def register(addr)
@obj << addr
end

def sum
s = 0
@obj.each do |t|
v = DRbObject.new_with_uri(t).get_value
if v.nil?
puts s.to_s + " & error"
end
s += v
end
return s
end
end

class TestClient
include DRb::DRbUndumped

def initialize(addr, server, value)
DRbObject.new_with_uri(server).register(addr)
@value = value
end
def get_value
@value
end
end


uri = "druby://localhost:"
server_uri = uri + "40000"
server = DRb.start_service(server_uri, TestServer.new)

max_size = 300

(1..max_size).each do |t|
client_uri = uri + (40000 + t).to_s
DRb.start_service(client_uri, TestClient.new(client_uri, server_uri,
t))
end

sum = DRbObject.new_with_uri(server_uri).sum
puts sum


For max_size = 10, sum = 55
For max_size = 100, sum = 5050

...

but

For max_size = 300,
DRb::DRbConnError exception raised.

try to make another DRb server after that error in the same process....
#<Errno::EMFILE: Too many open files - socket(2)> raised.


How can I open more than 300 DRb connection?
(I need to make about 1,000 connections .... )

--
Posted via http://www.ruby-....

20 Answers

Brian Candler

5/11/2007 8:45:00 AM

0

On Fri, May 11, 2007 at 05:25:45PM +0900, J. Wook wrote:
> #<Errno::EMFILE: Too many open files - socket(2)> raised.

What does ulimit -a show? Particularly look at max open files

J. Wook

5/11/2007 8:56:00 AM

0

Brian Candler wrote:
> On Fri, May 11, 2007 at 05:25:45PM +0900, J. Wook wrote:
>> #<Errno::EMFILE: Too many open files - socket(2)> raised.
>
> What does ulimit -a show? Particularly look at max open files

dev@seoul$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
max nice (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) unlimited
max rt priority (-r) unlimited
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited


--
Posted via http://www.ruby-....

J. Wook

5/11/2007 9:00:00 AM

0

Jung wook Son wrote:
> Brian Candler wrote:
>> On Fri, May 11, 2007 at 05:25:45PM +0900, J. Wook wrote:
>>> #<Errno::EMFILE: Too many open files - socket(2)> raised.
>>
>> What does ulimit -a show? Particularly look at max open files
>
> dev@seoul$ ulimit -a
> core file size (blocks, -c) 0
> data seg size (kbytes, -d) unlimited
> max nice (-e) 20
> file size (blocks, -f) unlimited
> pending signals (-i) unlimited
> max locked memory (kbytes, -l) unlimited
> max memory size (kbytes, -m) unlimited
> open files (-n) 1024
> pipe size (512 bytes, -p) 8
> POSIX message queues (bytes, -q) unlimited
> max rt priority (-r) unlimited
> stack size (kbytes, -s) 8192
> cpu time (seconds, -t) unlimited
> max user processes (-u) unlimited
> virtual memory (kbytes, -v) unlimited
> file locks (-x) unlimited

looks like max open files is 1024

How can I change this value on ubuntu?

--
Posted via http://www.ruby-....

Brian Candler

5/11/2007 9:05:00 AM

0

On Fri, May 11, 2007 at 05:56:21PM +0900, Jung wook Son wrote:
> Brian Candler wrote:
> > On Fri, May 11, 2007 at 05:25:45PM +0900, J. Wook wrote:
> >> #<Errno::EMFILE: Too many open files - socket(2)> raised.
> >
> > What does ulimit -a show? Particularly look at max open files
>
> dev@seoul$ ulimit -a
> core file size (blocks, -c) 0
> data seg size (kbytes, -d) unlimited
> max nice (-e) 20
> file size (blocks, -f) unlimited
> pending signals (-i) unlimited
> max locked memory (kbytes, -l) unlimited
> max memory size (kbytes, -m) unlimited
> open files (-n) 1024
> pipe size (512 bytes, -p) 8
> POSIX message queues (bytes, -q) unlimited
> max rt priority (-r) unlimited
> stack size (kbytes, -s) 8192
> cpu time (seconds, -t) unlimited
> max user processes (-u) unlimited
> virtual memory (kbytes, -v) unlimited
> file locks (-x) unlimited

Hmm. Should be enough, unless you're opening other file-like objects in your
program. But you could try raising/lowering ulimit -n to see if it makes a
difference.

J. Wook

5/11/2007 9:19:00 AM

0

Brian Candler wrote:
> On Fri, May 11, 2007 at 05:56:21PM +0900, Jung wook Son wrote:
>> file size (blocks, -f) unlimited
>> virtual memory (kbytes, -v) unlimited
>> file locks (-x) unlimited
>
> Hmm. Should be enough, unless you're opening other file-like objects in
> your
> program. But you could try raising/lowering ulimit -n to see if it makes
> a
> difference.

Thanks Brian.

I am opening 1024+ file-like objects.
That's the answer exactly.


One more question.
When I try to change ulimit value, I have some error.


dev@seou$: ulimit -n 2048
-bash: ulimit: open files: cannot modify limit: Operation not permitted

dev@seoul$ sudo ulimit -Sn 2048
sudo: ulimit: command not found



--
Posted via http://www.ruby-....

Brian Candler

5/11/2007 9:47:00 AM

0

On Fri, May 11, 2007 at 06:18:48PM +0900, Jung wook Son wrote:
> I am opening 1024+ file-like objects.
> That's the answer exactly.
>
>
> One more question.
> When I try to change ulimit value, I have some error.
>
>
> dev@seou$: ulimit -n 2048
> -bash: ulimit: open files: cannot modify limit: Operation not permitted
>
> dev@seoul$ sudo ulimit -Sn 2048
> sudo: ulimit: command not found

You have to be root to increase it.

There is some config file which sets the default at login time. I can't
remember offhand what it is - you may need to google.

Brian Candler

5/11/2007 9:55:00 AM

0

On Fri, May 11, 2007 at 10:46:53AM +0100, Brian Candler wrote:
> > dev@seou$: ulimit -n 2048
> > -bash: ulimit: open files: cannot modify limit: Operation not permitted
> >
> > dev@seoul$ sudo ulimit -Sn 2048
> > sudo: ulimit: command not found
>
> You have to be root to increase it.
>
> There is some config file which sets the default at login time. I can't
> remember offhand what it is - you may need to google.

in /etc/security/limits.conf, something like:

brian hard nofile 2048

Then the user must logout and login again.

J. Wook

5/11/2007 11:08:00 AM

0


Thanks, Brian.

I made it.

--
Posted via http://www.ruby-....

Marcin Raczkowski

5/13/2007 10:17:00 AM

0

On Friday 11 May 2007 08:25, J. Wook wrote:
> Simple test codes are here:
>
>
> class TestServer
> include DRb::DRbUndumped
>
> def initialize
> @obj = Array.new
> end
>
> def register(addr)
> @obj << addr
> end
>
> def sum
> s = 0
> @obj.each do |t|
> v = DRbObject.new_with_uri(t).get_value
> if v.nil?
> puts s.to_s + " & error"
> end
> s += v
> end
> return s
> end
> end
>
> class TestClient
> include DRb::DRbUndumped
>
> def initialize(addr, server, value)
> DRbObject.new_with_uri(server).register(addr)
> @value = value
> end
> def get_value
> @value
> end
> end
>
>
> uri = "druby://localhost:"
> server_uri = uri + "40000"
> server = DRb.start_service(server_uri, TestServer.new)
>
> max_size = 300
>
> (1..max_size).each do |t|
> client_uri = uri + (40000 + t).to_s
> DRb.start_service(client_uri, TestClient.new(client_uri, server_uri,
> t))
> end
>
> sum = DRbObject.new_with_uri(server_uri).sum
> puts sum
>
>
> For max_size = 10, sum = 55
> For max_size = 100, sum = 5050
>
> ...
>
> but
>
> For max_size = 300,
> DRb::DRbConnError exception raised.
>
> try to make another DRb server after that error in the same process....
> #<Errno::EMFILE: Too many open files - socket(2)> raised.
>
>
> How can I open more than 300 DRb connection?
> (I need to make about 1,000 connections .... )

question probably everyone want's to ask.why the hell you need 1000
connections? dont' tell me you have 1000 servers with drbservers running
somewhere

--
Marcin Raczkowski
---
Friends teach what you should know
Enemies Teach what you have to know

Michal Suchanek

5/13/2007 12:00:00 PM

0

On 13/05/07, Marcin Raczkowski <swistak@mailx.expro.pl> wrote:
> On Friday 11 May 2007 08:25, J. Wook wrote:
> > Simple test codes are here:
> >
> >
> > class TestServer
> > include DRb::DRbUndumped
> >
> > def initialize
> > @obj = Array.new
> > end
> >
> > def register(addr)
> > @obj << addr
> > end
> >
> > def sum
> > s = 0
> > @obj.each do |t|
> > v = DRbObject.new_with_uri(t).get_value
> > if v.nil?
> > puts s.to_s + " & error"
> > end
> > s += v
> > end
> > return s
> > end
> > end
> >
> > class TestClient
> > include DRb::DRbUndumped
> >
> > def initialize(addr, server, value)
> > DRbObject.new_with_uri(server).register(addr)
> > @value = value
> > end
> > def get_value
> > @value
> > end
> > end
> >
> >
> > uri = "druby://localhost:"
> > server_uri = uri + "40000"
> > server = DRb.start_service(server_uri, TestServer.new)
> >
> > max_size = 300
> >
> > (1..max_size).each do |t|
> > client_uri = uri + (40000 + t).to_s
> > DRb.start_service(client_uri, TestClient.new(client_uri, server_uri,
> > t))
> > end
> >
> > sum = DRbObject.new_with_uri(server_uri).sum
> > puts sum
> >
> >
> > For max_size = 10, sum = 55
> > For max_size = 100, sum = 5050
> >
> > ...
> >
> > but
> >
> > For max_size = 300,
> > DRb::DRbConnError exception raised.
> >
> > try to make another DRb server after that error in the same process....
> > #<Errno::EMFILE: Too many open files - socket(2)> raised.
> >
> >
> > How can I open more than 300 DRb connection?
> > (I need to make about 1,000 connections .... )
>
> question probably everyone want's to ask.why the hell you need 1000
> connections? dont' tell me you have 1000 servers with drbservers running
> somewhere
>

It's been said that it's some 250 connections. For one, the
application might act as some sort of proxy which would double the
number of sockets.

Apparently it either uses some other files of uses about 4
handles/connection. It looks quite a lot and could be probably lowered
but it does not change the fact that 1000 is a safe default for
non-server applications but can be easily reached by servers.

I wonder why such limits are imposed. It is probably some workaround
for a flaw in UNIX design that introduces possible DoS by exhausting
kernel memory/structures. Maybe it was fixed in some kernels (if
that's even possible) but nobody cared to fix the limit as well.

Thanks

Michal