summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java1
-rw-r--r--configdefinitions/src/vespa/dispatch.def3
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java24
-rw-r--r--vespajlib/src/main/java/com/yahoo/compress/Compressor.java26
4 files changed, 54 insertions, 0 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java
index e8e02d8aba1..3c45b29b1e2 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java
@@ -334,6 +334,7 @@ public class IndexedSearchCluster extends SearchCluster
if (searchCoverage.getMaxWaitAfterCoverageFactor() != null)
builder.maxWaitAfterCoverageFactor(searchCoverage.getMaxWaitAfterCoverageFactor());
}
+ builder.warmuptime(5.0);
}
@Override
diff --git a/configdefinitions/src/vespa/dispatch.def b/configdefinitions/src/vespa/dispatch.def
index 77f6dffd714..21001eb3af0 100644
--- a/configdefinitions/src/vespa/dispatch.def
+++ b/configdefinitions/src/vespa/dispatch.def
@@ -48,6 +48,9 @@ numJrtTransportThreads int default=8
# Number of JRT connections per backend node
numJrtConnectionsPerNode int default=8
+# Number of seconds to spend warming up code to prevent JIT cold start issues.
+warmuptime double default=0.1
+
# The unique key of a search node
node[].key int
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java
index 423de07f8c4..c2ea706acda 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java
@@ -5,6 +5,7 @@ import com.google.inject.Inject;
import com.yahoo.cloud.config.ClusterInfoConfig;
import com.yahoo.component.AbstractComponent;
import com.yahoo.component.ComponentId;
+import com.yahoo.compress.Compressor;
import com.yahoo.container.handler.VipStatus;
import com.yahoo.jdisc.Metric;
import com.yahoo.prelude.fastsearch.VespaBackEndSearcher;
@@ -30,7 +31,13 @@ import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.OptionalInt;
+import java.util.Random;
import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
/**
* A dispatcher communicates with search nodes to perform queries and fill hits.
@@ -118,10 +125,18 @@ public class Dispatcher extends AbstractComponent {
this.metricContext = metric.createContext(null);
this.maxHitsPerNode = dispatchConfig.maxHitsPerNode();
searchCluster.addMonitoring(clusterMonitor);
+ Thread warmup = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ warmup(dispatchConfig.warmuptime());
+ }
+ });
+ warmup.start();
try {
while ( ! searchCluster.hasInformationAboutAllNodes()) {
Thread.sleep(1);
}
+ warmup.join();
} catch (InterruptedException e) {}
/*
@@ -133,6 +148,15 @@ public class Dispatcher extends AbstractComponent {
searchCluster.pingIterationCompleted();
}
+ /*
+ Will run important code in order to trigger JIT compilation and avoid cold start issues.
+ Currently warms up lz4 compression code.
+ */
+
+ private static long warmup(double seconds) {
+ return new Compressor().warmup(seconds);
+ }
+
/** Returns the search cluster this dispatches to */
public SearchCluster searchCluster() {
return searchCluster;
diff --git a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java
index ee003734d1a..77297ebcb50 100644
--- a/vespajlib/src/main/java/com/yahoo/compress/Compressor.java
+++ b/vespajlib/src/main/java/com/yahoo/compress/Compressor.java
@@ -3,8 +3,12 @@ package com.yahoo.compress;
import net.jpountz.lz4.LZ4Compressor;
import net.jpountz.lz4.LZ4Factory;
+import net.jpountz.lz4.LZ4FastDecompressor;
+import net.jpountz.lz4.LZ4SafeDecompressor;
+
import java.util.Arrays;
import java.util.Optional;
+import java.util.Random;
/**
* Compressor which can compress and decompress in various formats.
@@ -148,6 +152,28 @@ public class Compressor {
}
}
+ public long warmup(double seconds) {
+ byte [] input = new byte[0x4000];
+ new Random().nextBytes(input);
+ long timeDone = System.nanoTime() + (long)(seconds*1000000000);
+ long compressedBytes = 0;
+ byte [] decompressed = new byte [input.length];
+ LZ4FastDecompressor fastDecompressor = factory.fastDecompressor();
+ LZ4SafeDecompressor safeDecompressor = factory.safeDecompressor();
+ LZ4Compressor fastCompressor = factory.fastCompressor();
+ LZ4Compressor highCompressor = factory.highCompressor();
+ while (System.nanoTime() < timeDone) {
+ byte [] compressedFast = fastCompressor.compress(input);
+ byte [] compressedHigh = highCompressor.compress(input);
+ fastDecompressor.decompress(compressedFast, decompressed);
+ fastDecompressor.decompress(compressedHigh, decompressed);
+ safeDecompressor.decompress(compressedFast, decompressed);
+ safeDecompressor.decompress(compressedHigh, decompressed);
+ compressedBytes += compressedFast.length + compressedHigh.length;
+ }
+ return compressedBytes;
+ }
+
public static class Compression {
private final CompressionType compressionType;