通过EFC加速OSS访问

弹性文件客户端 EFC(Elastic File Client)是一个计算侧的数据访问加速方案。它可以将 OSS Bucket 挂载为本地文件系统,并利用计算节点的内存和磁盘构建高速分布式只读缓存,将远程 OSS 访问转变为高效的 P2P 内网传输,降低访问延迟,提升 AI 训练和推理场景下的数据吞吐效率。

说明:EFC 缓存功能当前为邀测发布阶段,邀测期间免费使用。

工作原理

EFC 是一个部署在计算节点上的用户态文件系统客户端。当应用程序通过挂载点读取数据时,EFC 会拦截这些请求,并执行以下逻辑:

  1. 缓存查询:EFC 首先在本地及其他对等节点(通过 P2P 网络)的缓存(内存或磁盘)中查找数据。

  2. 缓存命中:如果数据存在于缓存中,EFC 会直接从缓存返回数据给应用程序,这是一个高速的内网操作。

  3. 缓存未命中(回源):如果数据不在任何节点的缓存中,EFC 会从源端 OSS Bucket 拉取数据,存入本地缓存,然后再返回给应用程序。后续对该数据的请求将直接命中缓存。

通过这种方式,EFC 将频繁的、对同一数据集的远程访问聚合为一次回源和多次高速的内网缓存访问,其聚合吞吐能力可随计算节点规模呈线性扩展。

缓存性能指标:单机可达 15 GB/s 吞吐、20 万 IOPS,性能可随节点规模线性扩展(受实际网络带宽限制)。

核心优势

  • 计算侧高速缓存:利用计算节点的内存与本地磁盘构建读缓存,支持数据预热和 LRU 淘汰机制,减少远端访问延迟。

  • P2P 分布式加速:多节点间通过 P2P 网络共享缓存数据,聚合吞吐可随节点规模线性扩展,支持数百至数千节点规模。P2P 工作原理如下:

    image
  • POSIX 兼容:兼容常用的 POSIX 文件接口(如 openreadreaddir 等),应用无需修改即可访问 OSS 数据。

使用限制

在使用 EFC 前,请确认您的业务场景和技术环境符合以下要求。

运行环境

类型

要求

平台

人工智能平台 PAI(灵骏智算资源)、灵骏裸金属

操作系统

Alibaba Cloud Linux 3(内核 5.10.134-13+)、Ubuntu 24.04(内核 6.8.0-79+)

硬件资源要求

EFC 客户端会占用计算节点的内存和磁盘。请根据是否开启缓存功能来规划资源。

  • 未开启缓存功能

    • 内存:常驻内存占用通常小于 1 GiB,建议系统预留至少 5 GiB 可用内存以应对突发负载。

    • 磁盘:无特殊空间要求,仅需保证系统盘有足够空间存储运行日志。

  • 开启缓存功能 

    开启缓存后,资源占用主要由缓存介质和索引开销构成。

    • 内存资源

      • 基础占用:同“未开启缓存”模式。

      • 内存缓存:若配置内存作为缓存,将直接占用与配置大小相等的内存。

      • 索引开销:无论使用内存还是磁盘缓存,都需要额外内存维护数据索引。建议预留量约为缓存总容量的 1‰

      • 计算公式: 总内存占用 ≈ 基础运行内存 + 内存缓存大小 + (内存缓存大小 + 磁盘缓存大小) * 0.001

    • 磁盘资源

      • 磁盘缓存:若配置磁盘作为缓存介质,将占用配置大小的磁盘空间(例如配置 1 TiB 磁盘缓存,则占用 1 TiB)。

功能限制

  • 访问模式:仅支持对 OSS 数据的只读访问。挂载后文件的所有者固定为 root,权限为只读,不支持 chmod 或 chown

  • POSIX 兼容性:兼容 openclosereadreaddirreaddirpluslookupgetattr 操作;不支持 readlinkwriterenamesetattrlinksymlink 等操作。

  • 存储类型:仅支持访问标准低频访问存储类型的 Object。不支持直接访问归档、冷归档或深度冷归档存储类型。

  • 路径兼容性

    • 路径冲突:若 OSS 中同时存在 a/b(文件)和 a/b/(目录),挂载后仅能访问目录 a/b/

    • 特殊路径:无法访问 Object Key 以 / 开头、包含连续 // 或包含 . / .. 的对象。

  • 访问权限:挂载和访问 OSS 至少需要 oss:GetBucketStatoss:ListObjectsoss:GetObject 权限。

  • 数据高可用性:EFC 是只读缓存,不保障数据高可用。缓存数据在特定情况(如机器损坏、节点替换下线等)下可能丢失,引起缓存失效。再次访问对应数据时,会发生回源,引起性能波动。

部署与挂载

本节将引导您完成 EFC 的部署和挂载。整个流程采用渐进式设计:先完成基础挂载跑通流程,再根据需要启用缓存加速和分布式集群。

步骤一:安装 EFC 客户端

在计算节点上安装 EFC 客户端软件。

  1. 下载安装包

    # alinas-utils 工具包
    wget https://aliyun-alinas-eac-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/cache/aliyun-alinas-utils.amd64.rpm
    
    # efc 客户端主程序
    wget https://aliyun-alinas-eac-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/cache/alinas-efc-latest.amd64.rpm
  2. 安装软件包

    sudo rpm -ivh aliyun-alinas-utils.amd64.rpm
    sudo rpm -ivh alinas-efc-latest.amd64.rpm
    安装完成后,EFC 客户端服务将自动注册,但不会立即启动。需完成后续配置后方可使用。

步骤二:配置访问凭证

EFC 支持两种认证方式:AccessKey 和 STS 临时凭证。从密钥安全角度,建议优先使用 STS 方式,避免 AccessKey 泄露风险

方式一:使用 STS 临时凭证(推荐)

创建包含 STS 临时凭证的配置文件:

# 创建 STS 配置文件
cat > /etc/passwd-sts << EOF
{
    "SecurityToken": "YourSecurityToken",
    "AccessKeyId": "YourSTSAccessKeyId",
    "AccessKeySecret": "YourSTSAccessKeySecret",
    "Expiration": "YourExpiration"
}
EOF

# 设置文件权限,确保只有 root 可读
chmod 600 /etc/passwd-sts
  • STS 配置文件支持实时更新,EFC 会自动加载最新的凭证。

  • 凭证有效期由用户负责管理,请确保在过期前更新。

  • Expiration 字段格式示例:2025-12-11T08:37:51Z(UTC时间)

方式二:使用 AccessKey

创建包含 AccessKey 的密码文件:

# 创建密码文件(请替换为您的真实凭证)
echo "YourAccessKeyId:YourAccessKeySecret" > /etc/passwd-oss

# 设置文件权限,确保只有 root 可读
chmod 600 /etc/passwd-oss

步骤三:挂载 OSS Bucket

根据您的使用场景,选择以下配置方式。建议先完成基础挂载验证流程跑通,再根据需要启用缓存加速。

配置一:基础挂载(快速验证)

此配置用于快速验证 EFC 是否能正常访问您的 OSS Bucket,不启用缓存加速

使用 STS 凭证挂载(推荐)

# 创建本地挂载点
mkdir -p /mnt/oss_data

# 执行挂载(请替换为您的 Bucket 域名)
mount -t alinas \
  -o efc,protocol=oss,g_oss_STSFile=/etc/passwd-sts \
  your-bucket.oss-cn-hangzhou.aliyuncs.com:/ /mnt/oss_data

使用 AccessKey 挂载

# 创建本地挂载点mkdir -p /mnt/oss_data

# 执行挂载(请替换为您的 Bucket 域名)
mount -t alinas \
  -o efc,protocol=oss,passwd_file=/etc/passwd-oss \
  your-bucket.oss-cn-hangzhou.aliyuncs.com:/ /mnt/oss_data

命令解析

  • mount -t alinas:使用 EFC 客户端(alinas 类型)挂载。

  • your-bucket.oss-cn-hangzhou.aliyuncs.com:/ /mnt/oss_data:挂载目标配置。其中 your-bucket.oss-cn-hangzhou.aliyuncs.com 是您的 OSS Bucket 域名,/mnt/oss_data 是本地挂载点。

  • g_oss_STSFile=/etc/passwd-sts:指定包含 STS 凭证的配置文件路径。

  • passwd_file=/etc/passwd-oss:指定包含 OSS AccessKey 的密码文件路径。

更多参数说明请参考挂载参数详解

验证挂载结果

# 检查挂载是否成功
df -h | grep /mnt/oss_data
# 列出 OSS 中的文件
ls /mnt/oss_data

如果能看到您 OSS Bucket 中的文件,说明基础挂载成功。接下来可以根据需要启用缓存加速。

配置二:单机缓存模式

在基础挂载的基础上,启用本节点的内存和磁盘缓存,适用于单节点任务或快速测试

说明:如果您已完成基础挂载,需要先卸载:umount /mnt/oss_data
# 创建磁盘缓存目录
mkdir -p /mnt/cache/

# 挂载并启用单机缓存(使用 STS 凭证)
mount -t alinas \
  -o efc,protocol=oss,g_oss_STSFile=/etc/passwd-sts \
  -o g_tier_DadiIsDistributed=false \
  -o g_tier_DadiMemCacheCapacityMB=1024 \
  -o g_tier_DadiDiskCacheCapacityMB=10240 \
  -o g_tier_DadiDiskCachePath=/mnt/cache/ \
  -o g_server_Port=17871 \
  your-bucket.oss-cn-hangzhou.aliyuncs.com:/ /mnt/oss_data

命令解析

  • mount -t alinas ... your-bucket.oss-cn-hangzhou.aliyuncs.com:/ /mnt/oss_data:使用 EFC 客户端将 OSS Bucket 挂载到本地 /mnt/oss_data 目录。

  • g_oss_STSFile=/etc/passwd-sts:指定包含 STS 凭证的配置文件路径。

  • g_tier_DadiIsDistributed=false:单机缓存模式,不与其他节点通信。

  • g_tier_DadiMemCacheCapacityMB=1024:分配 1 GB 内存用于缓存数据。

  • g_tier_DadiDiskCacheCapacityMB=10240:分配 10 GB 磁盘空间用于缓存数据。

  • g_tier_DadiDiskCachePath=/mnt/cache/:磁盘缓存文件存放目录。

  • g_server_Port=17871:开放 17871 端口,以便后续使用命令行工具查看缓存命中率或执行数据预热。

更多参数说明请参考挂载参数详解

配置三:分布式缓存集群模式

将多个节点组成一个缓存集群,共享缓存数据,通过 P2P 网络加速数据分发,适用于大规模训练和推理的生产环境

1. 配置缓存节点列表

所有节点上创建 /etc/efc/rootlist 文件,填入集群中所有节点的信息:

# 格式: <唯一ID>:<节点内网IP>:<P2P端口>
1:192.168.1.1:17980
2:192.168.1.2:17980
3:192.168.1.3:17980
警告rootlist 文件在集群中必须完全一致。不一致可能导致部分节点无法加入缓存网络、缓存命中率下降。

2. 在所有节点执行挂载

# 创建磁盘缓存目录
mkdir -p /mnt/cache/

# 挂载并启用分布式缓存(使用 STS 凭证)
mount -t alinas \
  -o efc,protocol=oss,g_oss_STSFile=/etc/passwd-sts \
  -o g_tier_EnableClusterCache=true \
  -o g_tier_DadiIsDistributed=true \
  -o g_tier_DadiAddr=/etc/efc/rootlist \
  -o g_tier_DadiMemCacheCapacityMB=1024 \
  -o g_tier_DadiDiskCacheCapacityMB=10240 \
  -o g_tier_DadiDiskCachePath=/mnt/cache/ \
  -o g_server_Port=17871 \
  your-bucket.oss-cn-hangzhou.aliyuncs.com:/ /mnt/oss_data

命令解析

  • mount -t alinas ... your-bucket.oss-cn-hangzhou.aliyuncs.com:/ /mnt/oss_data:使用 EFC 客户端将 OSS Bucket 挂载到本地 /mnt/oss_data 目录。

  • g_oss_STSFile=/etc/passwd-sts:指定包含 STS 凭证的配置文件路径。

  • g_tier_EnableClusterCache=trueg_tier_DadiIsDistributed=true:启用 EFC 的核心功能——分布式缓存加速。

  • g_tier_DadiAddr=/etc/efc/rootlist:指定集群节点配置文件路径,用于构建 P2P 缓存网络。

  • g_tier_DadiMemCacheCapacityMB=1024:分配 1 GB 内存用于缓存数据。

  • g_tier_DadiDiskCacheCapacityMB=10240:分配 10 GB 磁盘空间用于缓存数据,缓存文件将存放在 /mnt/cache/ 目录。

  • g_server_Port=17871:开放 17871 端口,以便后续使用命令行工具查看缓存命中率或执行数据预热。

更多参数说明请参考挂载参数详解

配置四:Agent 模式(仅访问,不缓存数据

如果希望某个节点只访问分布式缓存,自身不缓存任何数据(适用于计算资源紧张的轻量节点),可以使用 Agent 模式挂载:

mount -t alinas \
  -o efc,protocol=oss,passwd_file=/etc/passwd-sts \
  -o g_tier_EnableClusterCache=true \
  -o g_tier_DadiIsDistributed=true \
  -o g_tier_DadiRootClientType=2 \
  -o g_tier_DadiAddr=/etc/efc/rootlist \
  -o g_server_Port=17871 \
  your-bucket.oss-cn-hangzhou.aliyuncs.com:/ /mnt/oss_data

命令解析

  • mount -t alinas ... your-bucket.oss-cn-hangzhou.aliyuncs.com:/ /mnt/oss_data:使用 EFC 客户端将 OSS Bucket 挂载到本地 /mnt/oss_data 目录。

  • g_oss_STSFile=/etc/passwd-sts:指定包含 STS 凭证的配置文件路径。

  • g_tier_EnableClusterCache=trueg_tier_DadiIsDistributed=true:启用分布式缓存加速。

  • g_tier_DadiRootClientType=2:设为 Agent 模式。此节点只访问其他节点的缓存,不对外提供缓存服务。

    • 默认值 0:Root/Agent 模式,同时提供和访问缓存。

    • 值 1:Root 模式,只提供缓存服务。

    • 值 2:Agent 模式,只访问缓存。

  • g_tier_DadiAddr=/etc/efc/rootlist:指定集群节点配置文件路径。

  • g_server_Port=17871:开放 17871 端口用于运维管理。

更多参数说明请参考挂载参数详解

缓存运维

挂载成功后,您可以通过 EFC 提供的运维接口对缓存进行管理。执行运维操作前,请确保挂载时已通过 -o g_server_Port=<端口号> 启用了管理端口(本文示例使用默认端口 17871)。

数据预热

此功能可提前将数据从 OSS 加载到缓存中,消除首次访问延迟,对模型推理等场景尤其重要。

  • 路径要求:预热路径必须是挂载点下的相对路径

  • 任务状态running(运行中)、completed(已完成)、canceled(已取消)、failed(已失败)。

  • 任务被动淘汰机制:预热任务不会无限保留,系统会根据以下规则自动淘汰历史任务记录:

    • 正在预热(running)的任务:只能通过 cancel 命令主动取消,无法被动淘汰。

    • 已完成/已取消/已失败的任务:当满足以下任一条件时会被自动淘汰:

      • 历史预热任务总数超过 10,000 条。

      • 任务记录时间超过 7 天。

使用 HTTP 接口

  • 参数说明

    参数名称

    是否必填

    说明

    target_path

    要预热的相对路径,多个路径用逗号 , 分隔。

    pattern

    正则表达式,用于筛选匹配的文件名。

    preceding_time

    筛选最近 N 秒内创建的任务(仅用于查询),默认 86400(1天)。

  • 发起预热

    预热挂载点 /mnt/oss_data 下的 file100G 文件。

    curl -s "http://localhost:17871/v1/warmup/load?target_path=file100G"

    返回示例:

    $ curl -s "http://localhost:17871/v1/warmup/load?target_path=file100G"
    {
        "ErrorCode": 0,
        "ErrorMessage": "Request processed",
        "Results": [{
                "ErrorCode": 0,
                "ErrorMessage": "The warm up (file100G) is processing in the background. Use the 'stat' command to get status.",
                "Location": "127.0.0.1:17871",
                "Path": "file100G"}]}
  • 查看file100G单个文件的预热状态。

    预热成功后,获取文件状态,状态会变成 completed;
    预热失败后,获取文件状态,状态会变成 failed,并打印出错误码和错误信息;
    /mnt/oss_data/file1Gmnt/oss_data/file1G 由于带有挂载点路径,会被错误解析,导致预热失败。
    curl -s "http://localhost:17871/v1/warmup/stat?target_path=file100G"

    返回示例:

    $ curl -s "http://localhost:17871/v1/warmup/stat?target_path=file100G"
    {
        "ErrorCode": 0,
        "ErrorMessage": "Request processed",
        "Results": [{
                "ErrorCode": 0,
                "ErrorMessage": "Successfully stat the warm up",
                "Location": "127.0.0.1:17871",
                "Path": "file100G",
                "TaskInfos": [{
                        "CompletedSize": 13898874880,
                        "ErrorCode": 0,
                        "ErrorMessage": "",
                        "IsDir": false,
                        "Path": "file100G",
                        "Pattern": "",
                        "Status": "running",
                        "SubmitTime": 1765274023424073,
                        "TotalSize": 107374182400}]}]}
  • 取消预热任务 

    取消 file100G 文件的预热任务。

    只有正在预热(running)的任务可以被取消。
    curl -s "http://localhost:17871/v1/warmup/cancel?target_path=file100G"

    返回示例:

    $ curl -s "http://localhost:17871/v1/warmup/cancel?target_path=file100G"
    {
        "ErrorCode": 0,
        "ErrorMessage": "Request processed",
        "Results": [{
                "ErrorCode": 0,
                "ErrorMessage": "Successfully canceled the warm up tasks",
                "Location": "127.0.0.1:17871",
                "Path": "file100G"}]}

使用命令行工具

  • 参数说明

    参数名称

    是否必填

    说明

    -m

    挂载点路径。

    -r

    操作类型:warmup/load(预热)、warmup/stat(查询)、warmup/cancel(取消)。

    --path

    挂载点下的相对路径,根目录传 "",多个路径用逗号 , 分隔。

    --pattern

    正则表达式,用于筛选匹配的文件名。

    --preceding_time

    筛选最近 N 秒内的任务(仅用于查询),默认 86400(1天)。

  • 发起预热

    预热 /mnt/oss_data 下 testDir 目录中的文件。

    /usr/bin/aliyun-alinas-efc-cli -m /mnt/oss_data -r warmup/load --path "testDir" --pattern ".*_2$"

    返回示例:

    $ /usr/bin/aliyun-alinas-efc-cli -m /mnt/oss_data -r warmup/load --path "testDir"
    {
        "ErrorCode": 0,
        "ErrorMessage": "Request processed",
        "Results": [{
                "ErrorCode": 0,
                "ErrorMessage": "The warm up (testDir) is processing in the background. Use the 'stat' command to get status.",
                "Location": "",
                "Path": "testDir"}]}
  • 查看预热状态

    查询 testDir 目录的预热进度。

    /usr/bin/aliyun-alinas-efc-cli -m /mnt/oss_data -r warmup/stat --path "testDir"

    预热任务状态:

    • running:预热任务正在执行

    • completed:预热任务完成

    • cancel:预热任务取消,不可继续预热,只能重新预热

    • failed:预热失败后,任务状态会变成failed,并打印出错误码和相关错误信息。

    返回示例:

    $ /usr/bin/aliyun-alinas-efc-cli -m /mnt/oss_data -r warmup/stat --path "testDir"
    {
        "ErrorCode": 0,
        "ErrorMessage": "Request processed",
        "Results": [{
                "ErrorCode": 0,
                "ErrorMessage": "Successfully stat the warm up",
                "Location": "",
                "Path": "testDir",
                "TaskInfos": [{
                        "CompletedSize": 11875394560,
                        "ErrorCode": 0,
                        "ErrorMessage": "",
                        "IsDir": true,
                        "Path": "testDir",
                        "Pattern": "",
                        "Status": "running",
                        "SubmitTime": 1765273087321936,
                        "TotalSize": 107872527360}]}]}
  • 取消预热

    取消 testDir 的预热任务(仅限 running 状态)。

    已经完成或失败的任务不能被取消,已完成的任务会取消失败。
    /usr/bin/aliyun-alinas-efc-cli -m /mnt/oss_data -r warmup/cancel --path "testDir"

    返回示例:

    $ /usr/bin/aliyun-alinas-efc-cli -m /mnt/oss_data -r warmup/cancel --path "testDir"
    {
        "ErrorCode": 0,
        "ErrorMessage": "Request processed",
        "Results": [{
                "ErrorCode": 0,
                "ErrorMessage": "Successfully canceled the warm up tasks",
                "Location": "",
                "Path": "testDir"}]}

缓存监控

此功能用于实时查看缓存的运行状态,如命中率、吞吐量等,是性能调优的关键依据。

查看监控数据
  • HTTP 方式(推荐,返回 JSON 格式)

    curl -s "http://localhost:17871/v1/tier"
  • 命令行方式(返回文本格式)

    aliyun-alinas-efc-cli -m <挂载点> -r tier
清除监控数据

重置监控计数器(如 tier_read_hit 等指标归零)。

  • HTTP方式

    curl -s "http://localhost:17871/v1/tier/clear"
  • 命令行方式

    aliyun-alinas-efc-cli -m <挂载点> -r tier -c
关键指标说明

以下指标描述了从客户端 A 访问客户端 B 的缓存(B 提供 root 服务)时可能经过的路径:

image

指标名称

说明

对应路径

tier_read

经过缓存路径的读请求总数量。

i

tier_read_bytes

经过缓存路径的读请求总数据量。

i

tier_read_hit

从分布式节点读成功,并命中缓存的请求数量。

ii

tier_read_hit_bytes

从分布式节点读成功,并命中缓存的数据总量(可能有读放大)。

ii

tier_read_miss

从分布式节点读成功,但未命中缓存(回源)的请求数量,会触发分布式节点读后端。

iii

tier_read_miss_bytes

从分布式节点读成功,但未命中缓存的数据总量。

iii

tier_direct_read

从分布式节点读失败,客户端直接从后端 OSS 读取成功的请求数量。

v

tier_direct_read_bytes

从分布式节点读失败,客户端直接从后端 OSS 读取成功的数据总量。

v

tier_root_read_source

客户端作为分布式节点,未命中缓存时,读后端的请求数量。

iv

tier_root_read_source_bytes

客户端作为分布式节点,未命中缓存时,读后端的数据总量。

iv

缓存扩缩容

在线增删节点

此操作用于动态调整分布式缓存集群的节点数量,无需中断服务。

  • 扩容:在所有节点的 rootlist 文件中,添加新节点的 IP 地址。

  • 缩容:在所有节点的 rootlist 文件中,删除目标节点的 IP 地址。

    移除节点时,系统采用 LRU(Least Recently Used,最近最少使用) 机制对缓存数据进行淘汰,确保优先保留访问频率高的热点数据,维持缓存命中率。
  • 生效机制:EFC 进程会周期性(默认5s)地重新读取 rootlist 文件并自动应用变更。

调整单节点缓存容量
重要:EFC 不支持动态调整单个节点的缓存容量。如需调整,必须卸载并重新挂载文件系统,请在业务低峰期执行。

在重新挂载时,通过修改以下参数来调整缓存容量:

参数名

说明

单位

默认值

g_tier_DadiMemCacheCapacityMB

单节点内存缓存总容量。

MB

0

g_tier_DadiDiskCacheCapacityMB

单节点磁盘缓存总容量。

MB

0

挂载参数动态调整

EFC 提供一个Python脚本工具,用于在不手动卸载的情况下修改挂载参数。该工具的原理是:修改 EFC 的 state 文件(存储启动命令),然后 kill 当前 EFC 进程,进程重启时自动加载新的参数。

  • 下载工具

    wget https://aliyun-alinas-eac-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/cache/efc_runtime_ops.latest.py
  • 修改挂载参数

    python3 efc_runtime_ops.py update <本地挂载路径> [-o <更新参数,...>]...

    示例:

    python3 update_state_file.py update /mnt/oss_data \
              -o g_tier_EnableClusterCache=true,g_tier_tier_DadiP2PPort=23456 \
              -o g_tier_BlockSize=1048576
  • 回滚

    修改参数时,工具会自动备份旧的state文件。如果修改后 EFC 出现故障,可以回滚恢复:

    python3 efc_runtime_ops.py rollback <本地挂载路径> [备份路径]

    示例:用默认的备份文件路径恢复state文件。

    python3 efc_runtime_ops.py rollback /mnt/oss_data

目录缓存管理

EFC 默认开启目录缓存以加速 ls 等目录遍历操作。如果 OSS 端的目录结构发生变化而 EFC 未能及时感知,可手动清理目录缓存。

目录缓存相关参数(挂载时指定):

参数名称

默认值

说明

g_readdircache_Enable

true

是否启用 readdir 缓存

g_readdircache_MaxCount

20000

readdir 缓存的最大项数

g_readdircache_MaxSize

100 MiB

readdir 缓存可使用的内存大小(单位:字节)

g_readdircache_RemainTime

3600

缓存有效期(单位:秒),默认 1 小时

清理目录缓存

  • HTTP方式

    curl -s "http://localhost:17871/v1/action/clear_readdir_cache"
  • 命令行方式

    aliyun-alinas-efc-cli -m <挂载点> -r action -k clear_readdir_cache

挂载参数详解

基础参数

参数名称

默认值

示例值

是否必填

说明

efc

-

efc

必须包含此参数,以标识使用 EFC 挂载。

protocol

-

oss

后端存储协议,挂载 OSS 时固定为 oss

passwd_file

-

/etc/passwd-oss

必须与g_oss_STSFile二选一

包含 AccessKeyId:AccessKeySecret 的密码文件绝对路径,格式为 AK:SK

g_oss_STSFile

-

/etc/passwd-sts

必须与passwd_file二选一

包含 STS 临时凭证的配置文件绝对路径。支持实时更新,有效期由用户保证。

trybind

yes

no

是否尝试 bind 挂载。使用镜像回源时需设为 no

缓存配置参数

参数名称

默认值

示例值

是否必填

说明

g_tier_EnableClusterCache

true

true

是否开启 EFC 缓存加速功能。设为 false 则退化为简单的协议转换挂载。

g_tier_DadiIsDistributed

true

true

是否开启分布式缓存。true 为分布式模式,false 为单机缓存模式。

g_tier_DadiAddr

-

/etc/efc/rootlist

rootlist 文件的绝对路径。在分布式模式下为必填项。

g_tier_DadiRootClientType

0

2

EFC 挂载形式。0:Root/Agent 模式(默认);1:Root 模式(仅提供缓存);2:Agent 模式(仅访问缓存,不存储)。

g_tier_DadiMemCacheCapacityMB

0

1024

内存缓存容量(MB)。默认值为 0,表示不启用内存缓存。

g_tier_DadiDiskCacheCapacityMB

0

10240

磁盘缓存容量(MB)。默认值为 0,表示不启用磁盘缓存。

g_tier_DadiDiskCachePath

-

/mnt/cache/

磁盘缓存目录的绝对路径,需以 / 结尾。启用磁盘缓存时为必填项。

g_tier_DadiP2PPort

17980

17980

P2P 缓存通信端口。保持默认,并确保安全组放行。

g_tier_DadiSdkGetTrafficLimit

3 GB/s

3221225472

从 OSS 回源时的读流量限速值(B/s)。

g_tier_DadiCachePageSizeKB

16

16

缓存分页大小(KB)。一般无需修改。

元数据与目录缓存参数

参数名称

默认值

示例值

是否必填

说明

g_metadata_CacheEnable

false

true

是否开启元数据缓存。开启后可减少对 OSS 的 HEAD 请求。

g_readdircache_Enable

true

true

是否启用 readdir 缓存。

g_readdircache_MaxCount

20000

20000

readdir 缓存的最大项数。

g_readdircache_MaxSize

100 MiB

104857600

readdir 缓存可使用的内存大小(单位:字节)。

g_readdircache_RemainTime

3600

3600

readdir 缓存有效期(秒),默认 1 小时。

运维与高级参数

参数名称

默认值

示例值

是否必填

说明

g_server_Port

0

17871

缓存管理端口。设为非 0 值(如 17871)以启用 HTTP 运维接口。

最佳实践

权限与安全

  • 保护密码文件:密码文件权限必须设置为 600,并存放在安全的位置,避免凭证泄露。

  • 优先使用 STS:从安全角度考虑,建议优先使用 STS 临时凭证而非长期 AccessKey,降低密钥泄露风险。

  • 最小化安全组开放:仅在集群节点之间开放 P2P 通信端口 17980,并严格限制管理端口 17871 的访问来源。

场景化配置建议

AI 模型训练

  • 特点:通常涉及对大型数据集(可能包含大量小文件)的重复、顺序读取。

  • 建议

    • 配置足够大的磁盘缓存,以容纳整个或大部分热点数据集。

    • 在训练任务开始前,对核心数据集进行数据预热,将首次读取的开销提前。

AI 模型推理

  • 特点:大量计算节点需要同时加载相同的模型文件。

  • 建议

    • 务必启用分布式集群模式,充分利用 P2P 网络分发模型文件,避免对 OSS 造成单点压力。

    • 在服务上线或更新模型时,对模型文件进行数据预热

数据一致性管理

  • 理解最终一致性:EFC 是只读缓存,对 OSS 后端的变更不是实时同步的。应用设计时应能容忍一定的数据延迟。

  • 主动刷新:对于需要频繁更新并立即读取的场景,应在应用逻辑中增加调用清除目录缓存接口的步骤。

  • 开启元数据缓存:对于元数据不常变化的场景,通过 -o g_metadata_CacheEnable 开启元数据缓存,可以减少对 OSS 的 GetObjectMeta 请求。

计费说明

  • EFC 客户端:在邀测期间,EFC 客户端本身免费使用。

  • OSS 费用:通过 EFC 访问 OSS 产生的请求次数、外网流出流量等费用,将按照 OSS 的标准计费规则收取。使用 EFC 缓存可以有效减少回源请求和流量,从而降低 OSS 费用。

常见问题

Q:OSS数据更新后,EFC缓存是否能立即感知?

A:EFCOSS数据更新的感知能力取决于元数据缓存的配置状态。

  • 未开启元数据缓存时:文件更新时可立即感知;新增文件时,由于readdir cache机制,新增文件可能无法立即显示,需清理readdir cache后才能看到。

  • 开启元数据缓存时:文件更新时无法立即感知,需清理元数据缓存;新增文件时需同时清理readdir cache和元数据缓存才能看到。

解决方案

当需要立即感知OSS端的数据变更时,可通过以下方式手动清理缓存:

  1. 清理目录缓存(适用于新增文件无法显示的情况)

    curl -s "http://localhost:17871/v1/action/clear_readdir_cache"
  2. 清理元数据缓存(仅在开启元数据缓存时需要):

    curl -s "http://localhost:17871/v1/action/clear_metadata_cache"
在开启元数据缓存的情况下,若要完全同步OSS的最新数据,建议同时执行以上两个清理命令。