Slow network?
Chris Mellon
arkanes at gmail.com
Mon Jan 12 14:35:00 EST 2009
On Mon, Jan 12, 2009 at 1:13 PM, Laszlo Nagy <gandalf at shopzeus.com> wrote:
>
> Hi All,
>
> To make the long story short, I have a toy version of an ORB being
> developed, and the biggest problem is slow network speed over TCP/IP.
>
> There is an object called 'endpoint' on both sides, with incoming and
> outgoing message queues. This endpoint object has a socket assigned, with
> nodelay:
>
> conn.setsockopt(socket.IPPROTO_TCP,socket.TCP_NODELAY,1)
>
> The endpoint is running two separate threads - those are dedicated for
> reading/writing messages from/into the socket object, as shown below:
>
>
> def _process_incoming(self):
> try:
> while not self.stop_requested.isSet():
> data = self.read_str()
> while not self.stop_requested.isSet():
> try:
> self.incoming.put(data,1)
> break
> except orb.util.smartqueue.Full:
> pass
> if not self.stop_requested.isSet():
> if self.router:
> self.router.on_message_arrived(self)
> except Exception, e:
> if self.router:
> if not isinstance(e,TransportClosedError):
> self.router.logger.error(dumpexc(e))
> self.router.unregister_endpoint(self)
> self.shutdown()
> raise SystemExit(0)
>
> def _process_outgoing(self):
> try:
> while not self.stop_requested.isSet():
> data_ok = False
> while not self.stop_requested.isSet():
> try:
> data = self.outgoing.get(1)
> data_ok = True
> break
> except orb.util.smartqueue.Empty:
> pass
> if data_ok:
> self.write_str(data)
> except Exception, e:
> if self.router:
> if not isinstance(e,TransportClosedError):
> self.router.logger.error(dumpexc(e))
> self.router.unregister_endpoint(self)
> self.shutdown()
> raise SystemExit(0)
>
>
> The main point is that the sender does not need to wait for the message to
> be actually written into the socket (unless the outgoing queue becomes
> full).
>
> When I try to send a message and receive an answer for it, I can only get as
> much as 130 request+response message pairs per second. Apparently, it is the
> same from messages size =77bytes to message size=16 Kbytes.
>
> However, if I send 100 outgoing messages first, then read back all answers
> then the speed goes up to 1300 message pairs/sec. I suspect that this has
> something to do with TCP/IP. Since this will be used for RPC/RMI, it would
> be very important to lower the time needed to exchange messages. Is there
> any way I can speed this up?
>
It is very likely that nodelay is actually hurting you here.
Using the select module and doing non-blocking IO will be faster than
using threads for this as well.
More information about the Python-list
mailing list