java 加速Elasticsearch测试容器

hmtdttj4  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(109)

我已经把java集成测试移到使用elasticsearch测试容器而不是嵌入式elasticsearch。测试已经慢了1个小时,这是一个巨大的生产力打击。我正在寻找加快速度的方法。
我试过在Elasticsearch容器上使用reuse这样的参数,但是没有效果。

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守护程序崩溃一次,因此增加到2g)

org.gradle.jvmargs=-Xms2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

有什么建议能让测试更快吗?

guykilcj

guykilcj1#

对任何性能工作或优化的一般建议是在引入更改之前进行测量。我建议在得出结论之前分析测试运行。
这里有几个指标可以在不大量使用分析器的情况下进行估计。

  • 弹性容器启动多长时间?

对于我来说需要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 in the docs管理的容器的生命周期的信息。
例如,如果使用JUnit,则可以检查是否在@BeforeEach@BeforeAll中启动了新容器,或者是否在整个测试套件中使用了单例容器。

  • 容器中的应用程序有多快?

其中一个因素是允许Docker使用多少资源。默认情况下,Docker配置为2G内存,这可能是一个瓶颈。如果容器中没有足够的内存,Elastic可能会比它应该的速度慢(如果开始交换等,甚至会更慢)。请为它提供足够的CPU和内存以获得最快的结果。
如果查看这三件事没有帮助,那么也许您可以分析测试运行以检查瓶颈是什么。

相关问题