mds缓存配置

元数据服务器协调所有 MDS 和 CephFS 客户端之间的分布式缓存。 缓存用于改善元数据访问延迟并允许客户端安全(连贯地)改变元数据状态(例如,通过 chmod)。 MDS 释放 capabilitiesdirectory entry leases 以指示客户端可以缓存哪些状态以及客户端可以执行哪些操作(例如写入文件)。

MDS 和客户端都尝试强制缓存大小。 指定 MDS 缓存大小的机制如下所述。 请注意,MDS 缓存大小不是硬限制。 MDS 始终允许客户端查找加载到缓存中的新元数据。 这是一项基本策略,因为它避免了客户端请求中的死锁(某些请求可能在caps释放之前依赖于持有的caps)。

当 MDS 缓存过大时,MDS 将 recall 客户端状态,因此缓存项变为未固定并有资格被删除。 只有当没有客户端引用要删除的元数据时,MDS 才能删除缓存状态。 下面还介绍了如何根据工作负载的需要配置 MDS recall设置。 如果 MDS recall的内部限制无法跟上客户端的工作负载,则这是必要的。

MDS 缓存大小

可以按字节数限制元数据服务器 (MDS) 缓存的大小。 这是通过 mds_cache_memory_limit 配置完成的:

  • mds_cache_memory_limit

    这将设置MDS缓存的目标最大内存使用量,并且是限制MDS内存使用量的主要可调参数。MDS将尝试保持在这个限制的预留值以下(默认情况下是95%;1 - mds_cache_reservation),通过在其缓存中删除未使用的元数据,并在客户端缓存中recall缓存的项。由于从客户端recall的速度较慢,MDS可能超过此限制。mds_health_cache_threshold(150%)设置MDS发出集群健康警告信号时的缓存满阈值。

    类型: size

    默认值:4Gi

    # ceph config set mds mds_cache_memory_limit 8GB
    

此外,MDS操作可以使用参数mds_cache_reservation指定缓存预留:

  • mds_cache_reservation

    MDS 缓存要维护的缓存预留(内存或 inode)。 一旦 MDS 开始进入其预留,它将recall客户端状态,直到其缓存大小缩小以恢复预留。

    类型: float

    默认值: 0.05

缓存预留被限制为内存的百分比,默认设置为 5%。 此参数的目的是让 MDS 为其缓存维护额外的内存储备,以供新的元数据操作使用。 因此,MDS 通常应该在其内存限制以下运行,因为它会从客户端recall旧状态,以便在其缓存中删除未使用的元数据。

如果 MDS 无法将其缓存保持在目标大小以下,则 MDS 将向 Monitor 发送健康警报,表面缓存太大。 这由 mds_health_cache_threshold 配置控制,默认为最大缓存大小的 150%:

  • mds_health_cache_threshold

    生成健康警告的缓存大小阈值

    类型:float

    默认值: 1.5

由于缓存限制不是硬限制,CephFS 客户端、MDS 或行为不端的应用程序中的潜在错误可能会导致 MDS 超出其缓存大小。 健康警告旨在帮助操作员发现这种情况并进行必要的调整或调查有问题的客户。

MDS 缓存削减

有两种配置可用于限制 MDS 中的缓存削减速率:

  • mds_cache_trim_threshold

    可以削减的dentries数量的阈值

    类型: size

    默认值: 256Ki

  • mds_cache_trim_decay_rate

    削减MDS缓存节流阀的衰减率

    类型: float

    默认值: 1.0

节流的目的是防止MDS花费过多的时间来削减其缓存。这可能会限制它处理客户端请求或执行其他维护的能力。

trim配置控制内部decay counter。 每当从缓存中削减元数据时,计数器就会增加。 threshold设置计数器的最大大小,而decay rate指示计数器的指数半衰期。 如果 MDS 不断地从其缓存中删除项目,它将达到每秒删除项目的稳定状态 -ln(0.5)/rate*threshold

增加配置设置’ mds_cache_trim_decay_rate '的值将导致MDS花费更少的时间来削减缓存。若要增加缓存削减速率,请设置较低的值。

默认值是保守的,可能需要针对具有大缓存大小的生产 MDS 进行更改。

MDS Recall

MDS 限制其对客户端状态(capabilities/leases)的recall,以防止为自己处理来自客户端的释放消息创建过多的工作。 这是通过以下配置控制的:

在给定的recall事件中从单个客户端recall的最大capabilities数:

  • mds_recall_max_caps

    单次recall 中从客户会话中recall 的最大caps数

    类型: size

    默认值:5000

会话中decay counter 的阈值(threshold)和衰减速率(decay rate ):

  • mds_recall_max_decay_threshold

    一个会话中已recalled caps的节流衰减阈值

    类型: size

    默认值: 128Ki

  • mds_recall_max_decay_rate

    一个会话中已recalled caps的节流衰减速率

    类型: float

    默认值: 1.5

会话衰减计数器控制单个会话的recall速率。 计数器的行为与上面的缓存削减相同。 recall的每个caps都会增加计数器。

还有一个全局衰减计数器,用于限制所有会话recall:

  • mds_recall_global_max_decay_threshold

    全局性已recalled caps的节流衰减阈值

    类型:size

    默认值:128Ki

它的衰减速率(decay rate )与 mds_recall_max_decay_rate 相同。 任何会话的任何已 recalled caps也会增加此计数器。

如果客户端释放状态缓慢,则会报告“failing to respond to cache pressure”或MDS_HEALTH_CLIENT_RECALL的警告。 每个会话的释放速率由另一个衰减计数器监控,该计数器配置为:

  • mds_recall_warning_threshold

    缓慢会话cap recall 警告的衰减阈值

    类型:size

    默认值: 256Ki

  • mds_recall_warning_decay_rate

    缓慢会话cap recall 警告的衰减速率

    类型: float

    默认值: 60.0

每次释放caps时,计数器都会递增。 如果客户端没有足够快地释放caps并且存在缓存压力,计数器将指示客户端是否在缓慢释放状态。

一些工作负载和客户端行为可能需要更快地recall客户端状态以跟上caps获取的步伐。 建议根据需要增加上述计数器,以解决集群健康状态下的任何缓慢recall警告。

MDS Cap Acquisition Throttle

对大型目录层次结构执行简单的“find”命令将导致客户端接收caps的速度明显快于释放速度。 MDS 将尝试让客户端将其caps降低到 mds_max_caps_per_client 限制以下,但recall限制会阻止它跟上获取的步伐。 因此 readdir 被限制以通过以下配置控制caps获取:

readdir cap 获取衰减计数器的阈值( threshold)和衰减速率(decay rate):

  • mds_session_cap_acquisition_throttle

    用于cap acquisition decay counter 的阈值

    类型: uint

    默认值: 500000

  • mds_session_cap_acquisition_decay_rate

    readdir 获取的 caps 的 session cap 获取计数器的半衰期。 这用于限制客户端缓慢释放caps的 readdir 请求。

    类型: float

    默认值: 10.0

cap acquisition decay counter通过 readdir 控制cap acquisition速率。 衰减计数器的行为与缓存削减或caps recall相同。 每个 readdir 调用都会将计数器增加结果中的文件数。

在 readdir 可能被 cap acquisition throttle限制之前,客户端必须超过的 mds_max_caps_per_client 的比率:

  • mds_session_max_caps_throttle_ratio

    在 readdir 可能被 cap acquisition throttle限制之前,客户端必须超过的 mds_max_caps_per_client 的比率:

    类型: float

    默认值: 1.1

由于上cap acquisition throttling而重试客户端请求的超时时间(以秒为单位):

  • mds_cap_acquisition_throttle_retry_request_timeout

    由于上cap acquisition throttling而重试客户端请求的超时时间(以秒为单位):

    类型: float

    默认值: 0.5

如果client per session获取的caps数量大于 mds_session_max_caps_throttle_ratio 并且cap acquisition decay counter大于 mds_session_cap_acquisition_throttle,则 readdir 被限制。 readdir 请求在 mds_cap_acquisition_throttle_retry_request_timeout 秒后重试。

Session 活跃度

MDS 还跟踪会话是否处于静止状态。 如果客户端会话没有使用它的capabilities或者处于安静状态,MDS 将开始从会话中recall状态,即使它没有处于缓存压力下。 当集群工作负载很热并且缓存压力迫使 MDS recall状态时,这有助于 MDS 避免未来的工作。 期望的是,不使用其capabilities能的客户端不太可能在不久的将来随时使用这些capabilities。

确定给定会话是否静止由以下配置变量控制:

  • mds_session_cache_liveness_magnitude

    这是内部活跃度衰减计数器和会话所持有的capabilities数量的幅度差(以2为基数)。当出现这种差异时,MDS将会话视为静态的,并开始recall capabilities。

    类型:size

    默认值: 10B

    参见 mds_session_cache_liveness_decay_rate

  • mds_session_cache_liveness_decay_rate

    这决定了在 MDS 开始抢先recalling capabilities之前会话需要静止多长时间。 默认值为5分钟将导致衰减计数器在1小时后减半10次,即1/1024。 选择默认值10(1^10 或 1024),以便 MDS 认为先前的聊天会话(大约)在 1 小时后处于静止状态。

    类型:float

    默认值: 5 minutes

    参见 mds_session_cache_liveness_magnitude

配置 mds_session_cache_liveness_decay_rate 指示衰减计数器的半衰期,用于跟踪客户端对capabilities的使用。 每次客户端操作或获取capabilities时,MDS 都会增加计数器。 这是监控客户端缓存利用率的一种粗略但有效的方法。

mds_session_cache_liveness_magnitude 是活跃度衰减计数器和会话的未完成caps数量的幅度差(以2为基数)。 因此,如果客户端具有 1*2^20 (1M) 未完成的caps并且仅使用 小于 1*2^(20-mds_session_cache_liveness_magnitude)(使用默认值 1K),MDS 将认为客户端保持静止并开始recall。

Capability Limit

MDS 还试图防止单客户端获得过多caps。 这有助于防止在某些情况下恢复需要很长时间。 客户端通常不需要拥有如此大的缓存。 限制通过以下方式配置:

  • mds_max_caps_per_client

    一个客户端可以拥有的最大caps数量

    类型: uint

    默认值: 1Mi

不建议将此值设置为 5M 以上,但它可能对某些工作负载有所帮助。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值