summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-08-23 11:36:06 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2022-08-23 11:36:06 +0200
commita38b7742b4060d34d01a144815b6c0944350f30f (patch)
treee0ba759bfa77b67a5d231c555ee50a488e6f36cb /container-search
parentb896e0243677f86fb61a57df3ae6cde09c54b67d (diff)
Use a continous function to avoid capping.
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java6
-rw-r--r--container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java24
2 files changed, 14 insertions, 16 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java b/container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java
index 04855bf24ed..59821827d4e 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java
@@ -15,7 +15,6 @@ import java.util.logging.Logger;
/**
* LoadBalancer determines which group of content nodes should be accessed next for each search query when the
* internal java dispatcher is used.
- *
* The implementation here is a simplistic least queries in flight + round-robin load balancer
*
* @author ollivir
@@ -244,9 +243,8 @@ public class LoadBalancer {
}
public void decay(RequestDuration duration) {
double searchTime = Math.max(toDouble(duration.duration()), MIN_QUERY_TIME);
- double decayRate = LATENCY_DECAY_TIME;
- double sampleWeight = Math.min(decayRate/2, toDouble(duration.difference(prev)));
- averageSearchTime = (sampleWeight*searchTime + (decayRate - sampleWeight) * averageSearchTime) / decayRate;
+ double sampleWeight = toDouble(duration.difference(prev));
+ averageSearchTime = (sampleWeight*searchTime + LATENCY_DECAY_TIME * averageSearchTime) / (LATENCY_DECAY_TIME + sampleWeight);
prev = duration;
}
public double averageCost() { return averageSearchTime; }
diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java b/container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java
index ddf4fae5cba..ce3876e59c1 100644
--- a/container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java
+++ b/container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java
@@ -212,22 +212,22 @@ public class LoadBalancerTest {
GroupStatus.Decayer decayer = new AdaptiveScheduler.DecayByTime(Duration.ofMillis(2), RequestDuration.of(Instant.EPOCH, Duration.ZERO));
assertEquals(0.002, decayer.averageCost(), delta);
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(1000), Duration.ofMillis(10)));
- assertEquals(0.003616, decayer.averageCost(), delta);
+ assertEquals(0.003344426, decayer.averageCost(), delta);
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(2000), Duration.ofMillis(10)));
- assertEquals(0.0048928, decayer.averageCost(), delta);
+ assertEquals(0.004453688, decayer.averageCost(), delta);
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(3000), Duration.ofMillis(10)));
- assertEquals(0.00591424, decayer.averageCost(), delta);
+ assertEquals(0.005378073, decayer.averageCost(), delta);
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(3100), Duration.ofMillis(10)));
- assertEquals(0.0059959552, decayer.averageCost(), delta);
+ assertEquals(0.005468700, decayer.averageCost(), delta);
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(3100), Duration.ofMillis(10)));
- assertEquals(0.0059959552, decayer.averageCost(), delta);
+ assertEquals(0.005468700, decayer.averageCost(), delta);
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(3000), Duration.ofMillis(10)));
- assertEquals(0.006076036096, decayer.averageCost(), delta);
+ assertEquals(0.005557549, decayer.averageCost(), delta);
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(5000), Duration.ofMillis(10)));
- assertEquals(0.0076456216576000005, decayer.averageCost(), delta);
- assertEquals(110, countRequestsToReach90p(Duration.ofMillis(100), Duration.ofMillis(10)));
- assertEquals(55, countRequestsToReach90p(Duration.ofMillis(200), Duration.ofMillis(10)));
- assertEquals(11, countRequestsToReach90p(Duration.ofMillis(1000), Duration.ofMillis(10)));
+ assertEquals(0.006826820, decayer.averageCost(), delta);
+ assertEquals(112, countRequestsToReach90p(Duration.ofMillis(100), Duration.ofMillis(10)));
+ assertEquals(57, countRequestsToReach90p(Duration.ofMillis(200), Duration.ofMillis(10)));
+ assertEquals(14, countRequestsToReach90p(Duration.ofMillis(1000), Duration.ofMillis(10)));
}
@Test
@@ -236,8 +236,8 @@ public class LoadBalancerTest {
assertEquals(0.002, decayer.averageCost(), delta);
assertEquals(Duration.ofMillis(2), decayer.averageSearchTime());
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(10000), Duration.ofMillis(10)));
- assertEquals(0.006, decayer.averageCost(), delta); // Capped at 50% sampleWeight
- assertEquals(Duration.ofMillis(6), decayer.averageSearchTime());
+ assertEquals(0.007335110, decayer.averageCost(), delta);
+ assertEquals(Duration.ofNanos(7335109), decayer.averageSearchTime());
}