diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-03-06 17:12:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-06 17:12:28 +0100 |
commit | 8341b3e6538be3127a58926ea9e84c1bbb5a9e9b (patch) | |
tree | 03f399197fd4de3cabb8ac3730199e1a648ffb19 | |
parent | e8ef6c31810d047f7c24a2540446c38702b15c7a (diff) | |
parent | 41bdd708697929dc19f433417797ddad4533bd3e (diff) |
Merge pull request #12484 from vespa-engine/balder/warmup-lz4
Add JIT warmup of lz4.
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; |