Smoother bandwidth limiting

jw schultz jw at
Tue Feb 4 14:53:17 EST 2003

On Tue, Feb 04, 2003 at 03:06:05AM +0200, Mikko Rauhala wrote:
> Hello
> I'm using a cable modem with a slow uplink, and therefore when I want to
> transfer large amounts of data upstream, I tend to use rsync with
> --bwlimit. However, the stock rsync seems to send a bit too much data at
> once for comfort, momentarily blocking my meager upstream enough to
> bother latency and downstream data transfer (through not getting through
> enough ack packets when rsync data fills the cabel modem buffer).
> I tried a quick kludge, simply limiting the size of a single write()
> operation so that the write/sleep cycle happens more often, yielding (I
> hoped) a more steady flow of data, so that the cabel modem buffer
> wouldn't contain too much data at any point. Through comparing
> interactive session use before and after the patch, I would have to
> conclude that this kludge worked in my Debian GNU/Linux (unstable) box.
> Now, the point is that I like the kludge and I'd like rsync proper to
> adopt perhaps a lesser-kludgeish command line option (or something) for
> this kind of functionality, if you're so inclined. Might be useful to
> others in similiar circumstances.
> Here's my quick kludge (just a one-liner really, thanks to a proper
> write loop structure), which probably can reduce performance in the
> general case through using more writes, but has worked nicely for me
> (against 2.5.5 from Debian's sources; and yes, the "1024" is a magic
> number):

Just how magic is the 1024?  To what was bwlimit set?  And
the MTU?

You do bring up an interesting point.  I could see
restricting the write to bwlimit/100.  Sleeping much longer
than 100ms is a bit crude.

something like
	max_xmit = bwlimit / 100;
	if (max_xmit < 1024) max_xmit = 1024;
and then in writefd_unbuffered
	size_t n = len - total;
	if (max_xmit && n > max_xmit) n = max_xmit;

I'm no network internals sorcerer (networking seems something
of a black art) and wouldn't want things to get too magical
but perhaps linking this into MTU or somewhat.  I'd hate to
see us setting it to a value that causes lots of padded

> --- io.c.old    2002-03-22 07:14:44.000000000 +0200
> +++ io.c        2003-02-04 02:50:14.000000000 +0200
> @@ -440,7 +440,7 @@
>                 if (FD_ISSET(fd, &w_fds)) {
>                         int ret;
>                         size_t n = len-total;
> -                       ret = write(fd,buf+total,n);
> +                       ret = write(fd,buf+total,(n<1024?n:1024));
>                         if (ret == -1 && errno == EINTR) {
>                                 continue;
> -- 
> Mikko Rauhala   - mjr at     - <URL:>
> Transhumanist   - WTA member     - <URL:>
> Singularitarian - SIAI supporter - <URL:>

> -- 
> To unsubscribe or change options:
> Before posting, read:

	J.W. Schultz            Pegasystems Technologies
	email address:		jw at

		Remember Cernan and Schmitt

More information about the rsync mailing list