加速 Elasticsearch 测试容器
Speed up Elasticsearch Test Containers
我已将 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
有什么可以加快测试速度的建议吗?
对于任何性能工作或优化的一般建议是在引入更改之前进行测量。我建议您在得出结论之前分析您的测试运行。
那里有一些指标,您可以在不大量使用分析器的情况下进行估算。
- 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 in the docs 管理的容器的生命周期的更多信息。
例如,如果您使用 JUnit,您可以检查您是否在 @BeforeEach
或 @BeforeAll
中启动新容器,或者在整个测试套件中使用单例容器。
- 容器中的应用程序有多快?
其中一个因素是允许使用多少资源 Docker。默认情况下,Docker is configured 有 2G 内存,这可能是一个瓶颈。
如果容器中没有足够的可用内存,Elastic 的运行速度可能会比应有的慢(如果它开始交换等,甚至会更慢)。给它充足的 CPU 和内存以获得最快的结果。
如果查看这 3 件事没有帮助,那么也许您可以分析测试 运行 检查瓶颈是什么。
我已将 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
有什么可以加快测试速度的建议吗?
对于任何性能工作或优化的一般建议是在引入更改之前进行测量。我建议您在得出结论之前分析您的测试运行。
那里有一些指标,您可以在不大量使用分析器的情况下进行估算。
- 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 in the docs 管理的容器的生命周期的更多信息。
例如,如果您使用 JUnit,您可以检查您是否在 @BeforeEach
或 @BeforeAll
中启动新容器,或者在整个测试套件中使用单例容器。
- 容器中的应用程序有多快?
其中一个因素是允许使用多少资源 Docker。默认情况下,Docker is configured 有 2G 内存,这可能是一个瓶颈。 如果容器中没有足够的可用内存,Elastic 的运行速度可能会比应有的慢(如果它开始交换等,甚至会更慢)。给它充足的 CPU 和内存以获得最快的结果。
如果查看这 3 件事没有帮助,那么也许您可以分析测试 运行 检查瓶颈是什么。