azure - 如何减少容器的天蓝色功能中使用的存储空间
问题描述
先说一点背景。也许,希望这可以为其他人节省一些麻烦和挫折。向下移动到 TL;DR 继续处理实际问题。
我们目前有几个与以天蓝色批处理运行的基因测序相关的遗传学工作流程。其中一些很轻,我想将它们移动到运行 Docker 容器的 Azure 函数中。为此,我创建了一个基于 azure-functions 映像的 docker 映像,其中包含 anaconda 以及运行我们最常见、更轻松的工作流程所需的软件包。我最初的尝试产生了一个约 8GB 的巨大图像。迁移到 Miniconda 和其他一些调整已将图像大小减小到接近 3.5GB。仍然很大,但应该可以管理。
对于这个函数,我创建了一个在 P1V2 层上的应用服务计划上运行的 Azure 函数,因为我相信我有 250GB 的存储空间可以使用,如层描述中所述:
在进行了几次修复后,我在加载我的第一个图像(大图像)时遇到了一些问题,其中日志表明设备上没有剩余空间。这让我感到困惑,因为配额表明我使用了 250 个总数中的 1.5MB。此时我减小了映像大小,至少可以再次成功部署映像。启用 SSH 支持我通过 SSH 登录到容器并运行df -h
.
好的,因此该函数没有宣传的 250GB 可用运行时存储空间。它只有大约 34 个。我花了一些时间在文档中搜索,但找不到任何表明应该是这种情况的东西。我确实找到了这个相关的 SO question,它澄清了一些事情。我还在azure functions github repo 上发现了这个仍然未解决的问题。似乎有更多人遇到同样的问题,并且不知道 SKU 的本地存储限制。我可能忽略了一些事情,所以如果这实际上被记录在案,如果有人能指导我到那里,我会很高兴。
现在我需要一些存储空间的原因是我需要获取原始数据文件,该文件可以是从几 MB 到几 GB 的任何内容。然后,工作流随后会生成多个文件,这些文件在几个字节和几个 GB 之间变化。但是,其目的不是将其存储在函数实例上,而是完成工作流,然后将生成的文件存储在 blob 存储中。
TL;博士
对于在本地实例上的应用服务计划上运行的函数,您不会获得公布的存储容量。根据 SKU,您可以获得大约 20/60/80GB。
我暂时需要 10-30GB 的本地存储空间,直到工作流完成并且生成的文件可以存储在其他地方。
如何减少本地实例上的已用存储?
最后,实际问题。您可能已经从df -h
命令的屏幕截图中注意到,在可用的 34GB 中,已经使用了高达 25GB。剩下 7.6GB 可用。我已经提到我的图像大小约为 3.5GB。那么,为什么总共使用了 25GB,除了缩小我的图像之外,还有什么改变可以减少这个吗?话虽如此,如果我完全删除了我的图像(释放 3.5GB 的存储空间),它仍然不够。也许该功能只需要价值超过 20GB 的存储空间即可运行?
注意:这不是缓存 docker 层等的结果,因为我尝试扩展应用服务计划,清除缓存的层/图像并重新下载图像。
上移一层可以为我提供 60GB 的总可用存储空间。这已经足够了。但是当我不需要这一层提供的其余部分时,感觉非常过分。
尝试的解决方案 1
我尝试过的一件可能对其他人有帮助的事情是在函数实例上安装文件共享。正如MS docs所示,这可以通过很少的努力来完成。太好了,现在我可以直接写入文件共享,这让我有些头疼,最后继续前进。或者我是这么想的。虽然这大部分工作得很好,但它仍然抛出一个异常,表明它在某些时候耗尽了设备上的空间,让我相信它可能正在使用本地存储作为临时存储、缓冲区或其他任何东西。我将继续研究它,看看我是否能弄清楚那部分。
任何建议或替代解决方案将不胜感激。对于这个特定的工作流,我可能只是决定离开 Azure Functions。但我仍然想把事情弄清楚以备将来参考。
提前致谢
尼克诺
解决方案
推荐阅读
- java - ViewHolder 字段在 Fragment 中被初始化为 null
- python - 从场景方面来看,websocket 和烧瓶流有什么区别
- angularjs - 谷歌闭包编译器构建给出错误未处理标志:outputManifest'
- azure-iot-hub - 使用 IoT DevKit 和 Azure IoT Hub 向设备发送云消息 - 设备代码
- javascript - 在 HTML 页面上显示多个图表?
- html - 使图像在单击时打开模式?
- arrays - 多个数组的排列/组合/笛卡尔积的快速生成
- mysql - 带有嵌套子查询的查询平均值
- c# - 使用 C# 的有效友好监视器名称
- java - JWT 代币发行