首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速弹性搜索测试容器

加速弹性搜索测试容器
EN

Stack Overflow用户
提问于 2022-01-19 22:32:09
回答 1查看 1.3K关注 0票数 0

我已经将java集成测试移动到使用elasticsearch测试容器,而不是使用嵌入式elasticsearch。测试已经慢了一个小时,这是一个巨大的生产力打击。我正在寻找加快速度的方法。

我尝试在Elasticsearch容器上使用类似于reuse这样的参数,但这并没有造成任何影响。我的最新配置是

代码语言:javascript
复制
    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);
代码语言:javascript
复制
            elasticsearchContainer = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)
                  .withEnv("foo", "bar").withSharedMemorySize(1000000000L);
            elasticsearchContainer.addExposedPorts(9200, 9300);
            elasticsearchContainer.withStartupTimeout(Duration.of(5, ChronoUnit.MINUTES));
            elasticsearchContainer.start();
代码语言:javascript
复制
    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守护进程一旦增加到2g,就会崩溃)

代码语言:javascript
复制
org.gradle.jvmargs=-Xms2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

对加快考试速度有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-20 12:46:33

对于任何性能工作或优化的一般建议是在引入更改之前进行度量。在得出结论之前,我建议对您的测试运行进行分析。

这里有几个度量标准,您可以在不大量使用分析器的情况下进行估计。

  • 弹性容器开始多长时间?

对我来说,它需要8.2秒(我使用了elasticsearch-oss:7.10.2):

代码语言:javascript
复制
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使用多少资源。默认情况下,码头配置具有2G内存,这可能是一个瓶颈。如果容器中没有足够的可用内存,那么弹性的行为可能会比应该的慢(如果它开始交换,则会更慢,等等)。给它足够的CPU和内存,以获得最快的结果。

如果查看这3件事情没有帮助,那么也许您可以分析测试运行,以检查瓶颈是什么。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70778593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档