Skip to content

Commit 1b7f364

Browse files
committed
Reduce OOM by limiting memory used by transfer manager by limiting concurrent downloads to 10.
This requires consuming an update in the aws-sdk aws/aws-sdk-java-v2#6329 Signed-off-by: Andre Kurait <[email protected]>
1 parent 745b158 commit 1b7f364

File tree

1 file changed

+19
-1
lines changed
  • RFS/src/main/java/org/opensearch/migrations/bulkload/common

1 file changed

+19
-1
lines changed

RFS/src/main/java/org/opensearch/migrations/bulkload/common/S3Repo.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@ public class S3Repo implements SourceRepo {
2929
private static final double S3_TARGET_THROUGHPUT_GIBPS = 8.0; // Arbitrarily chosen
3030
private static final long S3_MAX_MEMORY_BYTES = 1024L * 1024 * 1024; // Arbitrarily chosen
3131
private static final long S3_MINIMUM_PART_SIZE_BYTES = 8L * 1024 * 1024; // Default, but be explicit
32+
33+
// Transfer Manager maintains buffers for CRT responses which without being careful can overload heap.
34+
// A quick calculation for heap usage is:
35+
// MaxHeapUsedByCrtBuffers = (initialReadBufferSizeInBytes * concurrentFileDownloads) +
36+
// minimalPartSizeInBytes * min(concurrentFileDownloads, maxConcurrency)
37+
// The default values that we use are:
38+
// initialReadBufferSizeInBytes = 80MB
39+
// concurrentFileDownloads = 100
40+
// minimalPartSizeInBytes = 8MB
41+
// maxConcurrency = 100
42+
//
43+
// To reduce memory usage to under 1GB we will set concurrentFileDownloads to 10
44+
private static int DIRECTORY_TRANSFER_MAX_CONCURRENT_FILE_DOWNLOADS = 10;
45+
46+
3247
public static final String INDICES_PREFIX_STR = "indices/";
3348
private final Path s3LocalDir;
3449
private final S3AsyncClient s3Client;
@@ -150,7 +165,10 @@ public Path getBlobFilePath(String indexId, int shardId, String blobName) {
150165

151166
@Override
152167
public void prepBlobFiles(ShardMetadata shardMetadata) {
153-
try (S3TransferManager transferManager = S3TransferManager.builder().s3Client(s3Client).build()) {
168+
try (S3TransferManager transferManager = S3TransferManager.builder()
169+
.s3Client(s3Client)
170+
.directoryTransferMaxConcurrency(DIRECTORY_TRANSFER_MAX_CONCURRENT_FILE_DOWNLOADS)
171+
.build()) {
154172

155173
Path shardDirPath = getShardDirPath(shardMetadata.getIndexId(), shardMetadata.getShardId());
156174
ensureS3LocalDirectoryExists(shardDirPath);

0 commit comments

Comments
 (0)