On Wednesday 08 August 2007 16:52, Matthew Toseland wrote: > On Wednesday 08 August 2007 16:51, Matthew Toseland wrote: > > On Wednesday 08 August 2007 16:48, Matthew Toseland wrote: > > > On Wednesday 08 August 2007 16:47, Matthew Toseland wrote: > > > > On Wednesday 08 August 2007 16:45, Matthew Toseland wrote: > > > > > On Wednesday 08 August 2007 16:42, Matthew Toseland wrote: > > > > > > On Wednesday 08 August 2007 16:26, Matthew Toseland wrote: > > > > > > > On Wednesday 08 August 2007 16:25, Matthew Toseland wrote: > > > > > > > > On Wednesday 08 August 2007 16:23, Matthew Toseland wrote: > > > > > > > > > On Wednesday 08 August 2007 16:22, Matthew Toseland wrote: > > > > > > > > > > On Wednesday 08 August 2007 16:20, Matthew Toseland wrote: > > > > > > > > > > > On Wednesday 08 August 2007 16:19, Matthew Toseland wrote: > > > > > > > > > > > > On Wednesday 08 August 2007 16:17, Matthew Toseland > > wrote: > > > > > > > > > > > > > On Wednesday 08 August 2007 16:05, Matthew Toseland > > > > wrote: > > > > > > > > > > > > > > Continued at end to minimise confusion! > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Wednesday 08 August 2007 15:59, Matthew > > > > > > > > > > > > > > Toseland > > > > > > wrote: > > > > > > > > > > > > > > > Unfortunately this thread is rather rambling, > > > > > > > > > > > > > > > it includes lots of discussion on token passing > > > > > > > > > > > > > > > as well as the original premise. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI > > > > > > > > > > > > > > > ----- 2007.04.25 - 20:18:36GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I made some measurements on how freenet node > > > > > > > > > > > > > > > behaves if bandwidth limit is set low: 10KBps > > > > > > > > > > > > > > > and downto 6KBps (specificially, input > > > > > > > > > > > > > > > bandwidth limit; output bandwidth limit was set > > > > > > > > > > > > > > > to at least 15KBps but as expected factually > > > > > > > > > > > > > > > used output bandwidth is comparable (just > > > > > > > > > > > > > > > slightly above) with factually used input > > > > > > > > > > > > > > > bandwidth). The node itself was running frost > > > > > > > > > > > > > > > but no > > > > > > > > > > > > > > > uploads/downloads, so absolute majority of > > > > > > > > > > > > > > > network traffic was forwarded CHK/SSK > > > > > > > > > > > > > > > requests/inserts. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Results are interesting enough: CHK traffic > > > > > > > > > > > > > > > becomes as low as 5% (in packets) of CHK+SSK, > > > > > > > > > > > > > > > while at least 92% of SSK requests were not > > > > > > > > > > > > > > > satisfied for assorted failures (plus quite > > > > > > > > > > > > > > > some more certainly resulted in NotFound > > > > > > > > > > > > > > > response due to missing the key in whole > > > > > > > > > > > > > > > network, but I don't have the number). This > > > > > > > > > > > > > > > makes low traffic node working highly > > > > > > > > > > > > > > > inefficient and improportionally slow; this > > > > > > > > > > > > > > > also slows down its peers with all the extra > > > > > > > > > > > > > > > reject traffic. Worse, input bandwidth > > > > > > > > > > > > > > > sometimes goes over set limit, suggesting that > > > > > > > > > > > > > > > on hardware 33600/56000 Kbps modem and even > > > > > > > > > > > > > > > ISDN things will just get worse due to > > > > > > > > > > > > > > > increased delays. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Another thing to note: low bandwidth node (LBN) > > > > > > > > > > > > > > > almost exclusively reject requests with "input > > > > > > > > > > > > > > > bandwidth liability" reason, and extremely > > > > > > > > > > > > > > > rarely other reasons. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Speculating a bit, the same picture will likely > > > > > > > > > > > > > > > be observed for peers of fast node (1Mbps or > > > > > > > > > > > > > > > more) with many peers having typical home > > > > > > > > > > > > > > > connection of 256Kbps or less. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Not sure if simulations ever showed anything > > > > > > > > > > > > > > > like this, but contributing to network mostly > > > > > > > > > > > > > > > SSK service (and absolute majority of SSK > > > > > > > > > > > > > > > requests fail!) is rather useless: optimally > > > > > > > > > > > > > > > working network is supposed to transfer at > > > > > > > > > > > > > > > least one CHK block for each SSK key, and > > > > > > > > > > > > > > > typically much much more (single 10MB file > > > > > > > > > > > > > > > consists of 481 CHK blocks!), and even if you > > > > > > > > > > > > > > > found SSK but not CHK the SSK points to, then > > > > > > > > > > > > > > > you failed to find information you requested. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > OK to make the long story short[er], at the end > > > > > > > > > > > > > > > of this message you will find a small patch > > > > > > > > > > > > > > > that noticably improves LBN situation. Idea is > > > > > > > > > > > > > > > to reserve some bandwidth for CHK transfers > > > > > > > > > > > > > > > (and SSK inserts, as those are too rare to > > > > > > > > > > > > > > > penalize, and more valuable than requests). The > > > > > > > > > > > > > > > line directly before the inserted one > > > > > > > > > > > > > > > implicitly penalizes CHK transfers (as much > > > > > > > > > > > > > > > smaller SSK requests tend to rereserve > > > > > > > > > > > > > > > bandwidth the next moment it got released after > > > > > > > > > > > > > > > CHK transfer finish, while much larger CHK > > > > > > > > > > > > > > > requests do not have such good chance), so > > > > > > > > > > > > > > > bandwidth should be reserved for 2 CHKs at > > > > > > > > > > > > > > > least (and tests show that's enough to make a > > > > > > > > > > > > > > > difference). > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Another thing I tried was increasing the 90 > > > > > > > > > > > > > > > seconds period up to 120. That had some (no > > > > > > > > > > > > > > > numbers here; just "noticeable but small") > > > > > > > > > > > > > > > positive effect on making traffic smoother and > > > > > > > > > > > > > > > staying closer to set limit, without jumping up > > > > > > > > > > > > > > > and down too much. Where the 90 seconds number > > > > > > > > > > > > > > > came from anyway, and how dangerous 120 could > > > > > > > > > > > > > > > be? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Some pros observed and/or thought out during > > > > > > > > > > > > > > > tests of the patch: - I observe increase of > > > > > > > > > > > > > > > output payload by approx. 15% (of total > > > > > > > > > > > > > > > traffic), making LBN more useful for its peers. > > > > > > > > > > > > > > > - the change is negligibly small for faster > > > > > > > > > > > > > > > nodes so should not break anything globally. - > > > > > > > > > > > > > > > entire network SSK flood traffic will be toned > > > > > > > > > > > > > > > down a little bit (at temporary overloaded > > > > > > > > > > > > > > > nodes only), additionally simplifying life for > > > > > > > > > > > > > > > LBNs: after all, requesting the same SSK every > > > > > > > > > > > > > > > 15 seconds for 35 hours, total 8100 times > > > > > > > > > > > > > > > (factual numbers from one of the test before > > > > > > > > > > > > > > > this patch applied; there are over 60 other > > > > > > > > > > > > > > > SSKs that were requested more than 1000 times > > > > > > > > > > > > > > > during the same period) is just way too much, > > > > > > > > > > > > > > > SSKs are not inserted into network THAT fast. > > > > > > > > > > > > > > > [does it worth to remember recently seen SSK > > > > > > > > > > > > > > > requests, and do not forward them if same > > > > > > > > > > > > > > > request was already forwarded within last 10 > > > > > > > > > > > > > > > minutes and resulted in DNF/RNF? Table of > > > > > > > > > > > > > > > recently requested SSKs that are closest to the > > > > > > > > > > > > > > > node location should not be too big?]. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > And contras: > > > > > > > > > > > > > > > - in exceptional conditions (specificially, > > > > > > > > > > > > > > > with less than 2 incoming CHK requests per 90 > > > > > > > > > > > > > > > seconds; factually I observe 2-7 CHK requests > > > > > > > > > > > > > > > per seconds, that's 180-630 per 90 seconds) > > > > > > > > > > > > > > > notwithstanding node bandwidth speed, up to 800 > > > > > > > > > > > > > > > Bps might end being unused. For high bandwidth > > > > > > > > > > > > > > > node that's just way too small to notice, for > > > > > > > > > > > > > > > LBN that's still acceptable (10% of 56Kbps) and > > > > > > > > > > > > > > > will decrease roundtrip delays a bit which is > > > > > > > > > > > > > > > always a good thing for so slow links. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Other notes: > > > > > > > > > > > > > > > - distribution of location closeness/number of > > > > > > > > > > > > > > > SSK requests is very nice: only SSK requests > > > > > > > > > > > > > > > with location very close to node location get > > > > > > > > > > > > > > > repeated frequently; farther SSK location is, > > > > > > > > > > > > > > > less requests the node sees, with those SSKs > > > > > > > > > > > > > > > seen only once or two times per 1-2 days period > > > > > > > > > > > > > > > are distributed evenly among location space. > > > > > > > > > > > > > > > This suggests that routing is working fine. - > > > > > > > > > > > > > > > As far as I understand, if input bandwidth > > > > > > > > > > > > > > > limit/liability exceeded (but a packet already > > > > > > > > > > > > > > > received anyway), CHK/SSK request gets > > > > > > > > > > > > > > > instantly rejected (thus throwing out received > > > > > > > > > > > > > > > bytes while input bandwidth has no spare > > > > > > > > > > > > > > > volume!); only otherwise node checks if the > > > > > > > > > > > > > > > requested key exists in the storage. Heh? This > > > > > > > > > > > > > > > feels like a serious bug hurting overall > > > > > > > > > > > > > > > network performance: better query storage and > > > > > > > > > > > > > > > hopefully send back result (or still reject if > > > > > > > > > > > > > > > the key not found locally) rather than wait for > > > > > > > > > > > > > > > retry request to waste more input bandwidth. At > > > > > > > > > > > > > > > least for SSK reject and reply are comparable > > > > > > > > > > > > > > > in output bandwidth usage, so worth a little > > > > > > > > > > > > > > > delay in response. Or do I miss something? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > === > > > > > > > > > > > > > > > diff --git > > > > > > > > > > > > > > > a/freenet/src/freenet/node/NodeStats.java > > > > > > > > > > > > > > > b/freenet/src/freenet/node/NodeStats.java > > > > > > > > > > > > > > > index 3b091b4..fb9f8b9 100644 > > > > > > > > > > > > > > > --- a/freenet/src/freenet/node/NodeStats.java > > > > > > > > > > > > > > > +++ b/freenet/src/freenet/node/NodeStats.java > > > > > > > > > > > > > > > @@ -414,6 +414,7 @@ public class NodeStats > > > > > > > > > > > > > > > implements Persistable { > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > successfulChkInsertBytesReceivedAverage.current > > > > > > > > > > > > > > >Va lu e( ) * node.getNumCHKInserts() + > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > successfulSskInsertBytesReceivedAverage.current > > > > > > > > > > > > > > >Va lu e( ) * node.getNumSSKInserts(); > > > > > > > > > > > > > > > bandwidthLiabilityInput += > > > > > > > > > > > > > > > getSuccessfulBytes(isSSK, isInsert, > > > > > > > > > > > > > > > true).currentValue(); + if (isSSK > > > > > > > > > > > > > > > && !isInsert) > > > > > > > > > > > > > > > bandwidthLiabilityInput+=successfulChkFetchByte > > > > > > > > > > > > > > >sR ec ei ve dA ve ra ge .c ur re nt Va lu > > > > > > > > > > > > > > > e()+successfulChkInsertBytesReceivedAverage.cur > > > > > > > > > > > > > > >re nt Va lu e( ); // slightly penalize SSK > > > > > > > > > > > > > > > requests by reserving bandwidth for 2 > > > > > > > > > > > > > > > additional CHK transfers (or SSK inserts if > > > > > > > > > > > > > > > any) double bandwidthAvailableInput = > > > > > > > > > > > > > > > node.getInputBandwidthLimit() * 90; // 90 > > > > > > > > > > > > > > > seconds at full power > > > > > > > > > > > > > > > if(bandwidthLiabilityInput > > > > > > > > > > > > > > > > bandwidthAvailableInput) { === > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- > > > > > > > > > > > > > > > 2007.04.26 - 16:56:59GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Most SSK requests fail. They DNF. The reason > > > > > > > > > > > > > > > for this is most SSK requests are polling for > > > > > > > > > > > > > > > data that has not yet been inserted. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Bandwidth liability is usually the main reason > > > > > > > > > > > > > > > for rejection. If we reach most of the other > > > > > > > > > > > > > > > reasons, there is a problem - usually a > > > > > > > > > > > > > > > cyclical problem. The main reason for it is to > > > > > > > > > > > > > > > ensure that we don't accept so many requests > > > > > > > > > > > > > > > that some of them needlessly timeout even > > > > > > > > > > > > > > > though they succeeded. The timeout is 120 > > > > > > > > > > > > > > > seconds, so we need the actual transfer to take > > > > > > > > > > > > > > > less than this; on a request, 30 seconds seems > > > > > > > > > > > > > > > a reasonable upper bound for the search time. > > > > > > > > > > > > > > > We don't throw out many bytes when we reject a > > > > > > > > > > > > > > > request/insert because the bulk of it hasn't > > > > > > > > > > > > > > > been sent yet, except with SSKs where typically > > > > > > > > > > > > > > > a little under half of the total bytes will > > > > > > > > > > > > > > > have been moved. Ideally we wouldn't send > > > > > > > > > > > > > > > requests until we have a good idea that they > > > > > > > > > > > > > > > will be accepted, but token passing load > > > > > > > > > > > > > > > balancing is a long way off, not likely to > > > > > > > > > > > > > > > happen for 0.7.0. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > We cannot control input bandwidth usage > > > > > > > > > > > > > > > precisely. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Any more info on SSK flooding? Is it simply > > > > > > > > > > > > > > > Frost? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > We can add a failure table, we had one before, > > > > > > > > > > > > > > > however a failure table which results in > > > > > > > > > > > > > > > actually blocking keys can be extremely > > > > > > > > > > > > > > > dangerous; what I had envisaged was "per node > > > > > > > > > > > > > > > failure tables" i.e. reroute requests which > > > > > > > > > > > > > > > have recently failed to a different node since > > > > > > > > > > > > > > > we know it isn't where it's supposed to be. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On what do you base the assertion about key > > > > > > > > > > > > > > > closeness? It would be nice to have a histogram > > > > > > > > > > > > > > > or circle on the stats pages showing recent > > > > > > > > > > > > > > > keys on the keyspace - can you write a patch? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > As far as your patch goes, surely rejecting > > > > > > > > > > > > > > > more SSK requests would be counterproductive as > > > > > > > > > > > > > > > it wastes bandwidth? Shouldn't a slow node > > > > > > > > > > > > > > > accept those requests it's likely to be able to > > > > > > > > > > > > > > > handle? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I can see an argument that we shouldn't prefer > > > > > > > > > > > > > > > SSKs, and that on slow nodes we do prefer > > > > > > > > > > > > > > > SSKs... I'm not sure the above is the right way > > > > > > > > > > > > > > > to deal with it though. The effect of the patch > > > > > > > > > > > > > > > would be to never accept any SSKs unless we > > > > > > > > > > > > > > > have plenty of spare bandwidth, correct? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI > > > > > > > > > > > > > > > ----- 2007.04.26 - 18:41:32GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Ideally we wouldn't send requests until we > > > > > > > > > > > > > > > > have a good idea that they will > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > be accepted, but token passing load balancing > > > > > > > > > > > > > > > is a long way off, not likely to happen for > > > > > > > > > > > > > > > 0.7.0. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Well, even current algorithm implementation has > > > > > > > > > > > > > > > certain room for improvement. Here is the > > > > > > > > > > > > > > > typical numbers I observe: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > === > > > > > > > > > > > > > > > unclaimedFIFO Message Counts > > > > > > > > > > > > > > > * FNPRejectOverload: 89 (45.2%) > > > > > > > > > > > > > > > * FNPInsertTransfersCompleted: 59 (29.9%) > > > > > > > > > > > > > > > * FNPDataNotFound: 15 (7.6%) > > > > > > > > > > > > > > > * packetTransmit: 12 (6.1%) > > > > > > > > > > > > > > > * FNPRejectLoop: 7 (3.6%) > > > > > > > > > > > > > > > * FNPAccepted: 6 (3.0%) > > > > > > > > > > > > > > > * FNPSwapRejected: 4 (2.0%) > > > > > > > > > > > > > > > * FNPDataInsertRejected: 4 (2.0%) > > > > > > > > > > > > > > > * FNPRouteNotFound: 1 (0.5%) > > > > > > > > > > > > > > > * Unclaimed Messages Considered: 197 > > > > > > > > > > > > > > > === > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > FNPRejectOverload always stays at top sometimes > > > > > > > > > > > > > > > with hundreds messages (for the last hour > > > > > > > > > > > > > > > before unclaimed messages expire, that's alot), > > > > > > > > > > > > > > > and so indicates that there is some bug (or > > > > > > > > > > > > > > > bugs) with bandwidth limiting obeying. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Any more info on SSK flooding? Is it simply > > > > > > > > > > > > > > > > Frost? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Not local frost for sure, it generates just > > > > > > > > > > > > > > > several SSK simultaneous requests (by default > > > > > > > > > > > > > > > max 8: 6 for boards plus 2 for filesharing, > > > > > > > > > > > > > > > AFAIR; practically 2-4 simutaneous requests > > > > > > > > > > > > > > > most of the time). Other 100 SSK requests > > > > > > > > > > > > > > > (without proposed patch) are forwarded ones. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >We can add a failure table, we had one before, > > > > > > > > > > > > > > > > however a failure table which > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > results in actually blocking keys can be > > > > > > > > > > > > > > > extremely dangerous; > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Is it, having timeout of max few minutes (i.e. > > > > > > > > > > > > > > > at least few times less than SSK propagation > > > > > > > > > > > > > > > time visible with frost messages)? Is it more > > > > > > > > > > > > > > > dangerous than current wastage of bandwith for > > > > > > > > > > > > > > > same SSK key requests several times per minute? > > > > > > > > > > > > > > > Had some simulations been done on that in the > > > > > > > > > > > > > > > past? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > BTW, isn't the observed very low store hit rate > > > > > > > > > > > > > > > results from prioritising the likely-to-fail > > > > > > > > > > > > > > > SSKs? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > BTW2 the failure table could also act as a > > > > > > > > > > > > > > > targetted content propagation mechanism: if a > > > > > > > > > > > > > > > node sees SSK insert for a temporary > > > > > > > > > > > > > > > blacklisted (non-existing) SSK, then forwarding > > > > > > > > > > > > > > > the insert (more likely insert copy, for > > > > > > > > > > > > > > > security reasons and routing sake) to the > > > > > > > > > > > > > > > original requestor should speed up propagaton > > > > > > > > > > > > > > > of new SSKs toward the nodes that already > > > > > > > > > > > > > > > anticipate/await for them. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >what I had envisaged was "per node failure > > > > > > > > > > > > > > > > tables" i.e. reroute requests > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > which have recently failed to a different node > > > > > > > > > > > > > > > since we know it isn't where it's supposed to > > > > > > > > > > > > > > > be. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > At a glance, very nice idea. But LBNs typically > > > > > > > > > > > > > > > answer with reject, not DFN... even with > > > > > > > > > > > > > > > current code. Probably such rerouting will even > > > > > > > > > > > > > > > further increase SSK traffic toward LBNs, and > > > > > > > > > > > > > > > get sharply increased volume of SSK rejects as > > > > > > > > > > > > > > > result. Hmm, some testing/simulation seems > > > > > > > > > > > > > > > really needed here. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >On what do you base the assertion about key > > > > > > > > > > > > > > > > closeness? It would be nice to > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > have a histogram or circle on the stats pages > > > > > > > > > > > > > > > showing recent keys on the keyspace - can you > > > > > > > > > > > > > > > write a patch? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Mmmm... in fact I just added custom logging, > > > > > > > > > > > > > > > then a wild combination of grep/sed/sort/uniq > > > > > > > > > > > > > > > to analyze the logs. But let me think, maybe > > > > > > > > > > > > > > > visualizing a couple of stats files I operate > > > > > > > > > > > > > > > with will be rather trivial... > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > But I would rather stay away from stats page > > > > > > > > > > > > > > > graphics at this time, as the stats files I > > > > > > > > > > > > > > > operate (filtered+sorted+uniqued) with are > > > > > > > > > > > > > > > rather large, 20-50Mb each - too much memory > > > > > > > > > > > > > > > for the toy. Unless your 'recent' means just > > > > > > > > > > > > > > > 10-15 minutes at most? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >As far as your patch goes, surely rejecting > > > > > > > > > > > > > > > > more SSK requests would be > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > counterproductive as it wastes bandwidth? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Tests show the opposite: without the patch > > > > > > > > > > > > > > > payload output at stats page never exceeded > > > > > > > > > > > > > > > 38%, with patch it becomes 53% or little more > > > > > > > > > > > > > > > after several minutes upon node restart. So, > > > > > > > > > > > > > > > with the patch SSK/CHK forwarding behaviour > > > > > > > > > > > > > > > 'feels' logical: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > without patch: > > > > > > > > > > > > > > > - just several CHKs, and over over 100 SSKs > > > > > > > > > > > > > > > very typical. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > with patch: > > > > > > > > > > > > > > > - most of the time (say, 75%) number of > > > > > > > > > > > > > > > currently forwarded CHK requests+inserts > > > > > > > > > > > > > > > approximately equals to the number of SSK > > > > > > > > > > > > > > > requests+inserts (i.e. 10-25 each, depending on > > > > > > > > > > > > > > > set bandwidth limit); - sometimes (say, 10%) > > > > > > > > > > > > > > > CHK requests start to prevail, but current SSK > > > > > > > > > > > > > > > requests+inserts seems never go below the > > > > > > > > > > > > > > > amount which CHK get at max without patch (i.e. > > > > > > > > > > > > > > > 6-10). This is very typical when number of CHK > > > > > > > > > > > > > > > inserts gets several times higher than CHK > > > > > > > > > > > > > > > requests (close fast peer inserts something > > > > > > > > > > > > > > > really large?). - other times (say, 15%) CHK > > > > > > > > > > > > > > > requests+inserts flow does not saturate > > > > > > > > > > > > > > > bandwidth, and number of SSK requests quickly > > > > > > > > > > > > > > > climbs to 50 or even over 100+ as it typically > > > > > > > > > > > > > > > gets without the patch. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > That's for LBN. Raising input bandwidth > > > > > > > > > > > > > > > allotment, number of SSKs quickly grows > > > > > > > > > > > > > > > resembling the situation without the patch. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > So that's why I suggest reserving bandwidth for > > > > > > > > > > > > > > > 2 CHK transfers; 3 would kill SSKs, 1 still > > > > > > > > > > > > > > > makes SSKs to seriously prevail over CHKs (but > > > > > > > > > > > > > > > nonetheless gives quite better ratio, so is a > > > > > > > > > > > > > > > legal value to try if the value of 2 alarms you > > > > > > > > > > > > > > > too much). Just, in case of reserving bandwidth > > > > > > > > > > > > > > > for 1 extra CHK the proposed patch is not > > > > > > > > > > > > > > > really needed: simply comment out the line > > > > > > > > > > > > > > > starting with "bandwidthLiabilityInput +=" and > > > > > > > > > > > > > > > decrease 90 seconds constant to 80 (10 seconds > > > > > > > > > > > > > > > is roughly how much 33.6Kbod modem takes to > > > > > > > > > > > > > > > transmit a single CHK - using anything > > > > > > > > > > > > > > > noticeably slower than 28800/33600bod for > > > > > > > > > > > > > > > freenet will not ever work well anyway). > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >Shouldn't a slow node accept those requests > > > > > > > > > > > > > > > > it's likely to be able to handle? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Considering the very high chance of SSK request > > > > > > > > > > > > > > > failures (at lest 92%), I would say the answer > > > > > > > > > > > > > > > is no. But with sane SSK failure rate (say 75% > > > > > > > > > > > > > > > or below) SSK requests would likely not waste > > > > > > > > > > > > > > > the limited thus precious LBN bandwidth so > > > > > > > > > > > > > > > fruitlessly. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > The problem, in my belief, is too small size of > > > > > > > > > > > > > > > UDP packets if SSK requests prevail: > > > > > > > > > > > > > > > PPP(oE)/TCP/FNP overhead becomes too large > > > > > > > > > > > > > > > while LBNs, unlike faster link nodes, almost > > > > > > > > > > > > > > > never coalesce packets, obviously. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- > > > > > > > > > > > > > > > 2007.04.27 - 17:19:24GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > The current algorithm is working, on most > > > > > > > > > > > > > > > nodes, far better than it has in *ages*. I'm at > > > > > > > > > > > > > > > 62% of a 700MB ISO, I started inserting it > > > > > > > > > > > > > > > yesterday morning, and only a few of my peers > > > > > > > > > > > > > > > are backed off - frequently none are backed > > > > > > > > > > > > > > > off, right now it's 11 connected, 6 backed off, > > > > > > > > > > > > > > > which is more backed off than I've seen for > > > > > > > > > > > > > > > quite a while. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Re failure tables: Yes it is extremely > > > > > > > > > > > > > > > dangerous. It can result in self-reinforcing > > > > > > > > > > > > > > > key censorship, either as an attack or just > > > > > > > > > > > > > > > occurring naturally. This happened on 0.5. And > > > > > > > > > > > > > > > the hit ratio is only for CHKs iirc. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Even LBNs don't often send local > > > > > > > > > > > > > > > RejectedOverload's on SSKs *once they have > > > > > > > > > > > > > > > accepted them*. They may relay downstream RO's > > > > > > > > > > > > > > > but that is not fatal. And if they reject some > > > > > > > > > > > > > > > requests, so what, it's a slow node, it's bound > > > > > > > > > > > > > > > to reject some requests with the current load > > > > > > > > > > > > > > > balancing system. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 10-15 minutes would be interesting. We already > > > > > > > > > > > > > > > show a circle and histogram of nearby nodes > > > > > > > > > > > > > > > from swapping and of our peers, you'd just have > > > > > > > > > > > > > > > to add another one. It would be good to have a > > > > > > > > > > > > > > > visual proof that routing is working on the > > > > > > > > > > > > > > > level of adhering to node specialisations. I > > > > > > > > > > > > > > > didn't expect it to be working given the load: > > > > > > > > > > > > > > > I'm surprised that it does, it's an interesting > > > > > > > > > > > > > > > result. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Packet size has nothing to do with it, ethernet > > > > > > > > > > > > > > > has a 1472 byte maximum. Dial-up has 576 bytes > > > > > > > > > > > > > > > max, but we ignore it, and use fragmented > > > > > > > > > > > > > > > packets (this sucks, obviously, as it greatly > > > > > > > > > > > > > > > increases the chance of losing a packet and > > > > > > > > > > > > > > > having to retransmit it). > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Please explain why the patch doesn't result in > > > > > > > > > > > > > > > never accepting a single SSK? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI > > > > > > > > > > > > > > > ----- 2007.04.27 - 19:31:14GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >Packet size has nothing to do with it, > > > > > > > > > > > > > > > > ethernet has a 1472 byte maximum. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Dial-up has 576 bytes max, but we ignore it, > > > > > > > > > > > > > > > and use fragmented packets (this sucks, > > > > > > > > > > > > > > > obviously, as it greatly increases the chance > > > > > > > > > > > > > > > of losing a packet and having to retransmit > > > > > > > > > > > > > > > it). > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I am talking about typical/average packet size, > > > > > > > > > > > > > > > not MTU. LBNs, unlike faster nodes, rarely have > > > > > > > > > > > > > > > a chance to coalesce reject responses (over max > > > > > > > > > > > > > > > 100ms), and thus send improportionally more > > > > > > > > > > > > > > > tiny packets resulting in much higher protocols > > > > > > > > > > > > > > > overhead. Thus having LBNs to mostly cater SSKs > > > > > > > > > > > > > > > not CHKs results in lowest imaginable > > > > > > > > > > > > > > > usefulness of LBNs for network as a whole. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > BTW in my experience typical/default dialup/PPP > > > > > > > > > > > > > > > MTU is 1500 minus link level headers, like > > > > > > > > > > > > > > > ethernet. 576 is a reasonable adjustment for > > > > > > > > > > > > > > > interactive traffic like ssh but I fail to > > > > > > > > > > > > > > > remember if it was used as default since the > > > > > > > > > > > > > > > time the super fast 28800 bod modems became > > > > > > > > > > > > > > > common. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > :) 1400+ is the typical size of GPRS PPP > > > > > > > > > > > > > > > : packets too, and the same > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > holds true for other popular wireless mediae > > > > > > > > > > > > > > > like BlueTooth or WiFi; so I have no concerns > > > > > > > > > > > > > > > regarding IP fragmentation. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Please explain why the patch doesn't result > > > > > > > > > > > > > > > > in never accepting a single SSK? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I can not. :) Can you explain why the current > > > > > > > > > > > > > > > code that penalizes CHKs still gives 5% for > > > > > > > > > > > > > > > them, even if CHKs are 25 times larger and > > > > > > > > > > > > > > > similarly less frequent so have really hard > > > > > > > > > > > > > > > time to arrive at the exact moment when > > > > > > > > > > > > > > > bandwidth liability is not maxed out? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Seriously, I believe that goes with 2 facts: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > - SSK requests are much more frequent, so any > > > > > > > > > > > > > > > temporary drop of CHK requests level enables > > > > > > > > > > > > > > > node to quickly get a bunch of new SSKs > > > > > > > > > > > > > > > accepted for processing; - the large CHK > > > > > > > > > > > > > > > requests (at times while they prevail over > > > > > > > > > > > > > > > SSKs) tend to hit other limits too, like > > > > > > > > > > > > > > > "output bandwidth liability", "Insufficient > > > > > > > > > > > > > > > input/output bandwidth" throttles. Then the > > > > > > > > > > > > > > > small SSK requests quickly pick up all the > > > > > > > > > > > > > > > remaining bandwidth bits. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > But currently I do not have relevant statistics > > > > > > > > > > > > > > > to prove that. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Anyway, please commit the following patch - it > > > > > > > > > > > > > > > should equal out bandwidth rights for CHKs and > > > > > > > > > > > > > > > SSKs at least half way toward fair/expected > > > > > > > > > > > > > > > distribution (and the change will make any > > > > > > > > > > > > > > > difference for high-/over-loaded nodes only). > > > > > > > > > > > > > > > Once most of my peers (and their peers) update, > > > > > > > > > > > > > > > I will study the new node traffic forwarding > > > > > > > > > > > > > > > efficiency and behavior at different bandwidth > > > > > > > > > > > > > > > limits and with different penalization levels > > > > > > > > > > > > > > > again - and then will be in better position to > > > > > > > > > > > > > > > prove the original proposal of reserving > > > > > > > > > > > > > > > bandwidth for 2 CHKs is optimal (or maybe > > > > > > > > > > > > > > > withdraw it). > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > === > > > > > > > > > > > > > > > diff --git > > > > > > > > > > > > > > > a/freenet/src/freenet/node/NodeStats.java > > > > > > > > > > > > > > > b/freenet/src/freenet/node/NodeStats.java > > > > > > > > > > > > > > > index 3b091b4..98c82c3 100644 > > > > > > > > > > > > > > > --- a/freenet/src/freenet/node/NodeStats.java > > > > > > > > > > > > > > > +++ b/freenet/src/freenet/node/NodeStats.java > > > > > > > > > > > > > > > @@ -399,9 +399,8 @@ public class NodeStats > > > > > > > > > > > > > > > implements Persistable { > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > successfulSskFetchBytesSentAverage.currentValue > > > > > > > > > > > > > > >() * node.getNumSSKRequests() + > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > successfulChkInsertBytesSentAverage.currentValu > > > > > > > > > > > > > > >e( ) * node.getNumCHKInserts() + > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > successfulSskInsertBytesSentAverage.currentValu > > > > > > > > > > > > > > >e( ) * node.getNumSSKInserts(); > > > > > > > > > > > > > > > - bandwidthLiabilityOutput += > > > > > > > > > > > > > > > getSuccessfulBytes(isSSK, isInsert, > > > > > > > > > > > > > > > false).currentValue(); double > > > > > > > > > > > > > > > bandwidthAvailableOutput = - > > > > > > > > > > > > > > > node.getOutputBandwidthLimit() * 90; // 90 > > > > > > > > > > > > > > > seconds at full power; we have to leave some > > > > > > > > > > > > > > > time for the search as well + > > > > > > > > > > > > > > > node.getOutputBandwidthLimit() * 80; // 80 > > > > > > > > > > > > > > > seconds at full power; we have to leave some > > > > > > > > > > > > > > > time for the search as well > > > > > > > > > > > > > > > bandwidthAvailableOutput *= > > > > > > > > > > > > > > > NodeStats.FRACTION_OF_BANDWIDTH_USED_BY_REQUEST > > > > > > > > > > > > > > >S; if(bandwidthLiabilityOutput > > > > > > > > > > > > > > > > bandwidthAvailableOutput) { > > > > > > > > > > > > > > > preemptiveRejectReasons.inc("Output bandwidth > > > > > > > > > > > > > > > liability"); @@ -413,9 +412,8 @@ public class > > > > > > > > > > > > > > > NodeStats implements Persistable { > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > successfulSskFetchBytesReceivedAverage.currentV > > > > > > > > > > > > > > >al ue () * node.getNumSSKRequests() + > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > successfulChkInsertBytesReceivedAverage.current > > > > > > > > > > > > > > >Va lu e( ) * node.getNumCHKInserts() + > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > successfulSskInsertBytesReceivedAverage.current > > > > > > > > > > > > > > >Va lu e( ) * node.getNumSSKInserts(); > > > > > > > > > > > > > > > - bandwidthLiabilityInput += > > > > > > > > > > > > > > > getSuccessfulBytes(isSSK, isInsert, > > > > > > > > > > > > > > > true).currentValue(); double > > > > > > > > > > > > > > > bandwidthAvailableInput = - > > > > > > > > > > > > > > > node.getInputBandwidthLimit() * 90; // 90 > > > > > > > > > > > > > > > seconds at full power > > > > > > > > > > > > > > > + > > > > > > > > > > > > > > > node.getInputBandwidthLimit() * 80; // 80 > > > > > > > > > > > > > > > seconds at full power > > > > > > > > > > > > > > > if(bandwidthLiabilityInput > > > > > > > > > > > > > > > > bandwidthAvailableInput) { > > > > > > > > > > > > > > > preemptiveRejectReasons.inc("Input bandwidth > > > > > > > > > > > > > > > liability"); return "Input bandwidth > > > > > > > > > > > > > > > liability"; === > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- > > > > > > > > > > > > > > > 2007.04.28 - 17:05:53GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Why does assuming 80 seconds instead of 90 > > > > > > > > > > > > > > > help? I would have expected it to make the > > > > > > > > > > > > > > > situation worse. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Isn't what you want to increment the value you > > > > > > > > > > > > > > > are multiplying the CHK byte counters by if the > > > > > > > > > > > > > > > request is an SSK? In any case I'm not > > > > > > > > > > > > > > > convinced - we accept 32x as many SSKs as CHKs > > > > > > > > > > > > > > > precisely because they use 32x less bandwidth. > > > > > > > > > > > > > > > As far as I can see incrementing the CHK counts > > > > > > > > > > > > > > > but only on a CHK would just result in us never > > > > > > > > > > > > > > > accepting an SSK... > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > But by all means continue to investigate. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- > > > > > > > > > > > > > > > 2007.04.30 - 19:36:36GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > we accept 32x as many SSKs as CHKs precisely > > > > > > > > > > > > > > > > because they use 32x less > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > bandwidth. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Sorry but I don't understand the rationale > > > > > > > > > > > > > > > behind this. It seems to be based on the > > > > > > > > > > > > > > > assumption that equal resources should be > > > > > > > > > > > > > > > allocated to SSKs and CHKs, regardless of > > > > > > > > > > > > > > > whether there's equal demand for resources. If > > > > > > > > > > > > > > > we're only getting, say, 16 times as many SSK > > > > > > > > > > > > > > > requests as CHK requests, would we reject CHK > > > > > > > > > > > > > > > requests to keep things "fair"? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- > > > > > > > > > > > > > > > 2007.05.02 - 16:13:52GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Why should CHKs be prioritised over SSKs? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > What do you think of the patch I committed > > > > > > > > > > > > > > > anyway? > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI ----- > > > > > > > > > > > > > > 2007.05.02 - 17:03:52GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Why should CHKs be prioritised over SSKs? > > > > > > > > > > > > > > > > > > > > > > > > > > > > Because SSK success ratio is extremely low > > > > > > > > > > > > > > (remember the example I gave within initial > > > > > > > > > > > > > > message in the thread: 8100 rejected requests for > > > > > > > > > > > > > > the same SSK key within 35 hours, and uncounted > > > > > > > > > > > > > > amount of the same key requests resulted in DNF - > > > > > > > > > > > > > > and such key is nowhere near being alone); linear > > > > > > > > > > > > > > programming would certainly suggest that SSK > > > > > > > > > > > > > > requests like they currently are should be > > > > > > > > > > > > > > totally disabled. I do not propose anything as > > > > > > > > > > > > > > drastic; but as SSKs currently use bandwidth very > > > > > > > > > > > > > > inefficiently I propose to tone them down > > > > > > > > > > > > > > heuristically to approximately CHK level while > > > > > > > > > > > > > > node is short on bandwidth (but let SSKs go as > > > > > > > > > > > > > > much as sending node needs if spare bandwidth > > > > > > > > > > > > > > available). > > > > > > > > > > > > > > > > > > > > > > > > > > > > [not that I meant to speak instead of mrogers] > > > > > > > > > > > > > > > > > > > > > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- > > > > > > > > > > > > > > 2007.05.03 - 13:54:38GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > > > > > >> Why should CHKs be prioritised over SSKs? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Because SSK success ratio is extremely low > > > > > > > > > > > > > > > > > > > > > > > > > > > > That doesn't make sense for two reasons: > > > > > > > > > > > > > > > > > > > > > > > > > > > > 1) rejecting SSKs will make the SSK success ratio > > > > > > > > > > > > > > worse, not better 2) "SSK not found" is useful > > > > > > > > > > > > > > information - for example, that's how you > > > > > > > > > > > > > > discover the current version of a USK - but "SSK > > > > > > > > > > > > > > rejected for not being a CHK" is not useful to > > > > > > > > > > > > > > anyone > > > > > > > > > > > > > > > > > > > > > > > > > > > > Let me use an analogy: you're designing a Cisco > > > > > > > > > > > > > > router. Some of the packets it gets asked to > > > > > > > > > > > > > > forward will be small SSH packets, others will be > > > > > > > > > > > > > > large HTTP packets. Do you say "half our > > > > > > > > > > > > > > resources should go to SSH because we don't want > > > > > > > > > > > > > > to prioritise HTTP, so we'll only forward one > > > > > > > > > > > > > > HTTP packet for every 32 SSH packets"? If you > > > > > > > > > > > > > > answered yes, you just lost your job at Cisco. > > > > > > > > > > > > > > The router's job is to deliver packets to the > > > > > > > > > > > > > > best of its ability, not to decide what kind of > > > > > > > > > > > > > > packets the end hosts "should" be sending. > > > > > > > > > > > > > > > > > > > > > > > > > > ----- Anonymous ----- 2007.05.03 - 18:37:00GMT > > > > > > > > > > > > > ----- > > > > > > > > > > > > > > > > > > > > > > > > > > lets build an extreme case: > > > > > > > > > > > > > There is a packet type which is 1 MB in size and > > > > > > > > > > > > > one which is 1 byte in size. Both get constantly > > > > > > > > > > > > > send to a router at a higher rate then the routers > > > > > > > > > > > > > bandwidth quota allows it to forward the packets. > > > > > > > > > > > > > If the following rules apply not a single 1 MB > > > > > > > > > > > > > packet will get served: 1. the router doesn't care > > > > > > > > > > > > > for the size of the packet or penalises any kind of > > > > > > > > > > > > > packet, all are considered equal 2. if a packet > > > > > > > > > > > > > arrives and the remaining bandwidth quota doesn't > > > > > > > > > > > > > allow to forward it, it gets instantly rejected 3. > > > > > > > > > > > > > no queueing of incomming packets is done (with > > > > > > > > > > > > > part-allocation of available bandwidth if packet > > > > > > > > > > > > > size exceed the free quota) > > > > > > > > > > > > > > > > > > > > > > > > > > Afaik this is a possible situation for freenet, > > > > > > > > > > > > > correct me if I am wrong. > > > > > > > > > > > > > > > > > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- > > > > > > > > > > > > 2007.05.04 - 11:15:09GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > You're right, that pretty much describes the problem. > > > > > > > > > > > > I'm suggesting that we should fix it by modifying > > > > > > > > > > > > step 2: > > > > > > > > > > > > > > > > > > > > > > > > 2. if a packet arrives and the remaining bandwidth > > > > > > > > > > > > quota doesn't allow to forward *an average packet*, > > > > > > > > > > > > it gets instantly rejected > > > > > > > > > > > > > > > > > > > > > > > > The average is calculated over all packets, large and > > > > > > > > > > > > small. In other words we ask: > > > > > > > > > > > > > > > > > > > > > > > > a) how much bandwidth does a packet use, on average? > > > > > > > > > > > > b) is there enough bandwidth for another average > > > > > > > > > > > > packet? > > > > > > > > > > > > > > > > > > > > > > > > Let's say 75% of packets are 1 byte in size and 25% > > > > > > > > > > > > are 1 MB in size, so the average is 262,144.75 bytes. > > > > > > > > > > > > We accept packets (large or small) if we have at > > > > > > > > > > > > least 262,144.75 bytes of bandwidth left in the > > > > > > > > > > > > quota, and reject them otherwise. If there's a long > > > > > > > > > > > > stream of 1 byte packets followed by a 1 MB packet we > > > > > > > > > > > > might go over quota temporarily, but we'll match the > > > > > > > > > > > > quota in the long term. > > > > > > > > > > > > > > > > > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI ----- > > > > > > > > > > > > 2007.05.10 - 21:01:58GMT ----- > > > > > > > > > > > > > > > > > > > > > > > > Oh no, getting stuff instantly rejected is most often > > > > > > > > > > > > not good (an exception would be certain kinds of > > > > > > > > > > > > realtime traffic, but that is not applicable for > > > > > > > > > > > > freenet at all). I have some experience with > > > > > > > > > > > > independant/competing ISPs and their broken traffic > > > > > > > > > > > > shaping routers that were always dropping packets not > > > > > > > > > > > > fitting current shaping limits; TCP performance was > > > > > > > > > > > > experiencing major hit there, and several TCP > > > > > > > > > > > > connections running under the same shaping were > > > > > > > > > > > > always taking seriously unfair bandwidth share > > > > > > > > > > > > (unless you get quite long intervals for stats, like > > > > > > > > > > > > 10+ minutes). Changing shaping processing by queueing > > > > > > > > > > > > an over-quota packet (even a single packet queue!) > > > > > > > > > > > > till the calculated average bandwidth allows to send > > > > > > > > > > > > the packet (thus in the end increasing roundtrip > > > > > > > > > > > > slightly) was always sufficient for TCP flow to work > > > > > > > > > > > > at 100% of the shaped level, and having simultaneous > > > > > > > > > > > > TCP streams to very equally share available bandwidth > > > > > > > > > > > > even for sub-second stats intervals, and there were > > > > > > > > > > > > no other working solution found (aside raising the > > > > > > > > > > > > shaping limit above the maximum speed of TCP peers). > > > > > > > > > > > > > > > > > > > > > > > > I am not sure that can be directly applied to the > > > > > > > > > > > > current freenet networking code; honestly, the > > > > > > > > > > > > mechanism of first quickly accepting packets and then > > > > > > > > > > > > slowly picking them using some kind of filters looks > > > > > > > > > > > > unneccessary complicated and performance inoptimal, > > > > > > > > > > > > to say least: I have another bright example why - the > > > > > > > > > > > > mechanism quite resembles the traditional O/S network > > > > > > > > > > > > packets handling (with received packets extracted > > > > > > > > > > > > from NIC at highest priority - during hardware > > > > > > > > > > > > interrupt, and then having CPU/server business logic > > > > > > > > > > > > failing to process all received packets leading to > > > > > > > > > > > > internal queues overflow), and after years and > > > > > > > > > > > > decades it is generally agreed that such approach > > > > > > > > > > > > does not work well for server applications; instead, > > > > > > > > > > > > linux for several years already has mechanism named > > > > > > > > > > > > NAPI (which is optional for some NIC drivers - check > > > > > > > > > > > > kernel config, but default and mandatory for most > > > > > > > > > > > > server-grade and/or 1Gb NIC drivers): hardware > > > > > > > > > > > > interrupt just sets a flag/semaphore that NIC has > > > > > > > > > > > > received something, and instantly quits leaving the > > > > > > > > > > > > particular NIC interrupt line disabled (actual > > > > > > > > > > > > algorithm is a little bit more complex, allowing > > > > > > > > > > > > hardware interrupt to perform extraction of a very > > > > > > > > > > > > limited number of packets if the host is very idle). > > > > > > > > > > > > Then there is a lowest priority kernel thread > > > > > > > > > > > > ("software interrupt") woken up by the flag/semaphore > > > > > > > > > > > > starts reading packets from NIC into O/S queues > > > > > > > > > > > > (where user-level read()s get satisfied from), > > > > > > > > > > > > extracting only limited number of packets at a time > > > > > > > > > > > > (then yielding CPU for other runnable processes), and > > > > > > > > > > > > reenabling the NIC interrupts only when it managed to > > > > > > > > > > > > empty the hardware queue - with TCP flow control, and > > > > > > > > > > > > with the modern ethernet hardware flow control that > > > > > > > > > > > > works exceptionally well. Thus server business logic > > > > > > > > > > > > (i.e. useful work) running at priority much higher > > > > > > > > > > > > than software interrupt thread is never starved from > > > > > > > > > > > > CPU by hardware interrupts that first pull in packets > > > > > > > > > > > > which then result in CPU wasted to drop them from > > > > > > > > > > > > overflown system queue - resulting in smooth > > > > > > > > > > > > behaviour and best sustained performance. > > > > > > > > > > > > > > > > > > > > > > > > Or in short - on overload, delaying input packets > > > > > > > > > > > > reading/processing is better than dropping or > > > > > > > > > > > > rejecting them instantly. > > > > > > > > > > > > > > > > > > > > > > > > Toad - if you know a simple way to delay freenet > > > > > > > > > > > > reads from UDP socket in order to enforce configured > > > > > > > > > > > > input bandwidth limit, please do so. (And with that > > > > > > > > > > > > UDP read delay, I would be very interested to test > > > > > > > > > > > > freenet node without other input bandwidth limiters > > > > > > > > > > > > aside input bandwidth liability used - chances that > > > > > > > > > > > > the UDP socket read delay will be sufficient for > > > > > > > > > > > > quality shaping, with the valuable help of sending > > > > > > > > > > > > node tracking the roundtrip - an already well > > > > > > > > > > > > implemented feature). > > > > > > > > > > > > > > > > > > > > > > > > If the delay can not be done easily with the current > > > > > > > > > > > > codebase, I will consider doing major rewrite of the > > > > > > > > > > > > traffic accepting code part. Not of highest priority > > > > > > > > > > > > tho, due to anticipated large amount of work - but > > > > > > > > > > > > those high fruits look big and tasty. > > > > > > > > > > > > > > > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- > > > > > > > > > > > 2007.05.11 - 14:56:37GMT ----- > > > > > > > > > > > > > > > > > > > > > > > I am not sure that can be directly applied to the > > > > > > > > > > > > current freenet networking > > > > > > > > > > > > > > > > > > > > > > code; > > > > > > > > > > > > > > > > > > > > > > We're working on an idea called token-passing that's > > > > > > > > > > > supposed to address this: you can only send a search > > > > > > > > > > > (request/insert) to a peer if you have a flow control > > > > > > > > > > > token from that peer. If you don't have a token you > > > > > > > > > > > either keep the search in a queue until you receive a > > > > > > > > > > > token, or send it to the next-best peer if the queue is > > > > > > > > > > > full. > > > > > > > > > > > > > > > > > > > > > > > the mechanism quite resembles the traditional O/S > > > > > > > > > > > > network packets handling > > > > > > > > > > > > > > > > > > > > > > (with received packets extracted from NIC at highest > > > > > > > > > > > priority - during hardware interrupt, and then having > > > > > > > > > > > CPU/server business logic failing to process all > > > > > > > > > > > received packets leading to internal queues overflow) > > > > > > > > > > > > > > > > > > > > > > Interesting point - in the new congestion control > > > > > > > > > > > layer, maybe the UDP reader shouldn't advance the > > > > > > > > > > > receiver window until the internal queues have dropped > > > > > > > > > > > below a certain size... but it might be tricky to > > > > > > > > > > > implement because the internal queues all belong to > > > > > > > > > > > different threads... > > > > > > > > > > > > > > > > > > > > > > > If the delay can not be done easily with the current > > > > > > > > > > > > codebase, I will > > > > > > > > > > > > > > > > > > > > > > consider doing major rewrite of the traffic accepting > > > > > > > > > > > code part. > > > > > > > > > > > > > > > > > > > > > > This is due to be rewritten soon anyway, so now's > > > > > > > > > > > probably a good time to make suggestions. > > > > > > > > > > > > > > > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI ----- > > > > > > > > > > > 2007.05.14 - 16:46:24GMT ----- > > > > > > > > > > > > > > > > > > > > > > While token passing would indeed smooth the traffic > > > > > > > > > > > out, it feels excessive: > > > > > > > > > > > > > > > > > > > > > > - it adds extra traffic; > > > > > > > > > > > - it creates additional traffic patterns, that quite > > > > > > > > > > > simplify attacks (like those aiming at reliably proving > > > > > > > > > > > that a particular request originates from attacked > > > > > > > > > > > node) against a node which all connections are > > > > > > > > > > > monitored (by ISP), and some of them are fast but > > > > > > > > > > > compromised (compromised peers). - it requires to pull > > > > > > > > > > > a > > > > > > > > > > > multidimensional set of heurictics on whom to send new > > > > > > > > > > > token out of a thin air, and those heuristics will tend > > > > > > > > > > > to disagree for different connection types. > > > > > > > > > > > > > > > > > > > > > > The method of delaying network reads (thats important - > > > > > > > > > > > and AFAIK the only major missing thing to get shaping > > > > > > > > > > > rolling smoothly already) should work similarly well > > > > > > > > > > > (might be even better): just consider the metric 'the > > > > > > > > > > > current peer roundtrip time is lower than the [peer] > > > > > > > > > > > average roundtrip time' as equivalence of 'the peer > > > > > > > > > > > gave us few tokens', and enjoy the bandwidth/crypt(CPU) > > > > > > > > > > > free virtual token passing which obeys both > > > > > > > > > > > hardware/ISP traffic shaping imposed limits, as well as > > > > > > > > > > > software configured limits - whichever is stricter. > > > > > > > > > > > > > > > > > > > > > > So I currently discorage implementing explicit token > > > > > > > > > > > passing, in favor of lower, equially tasty fruit. > > > > > > > > > > > > > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- > > > > > > > > > > 2007.05.17 - 21:40:27GMT ----- > > > > > > > > > > > > > > > > > > > > > - it adds extra traffic > > > > > > > > > > > > > > > > > > > > Um, right. "Here are n tokens" takes about 6 bytes: two > > > > > > > > > > for the message type, two for the message size, and two > > > > > > > > > > for the number of tokens (we're never going to hand out > > > > > > > > > > more than 65535 tokens in one go). It uses less traffic > > > > > > > > > > than "Can I send you a request?" "Yes" "Here's the > > > > > > > > > > request", and it avoids a round-trip. It also uses less > > > > > > > > > > traffic than "Can I send you a request?" "No", because if > > > > > > > > > > you don't have a token, you don't need to ask! > > > > > > > > > > > > > > > > > > > > > - it creates additional traffic patterns, that quite > > > > > > > > > > > simplify attacks (like > > > > > > > > > > > > > > > > > > > > those aiming at reliably proving that a particular > > > > > > > > > > request originates from attacked node) against a node > > > > > > > > > > which all connections are monitored (by ISP), and some of > > > > > > > > > > them are fast but compromised (compromised peers). > > > > > > > > > > > > > > > > > > > > Please explain how handing my peer some tokens reveals > > > > > > > > > > anything about traffic patterns that wasn't already > > > > > > > > > > visible to traffic analysis. If they can see the requests > > > > > > > > > > and results going back and forth, who cares if they can > > > > > > > > > > also see the tokens? > > > > > > > > > > > > > > > > > > > > > - it requires to pull a multidimensional set of > > > > > > > > > > > heurictics on whom to send > > > > > > > > > > > > > > > > > > > > new token out of a thin air, and those heuristics will > > > > > > > > > > tend to disagree for different connection types. > > > > > > > > > > > > > > > > > > > > No magical heuristics are needed - we hand out tokens as > > > > > > > > > > long as we're not overloaded (measured by total queueing > > > > > > > > > > delay, including the bandwidth limiter). That alone > > > > > > > > > > should be enough to outperform the current system, > > > > > > > > > > because we'll avoid wasting traffic on rejected searches. > > > > > > > > > > Then we can start thinking about clever token allocation > > > > > > > > > > policies to enforce fairness when the network's busy, > > > > > > > > > > without imposing unnecessary limits when the network's > > > > > > > > > > idle, etc etc. But token passing doesn't depend on any > > > > > > > > > > such policy - it's just a lower-bandwidth alternative to > > > > > > > > > > pre-emptive rejection. > > > > > > > > > > > > > > > > > > ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- 2007.05.19 - > > > > > > > > > 17:38:09GMT ----- > > > > > > > > > > > > > > > > > > We hand out tokens when we're not overloaded? What if later > > > > > > > > > on we get overloaded? How exactly do we determine the total > > > > > > > > > appropriate number of tokens in the system? > > > > > > > > > > > > > > > > > > Token passing would be really nice, it would solve the > > > > > > > > > flooding problem and remove a lot of alchemy... > > > > > > > > > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.05.20 - > > > > > > > > 11:19:36GMT ----- > > > > > > > > > > > > > > > > We determine the appropriate number of tokens by > > > > > > > > experimentation: as we approach overload we produce tokens > > > > > > > > more and more slowly, until at the overload point we don't > > > > > > > > produce tokens at all. For example, delay between producing > > > > > > > > tokens = MAX_DELAY/(MAX_DELAY - currentDelay) seconds, or > > > > > > > > something similar. > > > > > > > > > > > > > > > > We stop producing tokens when all the buckets are full. To > > > > > > > > limit the number of tokens in circulation, we adjust the > > > > > > > > bucket sizes. Each peer's bucket starts at size 0, and is > > > > > > > > reset to 0 whenever the peer reconnects. Whenever we add a > > > > > > > > token to an empty bucket, we increase its size by 1. Thus if > > > > > > > > a peer doesn't use the tokens we give it (ie doesn't empty > > > > > > > > its bucket), its bucket stays small. If it uses the tokens we > > > > > > > > give it (ie empties its bucket), we increase the size of its > > > > > > > > bucket as long as we're not overloaded (the bucket size is > > > > > > > > only increased when a token is handed out, which doesn't > > > > > > > > happen when we're overloaded). > > > > > > > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI ----- 2007.05.25 - > > > > > > > 11:45:36GMT ----- > > > > > > > > > > > > > > Even this brief description proposes 3 heuristics already: > > > > > > > > > > > > > > - "more slowly or something similar" > > > > > > > - "adjust bucket sizes" > > > > > > > - "stays small" > > > > > > > > > > > > > > No doubts complete practical implementation will involve quite > > > > > > > more, and I see no way to ensure they will all work smoothly > > > > > > > for all the wide variety of connection types. > > > > > > > > > > > > > > This also totally silences the burst problems, as well as > > > > > > > decreasing buckets during the bursts/overload periods. Kinda > > > > > > > extreme case: if you gave a node 5 tokens, and it decided to > > > > > > > use them 3 minutes later when the node got overloaded, what did > > > > > > > you gain with the tokens? That is a true Pandora box. > > > > > > > > > > > > > > In the end it is timing that matters, while tokens represent > > > > > > > data amount (and if you think of a formula time*bandwidth=data, > > > > > > > then bandwidth, generally speaking, is not constant due to > > > > > > > highly irregular traffic from different peers and other apps > > > > > > > sharing the same internet connection). Purely controlling the > > > > > > > latter will always be just a rough approximation of controlling > > > > > > > the former, alas. > > > > > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.05.25 - > > > > > > 17:20:00GMT ----- > > > > > > > > > > > > > I see no way to ensure they will all work smoothly for all the > > > > > > > wide variety > > > > > > > > > > > > of connection types > > > > > > > > > > > > That may be true, but can you ensure that with the current > > > > > > mechanism? > > > > > > > > > > > > > if you gave a node 5 tokens, and it decided to use them 3 > > > > > > > minutes later when > > > > > > > > > > > > the node got overloaded, what did you gain with the tokens? > > > > > > > > > > > > It shouldn't ever reach that point, because when you give out 4 > > > > > > tokens and get a burst that nearly overloads the node, you'll > > > > > > stop increasing the size of the buckets. > > > > > > > > > > > > > Purely controlling the latter will always be just a rough > > > > > > > approximation of > > > > > > > > > > > > controlling the former, alas. > > > > > > > > > > > > True, it's only a rough approximation and traffic is bursty and > > > > > > we can't predict the future, but all those things also apply to > > > > > > the current system. > > > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI ----- 2007.05.25 - > > > > > 20:35:30GMT ----- > > > > > > > > > > - I gave 4 tokens to peer A, and 4 tokens for peer B; > > > > > - peer A used up the token in one burst, causing local bandwidth > > > > > overage already. > > > > > - now if peer B decides to use up the tokens, my bandwidth is > > > > > already flooded badly. > > > > > > > > > > - I gave 2 tokens (generally: very small amount) to peer A, and 2 > > > > > tokens to peer B at this time; > > > > > - the peer A used up both of them, but peer B does not have > > > > > anything to request for now. > > > > > - as result, the available bandwidth is only half-loaded until peer > > > > > A explicitly given another few tokens; but giving away small > > > > > amounts of tokens puts traffic overhead (often in form of small > > > > > sized packets with highest overhead), and speed of feeding small > > > > > packs of tokens is seriously limited by roundtrip delays. > > > > > > > > > > Thus nothing is really gained with tokens, and fighting that > > > > > situation sounds fruitless, and the only reasonable approach is to > > > > > control the roundtrip delay instead of fighting it, by delaying > > > > > network reads as needed to shape incoming traffic. This gives > > > > > sending node not just boolen flag can/cannot send immediatelly, but > > > > > certain number to estimate optimal outgoing interpacket delay > > > > > toward a particular peer. > > > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.05.26 - > > > > > 19:31:25GMT ----- > > > > > > > > > > You're making the jump from 0 to 4 tokens as if there are no > > > > > intermediate stages. If 4 searches are enough to overload the node, > > > > > then after you give 2 tokens each to A and B, you'll get a burst > > > > > and stop increasing the size of the buckets. You should never reach > > > > > a situation where there are more tokens in circulation than you can > > > > > handle simultaneously. > > > > > > > > > > You're also confusing the number of tokens with the size of the > > > > > buckets (probably my fault for not explaining it properly). If you > > > > > give 2 tokens each to A and B, and A uses its tokens but B doesn't, > > > > > you're free to give 2 more tokens to A; there's no reason for A to > > > > > starve just because B is holding tokens. The only effect of B > > > > > holding tokens is to limit the size of the bursts you can get from > > > > > A to a level that will be safe even if you simultaneously get a > > > > > burst from B. To avoid making these limits too strict, we start > > > > > with small buckets and only increase the size of a bucket when it's > > > > > empty, so idle peers are limited to smaller bursts than active > > > > > peers, but the total burst size is still limited to what we can > > > > > handle. > > > > > > > > > > Obviously we should also have TCP-style congestion control between > > > > > peers, but that's not sufficient for network-wide load limiting in > > > > > my opinion (eg look at the original Gnutella, which used TCP > > > > > between peers but still had massive load limiting problems). > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI ----- 2007.05.27 - > > > > 08:54:29GMT ----- > > > > > > > > Why you suppose each peer submits a stable flow of traffic? I might > > > > be downloading long and time lengthy file, gaining a bunch of tokens > > > > from you; and then as download finishes, I still possess alot of > > > > tokens? > > > > > > > > As you start issuing tokens is smaller chunks, you experience higher > > > > overhead from small token packets which failed to coalesce within > > > > thin time frame. > > > > > > > > TCP style congestion control (ECN) is not between peers; its > > > > existance is primarily targetted at ECN being directly supported by > > > > all (most) TCP/IP routers - without ECN or with ECN not supported by > > > > routers along the path TCP flow control enforced by packet drops only > > > > (when roudtrip measurements happen to fail predicting real > > > > momentarily network load). > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.05.27 - > > > > 15:06:51GMT ----- > > > > > > > > > Why you suppose each peer submits a stable flow of traffic? > > > > > > > > I don't, that's why I have frequently mentioned bursts. > > > > > > > > > I might be downloading long and time lengthy file, gaining a bunch > > > > > of > > > > > > > > tokens from you; and then as download finishes, I still possess alot > > > > of tokens? > > > > > > > > Yes, if I have previously been able to cope with large bursts of > > > > traffic it's possible I will give you a large number of tokens. If > > > > not, I won't. So what's the problem? > > > > > > > > > As you start issuing tokens is smaller chunks, you experience > > > > > higher > > > > > > > > overhead from small token packets which failed to coalesce within > > > > thin time frame. > > > > > > > > The problem of coalescing small messages on low-bandwidth links is > > > > not specified to token-passing. It also applies to the current > > > > mechanism, with its "can I send you a search?" "yes/no" messages that > > > > would be eliminated by token-passing. > > > > > > > > Why you keep talking about ECN I have no idea... are you suggesting > > > > that dropping/marking Freenet searches would have a similar effect to > > > > dropping/marking TCP packets in ECN? I don't think the two cases are > > > > comparable: in TCP you have a stream of packets between the same > > > > endpoints, so it makes sense to ask the sender to slow down if one of > > > > the routers is overloaded. In Freenet each search is routed > > > > independently to a different location, so it makes no sense to ask > > > > the sender to slow down if one of the nodes is overloaded - future > > > > searches handled by that node will come from different senders > > > > anyway. What you need to do is ask the overloaded node's neighbours > > > > to put less load on it. If that means they can accept fewer searches, > > > > then they should ask their neighbours to put less load on them, and > > > > so on. > > > > > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI ----- 2007.05.27 - > > > > 18:38:46GMT ----- > > > > > > > > > Yes, if I have previously been able to cope with large bursts of > > > > > traffic > > > > > > > > it's possible I will give you a large number of tokens. If not, I > > > > won't. So what's the problem? > > > > > > > > Once several dormant peers start sending new traffic at approximately > > > > the same time, the tokens passing mechanism have no even teoretical > > > > chance to avoid bandwidth overages/packets drops. More subtle > > > > mechanisms needed in order for sending nodes to know/decide not only > > > > about that fact that more traffic can be sent, but also how fast that > > > > should be done if there is more than one packet to send. Once such > > > > mechanisms are correctly implemented (and in noticeable part they > > > > already are), I see no advantages the explicit tokens passing could > > > > add. > > > > > > > > > so it makes no sense to ask the sender to slow down if one of the > > > > > nodes is > > > > > > > > overloaded > > > > > > > > Oh, why it could be so? Requests for keys with close locations are > > > > likely to get routed via the same overloaded node, and with peer > > > > locations pattern I keep observing the 'closeness' might easily be as > > > > wide as 0.4 and even more (the range of locations that prefer the > > > > same peer). The requests sent recently (in term of hops passed, not > > > > time) show even distribution of the keys along the 0..1 space, so > > > > pushing 40% of traffic at a single peer and disregarding his overload > > > > cries can not be seen as good. > > > > > > > > The ECN distinguishing feature is that congestion/impending overload > > > > shared state gets maintained at all devices along the route > > > > (including endpoints) that at least potentially do traffic shaping > > > > (due to explicit settings or just overload). Lacking it, both TCP and > > > > FNP have to resort downto carefully tracking roundtrips, > > > > scurpuluously calculating all delays at routers and final hosts in > > > > order to react upon even minor degradations quickly (but smoothly). > > > > FNP gets more complicated, as packet processing efforts (including > > > > all the encryption/decryption) are not as negligible as with TCP, but > > > > not indoable - the packets/protocol already carry the temporal > > > > information implicitly, it just has to be handled a little bit more > > > > careful. > > > > > > > > OTOH, adding explicit auxilarly traffic (be it tokens assing or > > > > whatever) creates a certain dilemma: trying to maximize the variable > > > > bandwidth usage without overages, the additional even little (but for > > > > many links, not so little due to the massive FNP+UDP+IP enveloping) > > > > overhead might turn out to be the bit that still causes the overages > > > > (in fact, the 'bit' in extremely unluky events flow can get up to 20% > > > > of traffic). Isn't it better to keep using simpler protocol, maybe > > > > aiming it at 98% load if overages are known to cause unreasonably > > > > frequent packet drops, or just believed to be absolute evil? > > > > > > > > > > > > On a slightly different topic, how about wireless connections like > > > > radioethernet: high bandwidth and higher-than-average link delays are > > > > combined with constant non-zero packets drop rate (0.1-2%, but > > > > sometimes up to 5% in large city daytime, or in industrial area). > > > > Similar things with satellite links, during bad weather or in polar > > > > areas where any dish size is almost never sufficient. Explicitly > > > > passing tokens would be dangerous because of very high bursts: there > > > > might be 500KB data en-route for unidirectional SOHO grade satellite > > > > link, 1MB for bidirectional one. But if outstanding several hundreds > > > > tokens is not feasible and a little over a dozen KB is a limit, such > > > > links will be usable at 2-5% of available bandwidth at most. > > > > > > > > (You know how does TCP behave over such links? During periods of > > > > lower drop rate it works more or less acceptably, especially if you > > > > aren't in haste. At other times people simply get a teabrake or find > > > > another task for the time being. Solution here could be SCTP like > > > > protocols but they are very inmature and unpopular, and unlikely suit > > > > freenet needs). > > > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.05.28 - > > > > 22:10:09GMT ----- > > > > > > > > > Once several dormant peers start sending new traffic at > > > > > approximately the > > > > > > > > same time, the tokens passing mechanism have no even teoretical > > > > chance to avoid bandwidth overages/packets drops. > > > > > > > > We're going in circles here. As I've already said, you never have > > > > more tokens outstanding than you can handle if they come back > > > > *simultaneously*. So I will only allow you to accumulate a large > > > > number of tokens if I can handle all those tokens, and all other > > > > outstanding tokens, being used at once. We don't have any magic way > > > > of determining how many tokens we can handle at once, so we > > > > *gradually* increase the limits until we get close to overload. > > > > > > > > > More subtle mechanisms needed in order for sending nodes to > > > > > know/decide not > > > > > > > > only about that fact that more traffic can be sent, but also how fast > > > > that should be done if there is more than one packet to send. > > > > > > > > Yes, we need a TCP-like mechanism to avoid congestion between peers, > > > > but that's not enough to avoid overloading the peers themselves > > > > (rather than the individual links). > > > > > > > > > pushing 40% of traffic at a single peer and disregarding his > > > > > overload cries > > > > > > > > can not be seen as good > > > > > > > > When did I say we should ignore overload? I said the overloaded > > > > node's neighbours should respond, rather than the source of the > > > > traffic, because the overloaded node's neighbours have more control > > > > over the amount of load it receives than a source elsewhere on the > > > > network. > > > > > > > > > The ECN distinguishing feature is that congestion/impending > > > > > overload shared > > > > > > > > state gets maintained at all devices along the route > > > > > > > > But my point was that in FNP there's no concept of a 'route' as there > > > > is in TCP. A series of TCP packets will travel along (more or less) > > > > the same route between the same endpoints. A series of FNP requests > > > > will travel along diverging routes to completely different endpoints. > > > > So asking the source to slow down when it hits an overloaded node is > > > > shutting the stable door after the horse has bolted: the source has > > > > already moved on to some other route that might be more or less > > > > loaded than the current route. > > > > > > > > > Isn't it better to keep using simpler protocol > > > > > > > > Sorry, I don't see how the current backoff/throttling/preemptive > > > > rejection mechanisms are simpler than token-passing. Equally > > > > complicated, maybe, but not less. :-) > > > > > > > > > Solution here could be SCTP like protocols but they are very > > > > > inmature and > > > > > > > > unpopular, and unlikely suit freenet needs > > > > > > > > Yup, when I was working on the new congestion control design last > > > > year I considered copying DCCP or TCP Vegas to be more loss-tolerant > > > > (and it's still a possibility, if you want to design and document > > > > it). But in the end I decided the rest of the world was going to > > > > carry on using TCP, no matter how unsuitable, and the world's > > > > networks would be made suitable for TCP by hook or by crook (or by > > > > ugly MAC-layer > > > > retransmission hacks), so we could just copy TCP and let the layer 2 > > > > engineers solve the problem. :-) > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.05.28 - > > > 22:10:09GMT ----- > > > > > > > Once several dormant peers start sending new traffic at approximately > > > > the > > > > > > same time, the tokens passing mechanism have no even teoretical chance > > > to avoid bandwidth overages/packets drops. > > > > > > We're going in circles here. As I've already said, you never have more > > > tokens outstanding than you can handle if they come back > > > *simultaneously*. So I will only allow you to accumulate a large number > > > of tokens if I can handle all those tokens, and all other outstanding > > > tokens, being used at once. We don't have any magic way of determining > > > how many tokens we can handle at once, so we *gradually* increase the > > > limits until we get close to overload. > > > > > > ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- 2007.05.29 - 01:26:17GMT > > > ----- > > > > > > Okay, so just like the current code, we avoid timeouts by sacrificing > > > bandwidth - sometimes, sacrificing A LOT of bandwidth. Is that bad? > > > > > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.05.29 - > > > 19:47:54GMT ----- > > > > > > We'd be sacrificing a lot of bandwidth at startup, but eventually we > > > should reach full speed... I guess it partly depends on how long we > > > expect nodes to stay up. > > > > ----- Anonymous at o9_0DTuZniSf_+oDmRsonByWxsI ----- 2007.05.30 - > > 11:03:00GMT ----- > > > > 1-2 hours at most. > > > > Even if freenet nodes typically stay online much much longer, daily > > effective/alloted bandwidth fluctations make any preformance-related > > statistics over longer periods pretty meaningless. Only stats like > > average packet size numbers do not vary noticeably. > > ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.06.02 - 16:44:09GMT > ----- > > I've given this some more thought and realised you're right: we don't need > to send special messages to inform our peers they have tokens. We can > handle it all internally by delaying network reads whenever we're > overloaded to cause the connections to block. (This will require some minor > modifications to the new congestion control design, because it currently > uses a huge receiver window - I'm chasing a deadline this weekend but I'll > make the changes to the wiki next week.) > > I still think we should use the token idea internally, to enforce fairness > by deciding which network connections to read from and which to leave > blocked. But that can wait for a later stage - the current problem is > avoiding overload, which doesn't require tokens.
----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- 2007.06.04 - 15:16:23GMT ----- I don't follow. Don't we want to tell the node when it can send a request, so that it can deal with the situation where it doesn't have any tokens? I'm really not convinced by this don't-read-from-network idea: there could be *anything* in the incoming packet, it could be a request (in which case we may want to delay it), it could be data returning from a request we did (in which case we probably want to accept it, and not doing so may result in a timeout and retry => even more load), etc. The only way to tell the difference is to read and decode the packet. ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.06.07 - 10:56:37GMT ----- You're right that if the incoming data is a reply to a locally generated request, it won't cause any additional outgoing load. But that's the exception rather than the rule: almost any other type of message will cause additional outgoing load. The current solution is to read the data, work out whether we can handle it, and either accept or reject it. That raises the question: should we accept one kind of traffic while rejecting another? If yes, we give network-wide preference to whichever kind of traffic happens to involve smaller quanta: SSKs are accepted more often than CHKs, and requests are accepted more often than inserts. This has nasty network-wide side-effects. If no, why are we bothering to decode and examine the packets? Instead of saying "you can send me n more searches before blocking" why not just say "you can send me n more bytes before blocking"? Well TCP sockets already do that - you don't need explicit token-passing. Imagine that each peer connection has a socket-like interface: if we don't read from a socket, the other end blocks but no packets are lost. When we have too much data in our outgoing queues, such that adding any more data would cause a timeout, we stop reading from our incoming sockets until the outgoing queues have drained. Ideally, "sockets" would mean client connections as well as peer connections - they'd both be wrapped in a similar socket-like interface. (I'm not saying we should switch to TCP, just that we should use a TCP-like interface for peer and client connections.) To implement this, we keep a running average of our total output speed. If the number of bytes currently queued divided by the average output speed exceeds the maximum delay, we don't read from any sockets. When the queues have drained a bit, we start reading again. To replace backoff, we also keep a running average of the output speed to each peer, and if that peer's queue exceeds the maximum delay, we don't route to it. We can easily build mechanisms on top of this to enforce fairness: by choosing which sockets to read from we can control how much load we accept from each peer and/or client. That's why I talked about using token buckets internally. But no explicit token-passing is required, because blocking or unblocking the socket gives the peer the necessary information. ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- 2007.06.07 - 14:19:02GMT ----- Not true. A 1kB packet containing only requests will produce a lot of load. A 1kB packet containing a data transfer packet will in the long term reduce load by preventing timeout and retry and misrouting, and in the short term will produce minimal load. We have to decode the packet, THEN decide what to do with its contents. Because a data transfer block is completely different to 20+ requests, even though they take up the same space. If we accept requests at our input bandwidth limit, we will VERY rapidly reach a situation where they are all timing out because we can't possibly transfer data at the speed required for them all to complete within the timeout. Even if only a small fraction of the requests succeed, a constant stream of requests will rapidly result in collapse. ----- mrogers at UU62+3E1vKT1k+7fR0Gx7ZN2IB0 ----- 2007.06.07 - 14:59:23GMT ----- I'm not suggesting we should accept requests at our input bandwidth limit, and I'm not suggesting we should process the input one packet at a time. Obviously the lower layers will need to decrypt and authenticate a whole packet at a time, just as they do with TLS, but I'm talking about what happens at the FNP layer, which just sees a socket that you can read FNP messages from and write FNP messages to. At that layer, we should read one FNP message at a time, and if there's space in the output queues after processing that message, we should read another one. In the meantime the sender will be blocked, so we'll end up in a situation where the senders (peers and clients combined) can only send requests as quickly as we can process them. It's similar to token-passing, but we let the transport-layer handle flow control instead of using explicit stop/start messages. ----- toad at zceUWxlSaHLmvEMnbr4RHnVfehA ----- 2007.06.07 - 15:54:06GMT ----- See my reply to your other mail. -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 189 bytes Desc: not available URL: <https://emu.freenetproject.org/pipermail/tech/attachments/20070808/b997673f/attachment.pgp>