On Friday 11 November 2005 15:06, Matthew Toseland wrote:
> A FEC code, such as the one we use for redundant splitfiles, is a code
> which takes k blocks of input data and produces n blocks of output data
> (the first k of which are normally the input data).
> 
> Onion FEC's CPU usage is roughly quadratic with k.
> 
> It takes 3.4 seconds on my box (XP 2800+) to encode one segment (after
> setup; 4MB input, 6MB output), with the current 128/192 code. This is
> the same as we used in 0.5.
> 
> In 0.5, for a long time all encoding was done in pure java, which is
> many times slower, and all encoding had to be done at the start of the
> splitfile insert. In the 0.7 code, we start inserting the data blocks
> immediately while running the splitfile encode, segment by segment, in
> parallel, and adding the new check blocks when they are done (starting
> with the last, shortest, segment).
> 
> Therefore I suggest that it may be sensible to consider some other
> configurations.
> 
> Issues:
> - Speed reduces by roughly a factor of 4 if either n or k is over 256,
>   because we have to use a 16-bit code.
> - At present we use 50% redundancy. This is probably not necessary.
> 
> PROJECTED ENCODE RATES
> n     k       segsize         time            rate
> 128   192     4MB             3.48s           1200kB/sec
> 170   256     5.4MB           6.14s           880kB/sec
> 192   256     6MB             7.83s           780kB/sec
> 256   384     8MB             55s ~= 1m       147kB/sec
> 512   768     16MB            222s ~= 3m      74kB/sec
> 1024  1536    32MB            890s ~= 15m     37kB/sec
> 2048  3072    64MB            3560s ~= 1h     18kB/sec
> 4096  6144    128MB           14250s ~= 4h    9.2kB/sec
> 8192  12288   256MB           57016s ~= 16h   4.6kB/sec
> 16384 24576   512MB           228ks ~= 63h    2.3kB/sec
> 
> Encode rates are relative to the original data.
> Since we start inserting the original data blocks immediately, a codec
> will be acceptable if its encode rate is over our expected insert rate.
> Actually we have some leeway beyond that for the later segments, as we
> have to insert the check blocks too, but lets assume single segment of
> the maximum size.
> 
> Note that the memory usage is 1/8th of the segment size with 4kB
> stripes.
> 
> IMHO very few nodes will be able to insert at much over 37kB/sec. But
> some will, and there is CPU usage to consider too... do we want fast
> encodes so that people can run games etc at the same time as inserts?
> Realistically people are going to turn Freenet off while gaming... at
> least the hardcore gamers are. Even if they had loads of RAM and could
> nice it, they'd want to have really low bandwidth usage. Which buys us
> time, because it slows down the insertion of blocks, and therefore we
> don't need to have such a fast encode.
> 
> 16 or 32MB segments seem to make sense to me. Does this make sense? I
> can make segment size a parameter otherwise...

Matthew,

I would use a n,k pair giving the largest segsize that keeps the faster coding 
rates.  Not everyone has a fast cpu...

Thanks
Ed Tomlinson

Reply via email to