Gsutil 在下载具有大量进程的多个文件时使用大量内存

Posted

技术标签:

【中文标题】Gsutil 在下载具有大量进程的多个文件时使用大量内存【英文标题】:Gsutil uses a lot of memory when download multiple files with a lot of processes 【发布时间】:2019-11-09 20:53:51 【问题描述】:

我需要使用 gsutil 下载多个文件,我注意到 gsutil 在下载多个文件时会占用大量内存。 (下载三个 2G 文件,每个文件有 9 个进程时,大约需要 1-2 GB 内存)。有没有办法调整 gsutil 的内存使用情况?这对我来说很重要,因为我在 GKE 中运行 gsutil,如果使用太多内存(超过限制),容器会被杀死

另一个问题:gsutil 似乎无法在单个命令中下载同名文件(一个会覆盖另一个?)。所以我没有使用 -m 选项。相反,我使用单个 gsutil 命令下载每个文件: gsutil -o "GSUtil:parallel_thread_count=1" -o "GSUtil:sliced_object_download_component_size=250M" -o "GSUtil:sliced_object_download_max_components=9" -o "GSUtil:parallel_process_count=9" cp bucket/file desFile

【问题讨论】:

您使用的是什么 GKE container image?如果您使用的是 CentOS,切换到 Ubuntu 应该会有所帮助。 下载同名文件是什么意思?存储桶“文件夹”中的两个对象不能具有相同的名称。如果您将具有相同名称的下一个对象复制到存储桶,旧的对象将被覆盖。 See object names considerations for more information. @PawelCzuczwara 我实际上是指不同存储桶“文件夹”中的文件,例如,自 gsutil 以来,gsutil 不适用于在单个命令中下载 /bucket1/path1/output 和 /bucket2/path2/output将下载到他们两个的输出,一个会覆盖另一个。我想知道是否有办法解决这个问题,以便我可以在一个命令中下载所有文件。 你试过gsutil cp -r gs://my-bucket/data dir递归subdirectories as described in the docs 你也可以试试gsutil rsync -r data gs://mybucket/dataas described in the docs 【参考方案1】:

我确实测试了下载 2GB 的文件并更改 -o "GSUtil:parallel_process_count=X" 更改了 Debian 和 Ubuntu 上的内存消耗:

1 个并行进程:85MB 5 个并行进程:125MB 10 并行 进程:165MB 50 个并行进程:310MB

如果您在 GKE 上使用 gsutil 和 CentOS container image 时遇到内核崩溃问题,切换到 Ubuntu 映像应该会有所帮助。

如果同时下载 3 个文件内存消耗太高,可以考虑只下载 1 或 2 个。

还有high memory usage with GKE的已知问题

【讨论】:

我正在使用 ubuntu 作为容器映像,与使用以下命令下载 2G 文件时的结果相比,我的内存使用量大约是您的两倍:gsutil -o "GSUtil:parallel_thread_count=1" -o "GSUtil :sliced_object_download_max_components=X" -o "GSUtil:parallel_process_count=X" cp 存储桶/文件。我想知道为什么 gsutil 在不同的环境下消耗不同数量的 ram... 我的第一个测试是在 Debian 上,现在我在 Ubuntu 上进行了尝试,得到了非常相似的结果。您使用的是什么 Google Cloud SDK?我正在使用 252.0.0 和 gsutil 4.39 嗨,我的环境中没有安装 Google Cloud SDK,我的 gsutil 是 4.38。您是否在命令中指定“GSUtil:parallel_thread_count=1”,看起来多进程比多线程消耗更多的内存,但性能更好。

以上是关于Gsutil 在下载具有大量进程的多个文件时使用大量内存的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gsutil 将多个 csv 文件连接成一个具有单个标题的 csv 文件

使用 gsutil 从 CSV 下载所有行

使用 python 子进程在实例上运行 gsutil - 访问权限?

“gsutil -m mv”未运行并行传输

python 子进程不能很好地与 gsutil 复制/移动命令一起使用

GSUTIL CP 文件延迟