你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure HPC 缓存中预加载文件

Azure HPC 缓存的启动功能使客户能够在缓存中预加载文件。

可以使用此功能提取文件的预期工作集,并在工作开始之前填充缓存。 这种技术有时被称为缓存预热。

启动缓存会通过增加缓存“命中数”来提高性能。 如果客户端计算机请求的是必须从后端存储读取的资源,那么提取和返回该文件可能会有相当大的延迟,尤其是在存储系统是本地 NAS 时。 如果在开始一个计算任务之前,使用它需要的文件来启动缓存,文件请求在作业期间会更高效。

此功能使用 JSON 清单文件指定要加载的文件。 每个启动作业采用一个清单文件。

使用 Azure 门户或本文档末尾提到的 Azure REST API 终结点创建缓存启动作业。

最多可以创建 10 个启动作业。 根据缓存的大小,可以同时运行 3 到 10 个启动作业;其他作业将排队等候,直到资源释放。

安装与先决条件

在创建启动作业之前,请执行以下步骤:

  1. 创建 Azure HPC 缓存。 (请参阅创建 Azure HPC 缓存以获取帮助。)
  2. 至少定义一个存储目标,包括创建其聚合命名空间路径。 存储目标文档
  3. (根据以下说明)创建启动作业清单,并将其存储在可供 HPC 缓存访问的 Blob 容器中。 或者,如果使用 Azure REST API 创建启动作业,可以将清单存储在 HPC 缓存可访问的任何 URL 中。

创建启动清单文件

启动清单是一个 JSON 文件,用于定义启动作业运行时缓存中将预加载的内容。

在清单中,指定要预加载的目录或文件的命名空间路径。 还可以配置包含和排除规则以自定义加载的内容。

示例启动清单


{
    "config": {
        "cache_mode": "0",
        "maxreadsize": "0",
        "resolve_symlink": "0",
        "threads":"8",
        "skip_estimation":"0"
    },
    
    "files": [
        "/bin/tool.py",
        "/bin/othertool.py"
    ],
    
    "directories": [
        {"path": "/lib/toollib"},
        {
            "path": "/lib/otherlib", 
            "include": ["\\.py$"]
        },
        {
            "path": "/lib/xsupport", 
            "include": ["\\.py$"], 
            "exclude": ["\\.elc$", "\\.pyc$"]
        }
    ],
    
    "include": ["\\.txt$"],
    "exclude": ["~$", "\\.bak$"]
}

启动清单文件中有三个部分:

  • 配置 (config) - 启动作业的设置

  • 文件和目录语句:

    • files - 将预加载的各个文件
    • directories - 将预加载的文件路径
  • 全局包含和排除语句(includeexclude)- 用于修改目录启动任务的正则表达式字符串

配置设置

清单文件的 config 部分设置以下参数:

  • 缓存模式 - 设置启动作业的行为。 选项包括:

    • 0 - 数据 - 加载缓存中所有指定的文件数据和属性。 这是默认值。
    • 1 - 元数据 - 仅加载文件属性。
    • 2 - 估计 - 加载文件属性,并返回当此清单中的内容以“数据”模式运行时将启动的预计文件数、目录数,以及总数据大小(以字节为单位)。
  • maxreadsize - 设置每个文件将预加载的最大字节数。 将此参数设置为 0(默认值),无论大小如何,都始终加载整个文件。

  • resolve_symlink - 如果要在启动时解析符号链接,请将此参数设置为 true (1)。 如果 resolve_symlink 已启用,则无论是包含规则还是排除规则,都将完全预加载符号链接目标。

  • threads - 要使用的启动线程数。 有效值为 1 到 128。 默认值为 8,在启动和维护客户端请求之间取得平衡。

  • skip_estimation - 在开始复制文件之前,启动作业会对要启动的数据量运行估计。 如果你要直接转到文件启动阶段,请将 skip_estimation 标记设置为 true (1)。 如果你跳过估计阶段,进度报表可能没有那么准确。 默认值为 0,包含估计阶段。

文件和目录路径

清单的 filesdirectories 部分指定在启动作业期间预加载的文件。

按缓存命名空间路径指定文件和目录。 这些路径与客户端用于通过 HPC 缓存访问文件的路径相同,不需要与存储系统路径或导出名称相同。 请阅读规划聚合命名空间以了解详细信息。

从缓存命名空间的根目录中启动路径。

备注

即使 files 中列出的项与后面的排除规则匹配,也会包含这些项。

directories 值用于保存一个路径列表,这些路径会针对要在缓存中预加载的内容进行评估。 所有子树都包含在启动作业中,除非专门排除了一些子树。

目录路径值可以有其自己的 include 和 exclude 语句,这些语句仅适用于定义它们的路径。 例如,"directories": [{"path": "/cache/library1", "exclude": "\\.bak$"}] 一行将预加载命名空间路径 /cache/library1/ 下的所有文件,但该路径中以 .bak 结尾的文件除外。

目录级别 include/exclude 语句与下面所述的全局 include 和 exclude 语句不同。 请仔细阅读有关目录级别语句如何与全局 include 和 exclude 语句交互的详细信息。

备注

由于清单文件的分析方式,需要两个转义字符来保护 include 和 exclude 语句中有问题的字符串字符。 例如,使用表达式 \\.txt 来匹配 .txt 文件。

include 和 exclude 语句

在文件和目录之后,可以指定全局 includeexclude 语句。 这些全局设置适用于所有目录。 但不适用于 files 语句中指定的文件。

一般来说,规则是按顺序匹配的,因此,在清单文件中出现较早的语句会在较晚的语句之前应用。 本文中的说明还假定较早的规则已应用,但不匹配。

  • Include 语句 - 扫描目录时,启动作业将忽略与 include 设置中的正则表达式不匹配的任何文件。

  • Exclude 语句 - 扫描目录时,启动作业将忽略与 exclude 设置中的正则表达式匹配的任何文件。

    有关全局排除规则如何与其他规则交互的更多信息:

    • 全局排除规则优先于全局包含规则。 也就是说,如果一个文件名同时匹配全局包含表达式和全局排除表达式,则启动作业不会预加载它。

    • 目录级别包含规则优先于全局排除规则。

      与目录级别 include 表达式和全局 exclude 表达式均匹配的文件名将由启动作业进行预加载。

    • 文件语句优先于所有排除规则。

可以省略 include 和 exclude 语句,以启动目录中的所有文件。

有关包含/排除规则及其如何匹配文件名的详细信息:

  • 如果名称与每个目录的排除列表中的条目匹配,则跳过该名称。

  • 如果存在每个目录的包含列表,则根据名称是否显示在该列表中来决定是包含名称还是排除名称。

  • 如果名称与全局排除列表中的条目匹配,则跳过该名称。

  • 如果有一个全局包含列表:名称出现在该列表上,则包含该名称;名称没有出现在该列表上,则排除该名称。

  • 如果存在每个目录的包含列表,则排除名称。 否则,包含名称。

  • 如果目录和该目录的上级都显示在目录列表中,则目录的特定规则与全局规则一起应用,并且忽略上级目录的规则。

  • 名称和规则区分大小写。 不支持不区分大小写的源。

  • 文件规则加上目录规则的总数不能超过 4000。 任何包含/排除列表的正则表达式规则数不能超过 5。

  • 如果一个目录规范与另一个目录规范重叠,则具有更明确路径的目录优先。

  • 这是由于清单在文件列表或目录列表中多次指定了同一路径而产生的一个错误。

上传启动清单文件

清单文件准备就绪后,将其上传到可从 HPC 缓存访问的存储帐户中的一个 Azure Blob 容器。 如果是使用 API(而不是门户)创建启动作业,可以选择将其存储在其他 Web 服务器上,但你需要执行不同的步骤以确保缓存可以访问它。

  • 如果是从 Azure 门户创建启动作业,请按如下所述,在 HPC 缓存的“启动缓存”设置页中选择清单文件。 从缓存设置中选择它,会自动创建共享访问签名 (SAS),从而使缓存只能对启动文件进行有限访问。

  • 如果是使用 API(而不是使用门户)创建启动作业,请确保缓存有权访问该文件。 要么将文件存储在一个可访问的位置(例如,在你可控制的、位于你的缓存或存储网络内的 Web 服务器上),要么为启动文件手动创建 SAS URL。

    若要了解如何为启动清单文件创建帐户 SAS URL,请参阅使用共享访问签名 (SAS) 对 Azure 存储资源授予有限访问权限。 必须可通过 HTTPS 访问清单文件。

当启动作业启动时,缓存将访问清单文件一次。 为缓存生成的 SAS URL 不会被公开。

创建启动作业

使用 Azure 门户创建启动作业。 在门户中查看 Azure HPC 缓存,并在“设置”标题下选择“启动缓存”页。

门户中“启动”页的屏幕截图,其中有多个处于不同状态的作业。

单击表顶部的“开始启动作业”文本以定义新作业。

在“作业名称”字段中,为启动作业键入唯一的名称。

使用“启动文件”字段选择启动清单文件。 选择用于存储启动清单的存储帐户、容器和文件。

“开始启动作业”页的屏幕截图,其中填写了“作业名称”和“启动文件路径”。“启动文件”字段下方是一个标记为“从现有 blob 位置选择”的链接。

要选择启动清单文件,请单击链接以选择存储目标。 然后选择用于存储 .json 清单文件的容器。

如果你找不到清单文件,缓存可能无法访问该文件的容器。 请确保缓存具有与存储帐户的网络连接,并且能够从容器中读取数据。

管理启动作业

Azure 门户的“启动缓存”页中列出了启动作业。

此页显示每个作业的名称、其状态、其当前状态以及有关启动进度的摘要统计信息。 “详细信息”列中的摘要会随着作业进度定期更新。 当启动作业开始时,将填充“作业状态”字段;如果出现问题,此字段还提供基本错误信息,如“无效清单”。

运行作业时,“完成百分比”列会显示进度的估计值。

在启动作业启动之前,其状态为“已排队”。 它的“作业状态”、“完成百分比”和“详细信息”字段为空。

门户中启动作业列表的屏幕截图,作业处于各种状态(“正在运行”、“已暂停”和“成功”)。光标已单击了一个作业行右侧的“…”符号,关联菜单显示了“暂停”或“恢复”选项。

单击表右侧的“...”部分可以暂停或恢复启动作业。 (状态更新可能需要几分钟时间。)

要删除启动作业,请在列表中选择它并使用表顶部的“停止”控件。 可以使用“停止”控件删除处于任何状态的作业。

Azure REST API

可以使用这些 REST API 端点来创建和管理 HPC 缓存启动作业。 这些终结点是 REST API 2022-05-01 版本的一部分,因此请确保在 api_version 术语中使用该字符串。

阅读 Azure REST API 参考,了解如何使用这些工具。

添加新的启动作业

startPrimingJob 接口创建启动作业并将其排入队列。 当资源可用时,作业会自动启动。


URL: POST

     https://MY-ARM-HOST/subscriptions/MY-SUBSCRIPTION-ID/resourceGroups/MY-RESOURCE-GROUP-NAME/providers/Microsoft.StorageCache/caches/MY-CACHE-NAME/startPrimingJob?api-version=2022-05-01

     BODY:
     {
         "primingJobName": "MY-PRIMING-JOB",
         "primingManifestUrl": "MY-JSON-MANIFEST-FILE-URL"
     }

对于 primingManifestUrl 值,传递文件中可供缓存访问的 SAS URL 或其他 HTTPS URL。 有关详细信息,请阅读上传启动清单文件

停止启动作业

stopPrimingJob 接口取消作业(如果它正在运行)并将其从作业列表中删除。 使用此接口可删除处于任何状态的启动作业。


URL: POST 
     https://MY-ARM-HOST/subscriptions/MY-SUBSCRIPTION-ID/resourceGroups/MY-RESOURCE-GROUP-NAME/providers/Microsoft.StorageCache/caches/MY-CACHE-NAME/stopPrimingJob?api-version=2022-05-01

BODY:
     {
         "primingJobId": "MY-JOB-ID-TO-REMOVE"
     }

获取启动作业

使用 Get cache API 列出缓存的启动作业。 此 API 返回大量有关缓存的信息;在“缓存属性”部分中可以查找启动作业信息。

启动作业名称和 ID 以及其他信息一起被返回。


URL: GET 
     https://MY-ARM-HOST/subscriptions/MY-SUBSCRIPTION-ID/resourceGroups/MY-RESOURCE-GROUP-NAME/providers/Microsoft.StorageCache/caches/MY-CACHE-NAME?api-version=2022-05-01

BODY:

暂停启动作业

pausePrimingJob 接口暂停正在运行的作业。


URL: POST 
     https://MY-ARM-HOST/subscriptions/MY-SUBSCRIPTION-ID/resourceGroups/MY-RESOURCE-GROUP-NAME/providers/Microsoft.StorageCache/caches/MY-CACHE-NAME/pausePrimingJob?api-version=2022-05-01

BODY:
     {
         "primingJobId": "MY-JOB-ID-TO-PAUSE"
     }

恢复启动作业

使用 resumePrimingJob 接口重新激活挂起的启动作业。


URL: POST 
     https://MY-ARM-HOST/subscriptions/MY-SUBSCRIPTION-ID/resourceGroups/MY-RESOURCE-GROUP-NAME/providers/Microsoft.StorageCache/caches/MY-CACHE-NAME/resumePrimingJob?api-version=2022-05-01

BODY:
     {
         "primingJobId": "MY-JOB-ID-TO-RESUME"
     }

常见问题

  • 我可以重复使用启动作业吗?

    不完全可以,因为列表中的每个启动作业都必须具有唯一的名称。 从列表中删除启动作业后,可以创建同名的新作业。

    可以创建多个引用同一清单文件的启动作业。

  • 失败或完成的启动作业在列表中保留多长时间?

    启动作业将保留在列表中,直到你将其删除。 在门户的“启动缓存”页面上,选中作业旁边的复选框并选择列表顶部的“停止”控件以删除作业。

  • 如果预加载的内容大小超过缓存存储容量,会发生什么情况?

    如果缓存已满,则稍后提取的文件将覆盖先前启动的文件。

后续步骤