[Unison-hackers] [patch] high system time with BTRFS and compression...

Benjamin Pierce bcpierce at cis.upenn.edu
Fri Jun 11 15:56:08 EDT 2010


Hi Daniel,

All this code has been substantially rewritten since 2.27 (so there's nowhere to apply your patch any more) -- should perform even better now!

   - Benjamin



On May 28, 2010, at 10:13 AM, Daniel J Blueman wrote:

> With unison 2.27.57 on Linux (Ubuntu 10.04 x86-64, client and server),
> performing synchronisation with a BTRFS filesystem with compression
> enabled takes higher system time, due to many threads performing
> smaller (~4K) synchronous reads.
> 
> Increasing the buffer size to 64K helps alleviate this, and will
> provide a smaller win on other filesystems. Also, on faster networks
> with larger MTU, 64K read/write to the socket provides more
> throughput.
> 
> Please consider and thanks,
>  Daniel
> 
> diff -ur unison-2.27.57/remote.ml unison-2.27.57-new/remote.ml
> --- unison-2.27.57/remote.ml    2008-01-18 13:53:35.000000000 +0000
> +++ unison-2.27.57-new/remote.ml        2010-05-26 12:49:00.146269467 +0100
> @@ -79,7 +79,7 @@
>  let receivedBytes = ref 0.
>  let emittedBytes = ref 0.
> 
> -let inputBuffer_size = 8192
> +let inputBuffer_size = 65536
> 
>  let fill_inputBuffer conn =
>   assert (conn.inputLength = 0);
> @@ -127,7 +127,7 @@
> 
>  (****)
> 
> -let outputBuffer_size = 8192
> +let outputBuffer_size = 65536
> 
>  let rec send_output conn =
>   catch_io_errors
> diff -ur unison-2.27.57/transfer.ml unison-2.27.57-new/transfer.ml
> --- unison-2.27.57/transfer.ml  2007-04-02 04:03:20.000000000 +0100
> +++ unison-2.27.57-new/transfer.ml      2010-05-26 12:51:12.676894227 +0100
> @@ -234,8 +234,8 @@
>  let send infd length showProgress transmit =
>   debug (fun() -> Util.msg "sending file\n");
>   let timer = Trace.startTimer "Sending file using generic transmission" in
> -  let bufSz = 8192 in
> -  let bufSzFS = Uutil.Filesize.ofInt 8192 in
> +  let bufSz = 65536 in
> +  let bufSzFS = Uutil.Filesize.ofInt 65536 in
>   let buf = String.create bufSz in
>   let q = makeQueue length in
>   let rec sendSlice length =
> @@ -298,14 +298,14 @@
>   (*** PREPROCESS ***)
> 
>   (* Preprocess buffer size *)
> -  let preproBufSize = 8192
> +  let preproBufSize = 65536
> 
>   (* Incrementally build arg by executing f on successive blocks (of size
>      'blockSize') of the input stream (pointed by 'infd').
>      The procedure uses a buffer of size 'bufferSize' to load the input,
>      and eventually handles the buffer update. *)
>   let blockIter infd f arg maxCount =
> -    let bufferSize = 8192 + blockSize in
> +    let bufferSize = 65536 + blockSize in
>     let buffer = String.create bufferSize in
>     let rec iter count arg offset length =
>       if count = maxCount then arg else begin
> @@ -363,7 +363,7 @@
>   (*** DECOMPRESSION ***)
> 
>   (* Decompression buffer size *)
> -  let decomprBufSize = 8192
> +  let decomprBufSize = 65536
> 
>   (* For each transfer instruction, either output a string or copy one or
>      several blocks from the old file. *)
> @@ -517,8 +517,8 @@
> 
>   (* Compression buffer size *)
>   (* MUST be >= 2 * blockSize *)
> -  let comprBufSize = 8192
> -  let comprBufSizeFS = Uutil.Filesize.ofInt 8192
> +  let comprBufSize = 65536
> +  let comprBufSizeFS = Uutil.Filesize.ofInt 65536
> 
>   (* Compress the file using the algorithm described in the header *)
>   let rsyncCompress sigs infd srcLength showProgress transmit =
> -- 
> Daniel J Blueman



More information about the Unison-hackers mailing list