Luminous 中的新增功能:CephFS 元数据服务器内存限制

batrick

Ceph 文件系统使用一组元数据服务器来为存储在 RADOS 中的 CephFS 元数据提供权威缓存。最基本的原因是维护内存中的热元数据集合,而无需与 RADOS 中的元数据池进行通信。另一个重要原因是允许客户端从权威 MDS 获取能力,从而安全地缓存元数据,而无需在多个客户端缓存之间引入不一致性。换句话说,客户端从元数据服务器获得保证,只要持有能力(MDS 可能会在未来撤销该能力),其缓存将保持一致。

在 Luminous 之前,元数据服务器 (MDS) 必须通过操作员设置 mds 缓存大小 配置设置 来限制其缓存的大小。这将为 MDS 在其缓存中保存的 inode 数量设置一个软限制。当超过此限制时,MDS 将开始从客户端撤销能力。每个客户端然后将尝试修剪各自的缓存以释放这些能力。一旦 MDS 缓存对象的全部能力被撤销,MDS 就可以从其自身的缓存中修剪该对象。

这个设计存在一些问题

  • Inode 限制是内存使用的糟糕代理,而我们实际上想要限制的是内存使用。还有其他类型的元数据对象被缓存,包括目录元数据和目录条目 (dentries),这些对象没有被考虑在内。因此,某些文件系统层次结构可能会使用比其他层次结构更多的 RAM。
  • 操作员必须尝试了解在给定 inode 限制下的内存使用情况。过去,我们建议每 1GB RAM 使用 100k 个 inode。

Luminous 中的更改

Luminous (12.2.1) 中,MDS 缓存现在由内存池管理,从而可以跟踪分配。随着这一变化,我们添加了新的基于内存使用量的缓存限制,这些限制默认情况下取代了旧的 inode 计数限制

  • mds 缓存内存限制 MDS 应该强制其缓存的软内存限制(以字节为单位)。管理员应使用此设置代替 mds 缓存大小。类型: 64 位无符号整数 默认值:1 GB
  • mds 缓存保留量 MDS 缓存要维护的缓存保留量(内存或 inode)。一旦 MDS 开始减少其保留量,它将撤销客户端状态,直到其缓存大小缩小到恢复保留量为止。类型: 浮点数 默认值:0.05

默认情况下,MDS 的缓存内存限制为 1GB。旧的 mds 缓存大小限制(inode 限制)仍然有效,但现在默认值为 0,表示没有 inode 限制。

新的配置选项 mds 缓存保留量 指示要维护的内存保留量以供将来使用。默认情况下,此保留量为内存(或 inode)限制的 5%。一旦 MDS 开始减少其保留量,它将开始从客户端撤销能力。

mds 缓存大小 一样,mds 缓存内存限制 是一个软限制。由于行为不端的应用程序或有缺陷的客户端可能无法放弃其能力,因此有时 MDS 需要超过其缓存大小才能允许集群继续运行。mds health cache threshold 配置选项允许操作员设置 mds 缓存内存限制(默认值为 1.5)的倍数,超过该值 MDS 将开始发送集群健康警告消息 (MDS_CACHE_OVERSIZED),通知您缓存太大。

实际操作演示

观察新限制的操作是一个简单的练习,即用元数据填充 MDS 缓存。我们将查看一个具有 1 个活动 MDS 的测试集群,mds.a

$ ceph status  集群:id:7c30394b-edf4-4193-b441-7ffcdb33a411 健康:HEALTH_OK

服务:mon:3 个守护进程,quorum a,b,c mgr:x(active) mds:cephfs_a-1/1/1 up  {0=a=up:active}, 2 up:standby

我们设置 20MB 的内存限制以快速查看结果

$ ceph daemon mds.a config get mds_cache_memory_limit {"mds_cache_memory_limit": "20971520"}

现在复制一些文件以开始构建 MDS 缓存

$ cp -av /usr/include/ /mnt/cephfs &

最后观察 MDS 缓存

$ while sleep 1; do ceph daemon mds.a perf dump | jq '.mds_mem.rss'; ceph daemon mds.a dump_mempools | jq -c '.mds_co'; done 26436 {"items":143,"bytes":38296} 26436 {"items":143,"bytes":38296} 26420 {"items":147,"bytes":38456} 26420 ... 83300 {"items":104082,"bytes":19102080} 83300 {"items":105234,"bytes":19418768} 83300 {"items":107092,"bytes":19653712} 79752 {"items":108748,"bytes":19988144} 79752 {"items":110238,"bytes":20311504} 92412 {"items":111258,"bytes":20577632} 92412 {"items":114742,"bytes":21102672} 92412 {"items":106456,"bytes":19662976} 85088 {"items":95473,"bytes":17542536}

我们可以看到 MDS 在分配给缓存对象的字节数 (“.mds_co” 在 mempool 统计信息中) 达到大约 19MB 时撤销状态。客户端开始释放其能力,MDS 最终将其缓存修剪到 17MB。

结论

在 Ceph 的每次发布中,CephFS 都会变得更容易设置和使用。此更改解决了社区提出的一个反复出现的要求,即简化 MDS 的部署和管理。请继续向我们提供有关如何改进 CephFS 的反馈,并享受吧!