diff options
author | Joseph Henry <josephjah@gmail.com> | 2018-06-12 16:30:46 -0700 |
---|---|---|
committer | Joseph Henry <josephjah@gmail.com> | 2018-06-12 16:30:46 -0700 |
commit | 0faa655b834be45d379c84769604b5c43f734650 (patch) | |
tree | 18fa39de247e0989ddddfbe54d9a74d9e80548b2 | |
parent | 6fddf31db31a6f3d0f9c6dd7e611543f56d6fc2f (diff) | |
download | infinitytier-0faa655b834be45d379c84769604b5c43f734650.tar.gz infinitytier-0faa655b834be45d379c84769604b5c43f734650.zip |
Reduced how often relative path qualities and aggregate link allocations are computed
-rw-r--r-- | node/Constants.hpp | 3 | ||||
-rw-r--r-- | node/Path.hpp | 19 | ||||
-rw-r--r-- | node/Peer.cpp | 33 | ||||
-rw-r--r-- | node/Peer.hpp | 7 |
4 files changed, 38 insertions, 24 deletions
diff --git a/node/Constants.hpp b/node/Constants.hpp index d4f6faaf..0d3692f1 100644 --- a/node/Constants.hpp +++ b/node/Constants.hpp @@ -305,8 +305,7 @@ #define ZT_PATH_LATENCY_SAMPLE_INTERVAL ZT_MULTIPATH_PEER_PING_PERIOD * 2 /** - * Interval used for rate-limiting the computation of path quality estimates. Set at 0 - * to compute as new packets arrive with no delay. + * Interval used for rate-limiting the computation of path quality estimates. */ #define ZT_PATH_QUALITY_COMPUTE_INTERVAL 1000 diff --git a/node/Path.hpp b/node/Path.hpp index 71615d50..e0426323 100644 --- a/node/Path.hpp +++ b/node/Path.hpp @@ -119,7 +119,8 @@ public: _packetErrorRatio(0.0), _packetLossRatio(0), _lastComputedStability(0.0), - _lastComputedRelativeQuality(0) + _lastComputedRelativeQuality(0), + _lastAllocation(0.0) { prepareBuffers(); } @@ -149,7 +150,8 @@ public: _packetErrorRatio(0.0), _packetLossRatio(0), _lastComputedStability(0.0), - _lastComputedRelativeQuality(0) + _lastComputedRelativeQuality(0), + _lastAllocation(0.0) { prepareBuffers(); _phy->getIfName((PhySocket *)((uintptr_t)_localSocket), _ifname, 16); @@ -519,6 +521,18 @@ public: inline float relativeQuality() { return _lastComputedRelativeQuality; } /** + * Assign a new allocation value for this path in the aggregate link + * + * @param allocation Percentage of traffic to be sent over this path to a peer + */ + inline void updateComponentAllocationOfAggregateLink(float allocation) { _lastAllocation = allocation; } + + /** + * @return Percentage of traffic allocated to this path in the aggregate link + */ + inline float allocation() { return _lastAllocation; } + + /** * @return Stability estimates can become expensive to compute, we cache the most recent result. */ inline float lastComputedStability() { return _lastComputedStability; } @@ -682,6 +696,7 @@ private: // cached estimates float _lastComputedStability; float _lastComputedRelativeQuality; + float _lastAllocation; // cached human-readable strings for tracing purposes char _ifname[16]; diff --git a/node/Peer.cpp b/node/Peer.cpp index 8b385ecc..55132bba 100644 --- a/node/Peer.cpp +++ b/node/Peer.cpp @@ -66,7 +66,8 @@ Peer::Peer(const RuntimeEnvironment *renv,const Identity &myIdentity,const Ident _linkIsBalanced(false), _linkIsRedundant(false), _remotePeerMultipathEnabled(false), - _lastAggregateStatsReport(0) + _lastAggregateStatsReport(0), + _lastAggregateAllocation(0) { if (!myIdentity.agree(peerIdentity,_key,ZT_PEER_SECRET_KEY_LENGTH)) throw ZT_EXCEPTION_INVALID_ARGUMENT; @@ -289,7 +290,7 @@ void Peer::recordIncomingPacket(void *tPtr, const SharedPtr<Path> &path, const u } } -float Peer::computeAggregateLinkRelativeQuality(int64_t now) +void Peer::computeAggregateProportionalAllocation(int64_t now) { float maxStability = 0; float totalRelativeQuality = 0; @@ -326,7 +327,12 @@ float Peer::computeAggregateLinkRelativeQuality(int64_t now) _paths[i].p->updateRelativeQuality(relQuality); } } - return (float)1.0 / totalRelativeQuality; // Used later to convert relative quantities into flow allocations + // Convert set of relative performances into an allocation set + for(uint16_t i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) { + if (_paths[i].p) { + _paths[i].p->updateComponentAllocationOfAggregateLink(_paths[i].p->relativeQuality() / totalRelativeQuality); + } + } } float Peer::computeAggregateLinkPacketDelayVariance() @@ -453,8 +459,6 @@ SharedPtr<Path> Peer::getAppropriatePath(int64_t now, bool includeExpired) * Proportionally allocate traffic according to dynamic path quality measurements */ if (RR->node->getMultipathMode() == ZT_MULTIPATH_PROPORTIONALLY_BALANCED) { - float alloc[ZT_MAX_PEER_NETWORK_PATHS]; - memset(&alloc, 0, sizeof(alloc)); int numAlivePaths = 0; int numStalePaths = 0; int alivePaths[ZT_MAX_PEER_NETWORK_PATHS]; @@ -476,34 +480,27 @@ SharedPtr<Path> Peer::getAppropriatePath(int64_t now, bool includeExpired) bestPath = i; } } - - // Compare paths to each-other - float qualityScalingFactor = computeAggregateLinkRelativeQuality(now); - + if ((now - _lastAggregateAllocation) >= ZT_PATH_QUALITY_COMPUTE_INTERVAL) { + _lastAggregateAllocation = now; + computeAggregateProportionalAllocation(now); + } if (numAlivePaths == 0 && numStalePaths == 0) { return SharedPtr<Path>(); } if (numAlivePaths == 1 || numStalePaths == 1) { return _paths[bestPath].p; } - - // Convert set of relative performances into an allocation set - for(uint16_t i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) { - if (_paths[i].p) { - alloc[i] = _paths[i].p->relativeQuality() * qualityScalingFactor; - } - } // Randomly choose path according to their allocations unsigned int r; Utils::getSecureRandom(&r, 1); float rf = (float)(r %= 100) / 100; for(int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) { if (_paths[i].p) { - if (rf < alloc[i]) { + if (rf < _paths[i].p->allocation()) { bestPath = i; _pathChoiceHist->push(bestPath); // Record which path we chose break; } - rf -= alloc[i]; + rf -= _paths[i].p->allocation(); } } if (bestPath < ZT_MAX_PEER_NETWORK_PATHS) { diff --git a/node/Peer.hpp b/node/Peer.hpp index 8807662d..21e8cbf2 100644 --- a/node/Peer.hpp +++ b/node/Peer.hpp @@ -194,9 +194,11 @@ public: void sendQOS_MEASUREMENT(void *tPtr, const SharedPtr<Path> &path, const int64_t localSocket,const InetAddress &atAddress,int64_t now); /** - * @return The relative quality values for each path + * Compute relative quality values and allocations for the components of the aggregate link + * + * @param now Current time */ - float computeAggregateLinkRelativeQuality(int64_t now); + void computeAggregateProportionalAllocation(int64_t now); /** * @return The aggregate link Packet Delay Variance (PDV) @@ -677,6 +679,7 @@ private: bool _remotePeerMultipathEnabled; uint64_t _lastAggregateStatsReport; + uint64_t _lastAggregateAllocation; char _interfaceListStr[256]; // 16 characters * 16 paths in a link }; |