一个ceph-osd异常DOWN掉的原因分析

本文详细分析了CEPH分布式存储集群中OSD异常与物理机问题的关联,通过日志和流量分析,定位问题根源为物理机内核版本存在bug导致的软锁定问题,进一步探讨了OSD异常引发的流量异常及其原因,最终提出合理的假设解释了OSD无法正常反馈心跳的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天早上,运维的兄弟报告说,ceph分布式存储集群同时有3个OSD异常DOWN掉。因为CEPH集群是三份数据存储的,所以对业务没有什么太大的影响,所以等有空再查根本原因。

同时报告了有一台物理机当机了,做了重启恢复的操作。


有空的时候对问题进行了分析,同事进行了预查,发现如下:

1、在osd down掉的一段时间,所有的CEPH节点的网络流量都高上去了。

2、3个OSD down掉的时候可以看到日志是大概是说,本OSD断言心跳断掉了,所以由断言触发了关闭。

3、上面物理机当机的时时间与osd当机的时间基本上是同时。


由于物理机(KVM HOST)的问题比较严重,所以先查它的问题,查看系统日志发现是之前已经知道的一个原因导致的。这个原因是:由于这一批物理机部署的比较久,当时是安装的centos7.0,kernel是3.10-123,由于我们使用了openvswitch,而这个版本的Kernel有一个openvswitch的Bug,在某些极端的状况下,会出现Soft lockup的问题。由于升级kernel会影响客户的VM,所以一直没有升级。

再分析ceph osd down掉的问题

一开始怀疑是由于网络流量高导致的心跳不正常,最后发现在那个时间段,使用该存储集群的物理机的流量在那个时间段内都没有流量异常,初步排除由于Guest OS导致的问题。

查看监控流量图,发现流量高的时间是在OSD down掉之后才发生的,所以更确定是因为ceph进行数据恢复导致的流量攀升,所以确定流量异常和OSD异常的关系是:OSD异常是因,流量异常是果。

再分析OSD异常的原因,首先发现monitor有以下日志:

2015-09-11 05:50:50.941975 7fc7f0985700  1 mon.mdsmon1@0(leader).osd e59081 prepare_failure osd.13 192.168.20.22:6806/23132 from osd.56 192.168.20.25:6828/4297 is reporting failure:1
2015-09-11 05:50:50.941995 7fc7f0985700  0 log_channel(cluster) log [DBG] : osd.13 192.168.20.22:6806/23132 reported failed by osd.56 192.168.20.25:6828/4297
2015-09-11 05:50:51.494959 7fc7f33be700  0 log_channel(cluster) log [INF] : pgmap v35579953: 2688 pgs: 2688 active+clean; 13309 GB data, 40498 GB used, 34722 GB / 75220 GB avail; 101082 B/s rd, 3726 kB/s wr, 883 op/s
2015-09-11 05:50:51.839815 7fc7f0985700  1 mon.mdsmon1@0(leader).osd e59081 prepare_failure osd.13 192.168.20.22:6806/23132 from osd.12 192.168.20.22:6800/45218 is reporting failure:1
2015-09-11 05:50:51.839834 7fc7f0985700  0 log_channel(cluster) log [DBG] : osd.13 192.168.20.22:6806/23132 reported failed by osd.12 192.168.20.22:6800/45218
2015-09-11 05:50:52.551379 7fc7f33be700  0 log_channel(cluster) log [INF] : pgmap v35579954: 2688 pgs: 2688 active+clean; 13309 GB data, 40498 GB used, 34722 GB / 75220 GB avail; 159 kB/s rd, 4259 kB/s wr, 804 op/s
2015-09-11 05:50:52.822059 7fc7f0985700  1 mon.mdsmon1@0(leader).osd e59081 prepare_failure osd.13 192.168.20.22:6806/23132 from osd.14 192.168.20.22:6820/4240 is reporting failure:1
2015-09-11 05:50:52.822077 7fc7f0985700  0 log_channel(cluster) log [DBG] : osd.13 192.168.20.22:6806/23132 reported failed by osd.14 192.168.20.22:6820/4240
2015-09-11 05:50:53.304056 7fc7f0985700  1 mon.mdsmon1@0(leader).osd e59081 prepare_failure osd.13 192.168.20.22:6806/23132 from osd.97 192.168.20.29:6833/42329 is reporting failure:1
2015-09-11 05:50:53.304074 7fc7f0985700  0 log_channel(cluster) log [DBG] : osd.13 192.168.20.22:6806/23132 reported failed by osd.97 192.168.20.29:6833/42329
2015-09-11 05:50:53.304280 7fc7f0985700  1 mon.mdsmon1@0(leader).osd e59081  we have enough reports/reporters to mark osd.13 down

大体意思就是说,有好几个OSD都报告说osd.13DOWN掉了,既然大家都这么说,那就认为它死了吧。

再看这个osd的日志:

 -3722> 2015-09-11 05:50:34.371402 7f91c3e0f700  1 -- 192.168.20.22:6809/23132 <== osd.45 192.168.20.24:0/45829 1146487 ==== osd_ping(ping e59081 stamp 2015-09-11 05:50:34.557436) v2 ==== 47+0+0 (3343728556 0 0) 0x148d0200 con 0xab37220
 -3721> 2015-09-11 05:50:34.371436 7f91c260c700  1 -- 192.168.20.22:6808/23132 <== osd.45 192.168.20.24:0/45829 1146487 ==== osd_ping(ping e59081 stamp 2015-09-11 05:50:34.557436) v2 ==== 47+0+0 (3343728556 0 0) 0x6e2e800 con 0xab32c00
 -3720> 2015-09-11 05:50:34.371459 7f91c3e0f700  1 -- 192.168.20.22:6809/23132 --> 192.168.20.24:0/45829 -- osd_ping(ping_reply e59081 stamp 2015-09-11 05:50:34.557436) v2 -- ?+0 0x127f1400 con 0xab37220
 -3719> 2015-09-11 05:50:34.371547 7f91c260c700  1 -- 192.168.20.22:6808/23132 --> 192.168.20.24:0/45829 -- osd_ping(ping_reply e59081 stamp 2015-09-11 05:50:34.557436) v2 -- ?+0 0x1055e000 con 0xab32c00
 -3718> 2015-09-11 05:50:34.518138 7f91c260c700  1 -- 192.168.20.22:6808/23132 <== osd.90 192.168.20.28:0/13937 1146080 ==== osd_ping(ping e59081 stamp 2015-09-11 05:50:34.918851) v2 ==== 47+0+0 (2786616502 0 0) 0x15bfb800 con 0xadb44c0
 -3717> 2015-09-11 05:50:34.518181 7f91c260c700  1 -- 192.168.20.22:6808/23132 --> 192.168.20.28:0/13937 -- osd_ping(ping_reply e59081 stamp 2015-09-11 05:50:34.918851) v2 -- ?+0 0x6e2e800 con 0xadb44c0
 -3716> 2015-09-11 05:50:34.518227 7f91c3e0f700  1 -- 192.168.20.22:6809/23132 <== osd.90 192.168.20.28:0/13937 1146080 ==== osd_ping(ping e59081 stamp 2015-09-11 05:50:34.918851) v2 ==== 47+0+0 (2786616502 0 0) 0xff8fe00 con 0x11ce1600
 -3715> 2015-09-11 05:50:34.518307 7f91c3e0f700  1 -- 192.168.20.22:6809/23132 --> 192.168.20.28:0/13937 -- osd_ping(ping_reply e59081 stamp 2015-09-11 05:50:34.918851) v2 -- ?+0 0x148d0200 con 0x11ce1600
 -3714> 2015-09-11 05:50:34.686020 7f91af0da700  1 -- 192.168.20.22:6807/23132 <== osd.73 192.168.20.27:6825/23657 1691650 ==== osd_repop(client.2449020.0:3342441 3.13e e056913e/rbd_data.255e726b8b4567.0000000000000e46/head//3 v 59081'19449146) v1 ==== 929+0+8971 (805582020 0 3664754197) 0xdfa3c00 con 0xb401760
 -3713> 2015-09-11 05:50:34.686433 7f91af0da700  5 -- op tracker -- seq: 39473910, time: 2015-09-11 05:50:34.685145, event: header_read, op: osd_repop(client.2449020.0:3342441 3.13e e056913e/rbd_data.255e726b8b4567.0000000000000e46/head//3 v 59081'19449146)
 -3712> 2015-09-11 05:50:34.686618 7f91af0da700  5 -- op tracker -- seq: 39473910, time: 2015-09-11 05:50:34.685147, event: throttled, op: osd_repop(client.2449020.0:3342441 3.13e e056913e/rbd_data.255e726b8b4567.0000000000000e46/head//3 v 59081'19449146)
 -3711> 2015-09-11 05:50:34.686658 7f91af0da700  5 -- op tracker -- seq: 39473910, time: 2015-09-11 05:50:34.685897, event: all_read, op: osd_repop(client.2449020.0:3342441 3.13e e056913e/rbd_data.255e726b8b4567.0000000000000e46/head//3 v 59081'19449146)
 -3710> 2015-09-11 05:50:34.686712 7f91af0da700  5 -- op tracker -- seq: 39473910, time: 0.000000, event: dispatched, op: osd_repop(client.2449020.0:3342441 3.13e e056913e/rbd_data.255e726b8b4567.0000000000000e46/head//3 v 59081'19449146)

结合最后死掉的日志,分析就是这个OSD和其它的OSD都不太能发送和接受心跳包了,问题是,为什么???

经过一系列的分析,结果是无果,但是也看到了另外一个线索即:计算节点物理机的crash时间正好在这三个OSD出现故障之前。

最终,因为正好大胆地做了一个假设:rbd的客户端(kvm)因为kernel出现了异常,所以无法完成分布式存储的某些操作,进而导致相关对象所在的块的OSD有了锁之类的东西,进而导致这个OSD无法正常反馈心跳,进而导致了OSD被自己断言死亡。


这是一个猜测,但是是一个非常合理的猜测。

有知道的同学,也请告知,回头把这个问题报告到社区中问一下。

<think>好的,我现在需要解决用户提出的问题:Ceph的`ceph -s`命令在执行时出现卡顿的情况。首先,我应该回忆Ceph的基本架构和`ceph -s`命令的作用。`ceph -s`是用来查看集群状态的,它会收集各个组件的状态信息,包括MON、OSD、MDS等。如果这个命令卡住,可能的原因有很多,需要逐一排查。 首先,我应该考虑的是MON(监控节点)的问题。因为`ceph -s`需要与MON通信,如果MON节点响应慢或者网络有问题,就会导致命令卡顿。这时候需要检查MON节点的日志,看看是否有错误或警告信息。比如,MON之间是否无法正常通信,或者选举出现问题。另外,网络延迟或丢包也可能导致通信不畅,可以用`ping`或者`traceroute`测试MON节点之间的网络状况。 接下来,OSD(对象存储守护进程)的状态也很重要。如果有大量的OSD处于down状态,或者在恢复数据,集群可能处于非健康状态,导致`ceph -s`需要更长时间来收集信息。用户需要检查OSD的状态,使用`ceph osd stat`或`ceph osd tree`查看是否有OSD异常。同时,检查存储池是否接近满,比如`mon_osd_nearfull_ratio`或`mon_osd_full_ratio`的设置,如果存储池接近这些阈值,可能会影响集群性能。[^1][^3] 然后,集群负载过高也是一个可能的原因。如果集群正在进行数据恢复、重新平衡或者其他后台任务,可能会占用大量资源,导致`ceph -s`响应慢。这时候需要查看集群的负载情况,比如使用`ceph -w`实时监控集群事件,或者检查OSD的IO使用率、CPU和内存的使用情况。 另外,Ceph配置参数可能也需要调整。比如,`mon_client_ping_timeout`和`mon_lease`的设置,如果超时时间太短,可能导致命令等待响应时超时。适当增加这些参数的值,可能有助于缓解问题。同时,检查认证问题,比如cephx认证是否正常,密钥环是否有效,权限是否正确。[^2] 还有可能的是日志级别设置过高,导致MON节点处理请求时记录大量日志,影响性能。可以临时调低日志级别,比如使用`ceph tell mon.* injectargs --mon_debug_slow_ping_time 0`来减少日志输出,看看是否有改善。 最后,如果上述方法都无效,可能需要考虑升级Ceph版本,或者联系社区支持。已知的某些版本可能存在性能问题,升级到修复后的版本可能会解决卡顿的问题。[^4] 在排查过程中,应该逐步排除可能性,先从MON和网络开始,再检查OSD和集群负载,最后考虑配置和版本问题。同时,查看相关的日志文件,如`/var/log/ceph/ceph-mon.*.log`,寻找错误信息或警告,这能提供直接的线索。</think>### Ceph `ceph -s` 命令卡顿问题解决方案 #### 1. 检查监控节点(MON)状态 - **MON节点通信延迟**:通过`ping`或`traceroute`测试MON节点间网络质量。若网络延迟或丢包严重,需优化网络配置。 - **MON日志分析**:查看MON日志`/var/log/ceph/ceph-mon.*.log`,检查是否存在选举失败或同步异常。例如: ```bash tail -f /var/log/ceph/ceph-mon.$(hostname).log ``` - **MON性能调优**:调整MON超时参数(需谨慎): ```bash ceph tell mon.* injectargs --mon_client_ping_timeout=30 ``` #### 2. 排查OSD与存储池状态 - **OSD健康状态**:执行以下命令查看是否有异常OSD: ```bash ceph osd stat ceph osd tree ``` 若存在大量`down`或`recovery`状态,需修复或等待恢复完成。 - **存储池容量阈值**:检查是否接近`mon_osd_nearfull_ratio`或`mon_osd_full_ratio`阈值。若存储池过满,需扩容或删除冗余数据。 #### 3. 集群负载与后台任务 - **实时监控集群事件**: ```bash ceph -w # 观察实时事件(如数据恢复、PG重平衡) ``` - **资源使用率检查**: ```bash top # 查看CPU/内存使用率 iostat -x # 检查磁盘IO负载 ``` #### 4. 认证与配置问题 - **cephx认证验证**:确认客户端密钥环权限正常: ```bash ceph auth get client.admin # 检查权限是否完整 ``` - **调整MON响应参数**:适当增加超时时间: ```bash ceph tell mon.* injectargs --mon_lease=30 # 默认值可能为10秒 ``` #### 5. 日志级别与版本问题 - **降低日志级别**:临时减少MON日志输出: ```bash ceph tell mon.* injectargs --mon_debug_slow_ping_time=0 ``` - **版本兼容性**:确认Ceph版本是否存在已知性能问题。若版本较旧,升级至稳定版本[^4]。 #### 6. 高级排查工具 - **使用`strace`跟踪命令**: ```bash strace -T ceph -s # 分析系统调用耗时 ``` - **检查时钟同步**:确保所有节点时间一致(NTP服务正常)。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值