cephfs:1 clients failing to respond to cache pressure原因分析

问题现象

ceph -s中经常出现报警:

1 clients failing to respond to cache pressure

其大致原因是cephfs的mds让客户端释放部分metadata的cache,客户端释放不及时mds会向monitor上报此类告警

通过代码分析其详细原因及如何进行规避或者修复

原因分析

找到mds代码中上报此告警的地方,如下:

void Beacon::notify_health(MDSRank const *mds)
{
    // 由于函数比较长,截取其中报错的部分
    set<Session*> sessions;
    mds->sessionmap.get_client_session_set(sessions);

    const auto recall_warning_threshold = g_conf().get_val<Option::size_t>("mds_recall_warning_threshold");
    const auto max_completed_requests = g_conf()->mds_max_completed_requests;
    const auto max_completed_flushes = g_conf()->mds_max_completed_flushes;
    std::vector<MDSHealthMetric> late_recall_metrics;
    std::vector<MDSHealthMetric> large_completed_requests_metrics;
    for (auto& session : sessions) {
      const uint64_t recall_caps = session->get_recall_caps(); // 获取每条连接上的recall caps的数量
      if (recall_caps > recall_warning_threshold) {
        dout(2) << "Session " << *session <<
             " is not releasing caps fast enough. Recalled caps at " << recall_caps
          << " > " << recall_warning_threshold << " (mds_recall_warning_threshold)." << dendl;
        std::ostringstream oss;
        oss << "Client " << session->get_human_name() << " failing to respond to cache pressure";
        MDSHealthMetric m(MDS_HEALTH_CLIENT_RECALL, HEALTH_WARN, oss.str());
        m.metadata["client_id"] = stringify(session->get_client());
        late_recall_metrics.emplace_back(std::move(m));
    }
}

很容易发现只要连接上的recall caps数大于recall_warning_threshold就会上报此告警,而recall_warning_threshold是通过配置文件读取的,此处是默认配置32K。

那么为什么recall_caps会大于32K呢?继续找其原因

找到recall caps的修改处

uint64_t Session::notify_recall_sent(size_t new_limit)
{
  const auto num_caps = caps.size();
  ceph_assert(new_limit < num_caps);  // Behaviour of Server::recall_client_state
  const auto count = num_caps-new_limit;
  uint64_t new_change;
  if (recall_limit != new_limit) {
    new_change = count;
  } else {
    new_change = 0; /* no change! */
  }

  /* Always hit the session counter as a RECALL message is still sent to the
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当客户端未能对缓存压力做出反应时,可能有几个原因。 首先,可能是由于网络连接的问题。客户端可能无法连接到缓存服务器或者与服务器的连接不稳定,导致无法及时响应缓存的压力。这可能会导致客户端无法从缓存中获取所需的数据,从而影响到整个服务的性能。 其次,可能是客户端本身对缓存机制的不完全理解。客户端可能没有充分利用缓存,或者没有正确配置和管理缓存。这可能导致客户端无法有效利用缓存,从而导致缓存压力增加,影响到系统性能。 再次,可能是缓存服务器未能及时更新缓存数据。客户端可能会频繁地向缓存服务器发送请求,但如果服务器没有及时更新缓存数据,客户端可能无法从缓存中获取到最新的数据,从而影响到其响应速度和性能。 最后,可能是由于客户端应用程序的设计或代码问题。客户端应用程序可能存在bug或者设计缺陷,导致无法正确处理缓存压力。这可能需要开发人员对应用程序进行检查和修复,以解决客户端未响应缓存压力的问题。 为了解决客户端未能响应缓存压力的问题,首先应检查网络连接,确保连接稳定。其次,应对客户端进行培训,使其充分理解和正确配置缓存机制。同时,应确保缓存服务器能够及时更新数据,并定期检查和修复客户端应用程序中的bug和设计问题。通过以上措施,可以提高客户端对缓存压力做出的响应,并改善整个系统的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值