0

我已将 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

关于使测试更快的任何建议?

4

1 回答 1

5

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

您可以在不广泛使用分析器的情况下估算其中的一些指标。

  • 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 和内存以获得最快的结果。

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

于 2022-01-20T12:46:33.430 回答