[Vortex] Using vortex for IPC

Mikhail Dmitrievsky mishadm at mail.ru
Thu Oct 9 06:17:07 CEST 2008


Hello Francis!

Thanks a lot for your response! It was very helpful!

> > I'm trying to use vortex for exchanging large amount of data between
> > two processes on the same computer. I have found 2 problems.
> >
> >      1. Very low transfer speed (about 20-30 Mb/sec)
> >
> > After some changes in vortex I have speed about  100 Mb/sec, and it
> > looks much better than 30 Mb/sec.
> 
> Great job Mikhail. At this point, which are the changes introduced? You
> can post and describe them?

Looks like I was using vortex in wrong way. I was trying to extend window size, but vortex fails because of small buffer in VortexCtx (sequencer_send_buffer). That's why I made changes in vortex to make default buffer size much bigger - I replace values like 4096 and 4095 in source with bigger values. I know it was wrong, but it was a way to try to speed up vortex. Now I clearly understand that I need to do to make vortex working faster. May be my experience helps someone else:

1. I created frame size handler function:

int my_frame_size_maker (VortexChannel *channel, unsigned int next_seq_no, int message_size, unsigned int max_seq_no, axlPointer user_data) 
{
	int res = VORTEX_MIN (PTR_TO_INT(user_data), 
		    VORTEX_MIN (message_size, max_seq_no - next_seq_no + 1));
	return res;
};

Main idea of this function is to tell frame size as big as possible.

2. In listener and initiator I added these calls after I have connection created:

vortex_connection_set_next_frame_size_handler (connection, my_frame_size_maker, 													INT_TO_PTR(BIG_BUFFER_SIZE));
vortex_channel_set_window_size(channel, BIG_BUFFER_SIZE); // set bigger window size

After some tests I've got that the best buffer size is the value near
#define BIG_BUFFER_SIZE 61440
I made this value less than 64k to eliminate possibility of creating frame bigger than MAX_BUFFER_SIZE (64k).

> 
> > - sequencer_send_buffer and sequencer_send_buffer_size from VortexCtx
> > inits only once in vortex_sequencer_run function and after extending
> > channel window size sequencer_send_buffer seems to be too small.
> 
> This is not a bug. Take a look on vortex_sequencer_build_packet_to_send
> [2]. It dynamically increase the buffer size according to the value
> returned by vortex_channel_get_next_frame_size, which is, configurable
> via setting a handler that can return your desired value by
> vortex_connection_set_next_frame_size_handler.
> 

Looks like there is a bug in vortex_sequencer_build_packet_to_send buffer increasing algorithm, because it only doubles buffer. In my case I want buffer greater or equal 60k, but if we have initial value 4k, doubled value will be only 8k. I changed 

/* check if we have to realloc buffer */
if (size_to_copy + 100 > ctx->sequencer_send_buffer_size) {
	/* update buffer size */
	ctx->sequencer_send_buffer_size = (ctx->sequencer_send_buffer_size - 100) * 2 + 100;
	/* free current buffer */
	axl_free (ctx->sequencer_send_buffer);
	/* allocate new buffer */
	ctx->sequencer_send_buffer      = axl_new (char, ctx->sequencer_send_buffer_size);
} /* end if */

to 

/* check if we have to realloc buffer */
while (size_to_copy + 100 > ctx->sequencer_send_buffer_size) {
	/* update buffer size */
	ctx->sequencer_send_buffer_size = (ctx->sequencer_send_buffer_size - 100) * 2 + 100;
	/* free current buffer */
	axl_free (ctx->sequencer_send_buffer);
	/* allocate new buffer */
	ctx->sequencer_send_buffer      = axl_new (char, ctx->sequencer_send_buffer_size);
} /* end if */

and now it work perfectly!

> > Have anyone some ideas how to fix vortex for extending window size?
> >
> >      2. Transfer limit is 2Gb.
> >
> > As I understand, the problem is that vortex uses variables of "int"
> > type instead of "unsigned int" for saving sequence numbers.  Then the
> > transfer size becomes more that 2Gb, vortex tries to increase
> sequence
> > number and it becomes greater than INT_MAX, so  we get sequence
> number
> > value near -INT_MAX. After that vortex closes connection.
> 
> You are right, this is a bug. Reading the RFC it is clear that seq no
> values must use unsigned int (2^32 - 1). I'll take a look on this.
> 
> > To fix this problem I made a lot of changes in vortex sources (about
> > 30 places in 10 files), but I'm not sure that I did all necessary
> > changes.  If someone want to fix this bug in vortex, I can send my
> > changes to him.
> 
> Sure. You can always post your changes to the mailing list. I'll take a
> look on them ASAP.
> 

I think it will be better if I send them to you directly, because message will be ~700k, don't think this size applicable to mail list :)

WBR, Mikhail.




More information about the Vortex mailing list