ceph deep-scrub卡住导致业务中断问题分析

ceph deep-scrub卡住导致业务中断问题分析1 问题背景一个 pgscrub 了 14 天 前端虚机挂掉大半 2 分析过程 2 1 查看 scrubpg 的主 OSD 日志从日志里可以看出 pg 13 832 有 slowop 该 oldestslowop 等待时间 s 14 天这些 op 都处于 waitingforsc 什么场景会导致 op 处于 waitingforsc 首先从字面上可以理解这些 op 是等待

1. 问题背景

一个pg scrub了14天,前端虚机挂掉大半

2. 分析过程

2.1 查看scrub pg的主OSD日志

在这里插入图片描述
从日志里可以看出pg[13.832]:

  • 有slow op,该oldest slow op等待时间s==14天
  • 这些op 都处于waiting for scrub

2.2 分析scrub过程那些场景会导致scrub阻塞,首先看下scrub状态机

在这里插入图片描述

从上面的scrub状态变迁过程可以看出,有4种情况会导致scrub阻塞,分别是

  • WAIT_PUSHES: wait for pushes to apply
  • WAIT_LAST_UPDATE: wait for writes to flush
  • WAIT_REPLICAS: wait for replicas to build scrub map
  • WAIT_DIGEST_UPDATES: waiting on digest updates

从主osd日志并不能看出当前pg scruber处于那个状态,接下来分析其他从副本日志看看有什么线索。

2.3 分析从副本osd.227日志,过滤13.832的日志

在这里插入图片描述
从上面过滤出的日志,发现13.832这个pg

  • 出现了slow op,该slow op 等待时间为s==11天
  • 这些op处于currently reached_pg,说明已经开始交给pg层处理了
  • 这些op类型是replica scrub即主副本发来scrub请求,请看下图
PrimaryA B C INACTIVE NEWCHUNK BUILD_MAP _request_scrub_map _request_scrub_map WAIT_REPLICAS CEPH_OSD_OP_SCRUB_MAP CEPH_OSD_OP_SCRUB_MAP COMPARE_MAPS FINISH INACTIVE PrimaryA B C

从上面的流程可以知道主PG当前的状态是为WAIT_REPLICAS即主副本上所有的io请求都是因为等待从副本osd.227 scrub完成而阻塞

既然都已经reached_pg,那接下来分析那些场景会阻塞replica scrub op。

2.4 分析那些场景会导致replica scrub阻塞

分析replica scrub调用过程,有3种情况会阻塞replica scrub op,分别为

  • sharedwq共享线程池被阻塞了
  • 当前的replica scrub op中scrub_to记录的版本号大于当前osd记录的last_update_applied,即这些scrub对象数据还没更新到和主OSD一致
  • 当前osd正在做数据恢复即active_pushes不为0

首先排除sharedwq共享线程池被阻塞了,因为sharedwq的线程会被加入到HeartbeatMap监控中心,一旦线程被阻塞了HeartbeatMap就会检查到并且会在日志中打印timeout的告警严重的话会造成线程自杀,而日志并无这些异常打印,所以这种情况排除掉

其次排除掉因为数据恢复导致的这种情况,因为当前集群运行正常并未做任何的数据恢复,并且恢复的过程中是不会进行scrub校验的

剩下的只有一种情况即scrub_to记录的版本号大于当前osd记录的last_update_applied这一种情况了,什么场景会出现scrub_to大于last_update_applied情况呢?

首先明确一点scrub_to是主osd封装的,记录是本次选中参与scrub的所有scrub对象最新的pglog版本

其次明确last_update_applied本地副本自己on_apply到filestore后更新的,因此就会存在同一时刻不同副本的last_update_applied的版本号不一致,如下图

PrimaryA B C last_update_applied = 1748’25607 client write op issue_op issue_op queue_transaction sub_op_modify_impl sub_op_modify_impl queue_transaction queue_transaction on_applied(last_update_applied = 1748’25609) sched_scrub chunk_scrub(scrub_to = 1748’25609) _request_scrub_map _request_scrub_map WAIT_REPLICAS replica_scrub(last_update_applied = 1748’25607 < scrub_to = 1748’25609) 将srub op挂起 scrubber.active_rep_scrub = op on_appled(last_update_applied = 1748’25609) scrub_to != last_update_applied, scrub op一直被挂起 CEPH_OSD_OP_SCRUB_MAP PrimaryA B C

从上图可以看出当从副本B在收到scrub op请求时如果此时op还未on_applied到filestore就会把scrub op挂起等待op applied完成后重新调度该op,而重新调度的前提是last_update_applied等于scrub_to否则scrub op就会永远被挂起,就会出现这个问题。所以什么场景会导致last_upate_applied不是一个一个版本递增的呢?

2.5 分析什么场景会导致last_update_applied版本不是按照一个版本一个版本方式增加的?

分析代码有一种场景会导致op on_applied成功后last_update_applied是增加了两个版本,即clone场景

当打了快照或者克隆触发clone操作时候版本就会增加两次,如果此时恰好这些对象又被选中参与scrub过程并按照上面假设的时序进行就会复现该问题了

3. 原因分析

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230696.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月8日 上午9:01
下一篇 2026年2月8日 上午9:22


相关推荐

  • 数据库之关系模型介绍「建议收藏」

    数据库之关系模型介绍「建议收藏」本篇文章是数据库系列的第一篇文章,本系列文章是笔者在学习《数据库系统概念》这本书总结的内容,使用的数据库是mysql。关系数据库的结构关系数据库由表(table)的集合构成,每个表由唯一的名字。表中的一行代表了一组值之间的联系,而表就是这种联系的一个集合,表这个概念和数学上的关系概念是密切相关的,这也是关系数据模型名称的由来。在关系模型的术语中,关系(relation)用来指代表,元组…

    2022年7月16日
    17
  • Cursor Skills实战:从概念到生产级前端界面的一站式指南

    Cursor Skills实战:从概念到生产级前端界面的一站式指南

    2026年3月15日
    2
  • mt4数据api接口_外汇api

    mt4数据api接口_外汇api1、MT4API交易接口是什么?MT4Api接口是跨平台多账号交易接口,是将MT4交易通道以API的方式聚合在一起,帮助开发商在各经纪商不提供manager后台账号、无须EA插件的情况下,也能轻松接入不同的MT4交易平台,完成登录、交易和订单查询的功能,真正实现跨平台交易,减少巨额的人工成本和硬件成本。适合开发行情展示或者订单管理,交易策略等,如果开发实力可以,你甚至可以用他开发一个MT4客户端!此MT4API比使用MT4终端进行报价和交易要快得多;提供实时开仓、平仓等多种功能。2、MT4API的协

    2025年10月19日
    2
  • DialogResult的使用方法

    DialogResult的使用方法usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespace_2014

    2022年6月22日
    47
  • pycharm快速替换_pycharm代码追踪

    pycharm快速替换_pycharm代码追踪1.在ios中用commend+shift+R打开菜单windons系统可以试试將commend替换为control会出现这样的界面(如果你有提前选中单词的话,系统将默认被选中的单词是將被替换的单词(可以更改))2.在第二行输入需要保留的语句,然后按下回车即可替换我们会发现标记的地方发生了替换注:一定要注意自己要替换的是那些部分(那些文件(它是可以替换别的文件的语句的))!!!!千万不要替换错了(多了),很难改…

    2022年8月28日
    9
  • Pytest(6)重复运行用例pytest-repeat「建议收藏」

    Pytest(6)重复运行用例pytest-repeat「建议收藏」前言平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来。自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,

    2022年7月31日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号