我已將 java 集成測驗移動到使用 elasticsearch 測驗容器,而不是使用嵌入式 elasticsearch。測驗速度變慢了 1 小時,這對生產力造成了巨大影響。我正在尋找加快速度的方法。
我嘗試reuse在 Elasticsearch 容器上使用引數,但這并沒有產生任何影響。我的最新配置是
private static final String ELASTICSEARCH_VERSION = "7.11.2";
private static ElasticsearchContainer elasticsearchContainer;
private static final DockerImageName ELASTICSEARCH_IMAGE =
DockerImageName
.parse("docker.elastic.co/elasticsearch/elasticsearch")
.withTag(ELASTICSEARCH_VERSION);
elasticsearchContainer = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)
.withEnv("foo", "bar").withSharedMemorySize(1000000000L);
elasticsearchContainer.addExposedPorts(9200, 9300);
elasticsearchContainer.withStartupTimeout(Duration.of(5, ChronoUnit.MINUTES));
elasticsearchContainer.start();
private static RestHighLevelClient getRestHighLevelClient(ElasticsearchContainer container) {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(ELASTICSEARCH_USERNAME,
ELASTICSEARCH_PASSWORD));
RestClientBuilder restClientBuilder = RestClient.builder(HttpHost.create(container.getHttpHostAddress()))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setKeepAliveStrategy((response, context) -> 3 * 60 * 1000));
// Try to prevent SocketTimeoutException when fetching larger batch size
restClientBuilder.setRequestConfigCallback(
requestConfigBuilder -> requestConfigBuilder.setSocketTimeout(2 * 60 * 1000));
return new RestHighLevelClient(restClientBuilder);
}
Gradle 配置(gradle daemon 崩潰一次,因此增加到 2g)
org.gradle.jvmargs=-Xms2g -XX: HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
關于使測驗更快的任何建議?
uj5u.com熱心網友回復:
對于任何性能作業或優化的一般建議是在引入更改之前進行測量。我建議您在得出結論之前分析您的測驗運行。
您可以在不廣泛使用分析器的情況下估算其中的一些指標。
- Elastic 容器啟動多長時間?
對我來說需要 8.2 秒(我用過elasticsearch-oss:7.10.2):
14:35:55.803 [main] INFO ?? [docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2] -
Container docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
started in PT8.264592S
- 您多久啟動一次新容器?Docker 鏡像會被自然快取,所以這不是問題,但取決于您如何組織測驗套件,啟動新容器的時間可能會增加。
您可以在檔案中閱讀有關由 Testcontainers 管理的容器的生命周期的更多資訊。
例如,如果您使用 JUnit,您可以檢查您是否在整個測驗套件中啟動新容器或正在使用單例容器@BeforeEach。@BeforeAll
- 容器中的應用程式有多快?
因素之一是允許 Docker 使用多少資源。默認情況下,Docker 配置為具有 2G 記憶體,這可能是一個瓶頸。如果容器中沒有足夠的可用記憶體,Elastic 的行為可能會比它應該的要慢(如果它開始交換,甚至會更慢等)。給它足夠的 CPU 和記憶體以獲得最快的結果。
如果查看這三件事沒有幫助,那么也許您可以分析測驗運行以檢查瓶頸是什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/418204.html
標籤:
