进行 OSD 排障前,先检查一下 monitors 和网络。如果 ceph health 或 ceph -s 返回的是健康状态,这意味着 monitors 形成了法定人数。如果 monitor 还没达到法定人数、或者 monitor 状态错误,要先解决 monitor 的问题。核实下网络,确保它在正常运行,因为网络对 OSD 的运行和性能有显著影响。
2.1 收集 OSD 数据
开始OSD 排障的第一步最好先收集信息,如 ceph osd tree
ceph 日志
默认路径 /var/log/ceph
,其他路径查看配置文件
管理套接字
列出节点上所有ceph 套接字:ls /var/run/ceph
执行以下命令显示可用选项,将 {daemon-name}
换成实际的守护进程,如ceph daemon osd.1 help
I/O 统计工具
iostat -x
诊断信息
dmesg | grep scsi
dmesg | grep error
2.2 停止数据向外重新平衡
周期性维护,停机维护osd 让caush自动平衡停止:ceph osd set noout
维护好osd后,ceph osd unset noout
2.3 OSD没运行
OSD起不来
重启集群后,有osd启动不了,依次检查:
- 配置文件
- 检查路径:检查配置文件、osd数据、osd日志分区路径
- 检查最大线程数:节点osd如果有很多,就回触碰到最大线程数限制,可通过
sysctl -w kernel.pid_max=4194303
调大线程数,若解决,可通过修改/etc/sysctl.conf
中的kernel.pid_max
永久生效 - 内核版本
- 段错误,提高日志级别查看详细
OSD失败
通过 ceph health detail
查看
如果因磁盘或其他错误不能正常运行,将会在日志/var/log/ceph
里输出一条错误信息
如果守护进程因心跳失败、或者底层核心文件系统无响应停止,查看dmesg
获取硬盘或者内核错误
硬盘无剩余空间
ceph 不允许向满的osd 写入数据。mon osd full ratio
默认为0.95,达到0.95阻止写入,mon osd health ratio
默认0.85,0.85健康告警
- 增加osd
- 删除不需要的数据
- 单独调整已满的osd 的near full 和full比例
ceph tell osd.id injectargs '--mon-osd-full-ratio .98'
ceph tell osd.id injectargs '--mon-osd-full-ratio 0.98
- 调低 osd crush weight,使数据迁移
ceph osd crush reweight osd.id {a-little-lower-weight-value}
2.4 OSD 龟速或无响应
网络问题
确保ceph 进程和依赖的进程在监听
netstat -alp|grep ceph
检查网络统计信息netstat -s
驱动器配置
一个存储驱动器应该只用于一个osd,检查是否共用
扇区损坏/碎片化磁盘
检查磁盘是否有坏道/碎片
MON、OSD 共存
mon 频繁调用fsync()
,会妨碍工作,特别是共享驱动器时。遭遇的性能问题可能有:
- 较老的内核(低于3.0)
- Argonaut 版运行在老的glibc上
- 运行的内核不支持sysncfs(2)系统调用
进程共存
日志记录级别
osd限流
因osd速度过快影响性能
内核版本
内核与syncfs问题
文件系统问题
内存不足
建议 osd/1G 内存
2.5 震荡的OSD
如果 cluster(后端)网络失败、或出现了明显的延时,同时 public(前端)网络却运行良好, OSD 目前不能很好地处理这种情况。这时 OSD 们会向 monitor 报告邻居 down 了、同时报告自己是 up 的,我们把这种情形称为震荡( flapping )
如果有原因导致 OSD 震荡(反复地被标记为 down ,然后又 up ),你可以强制 monitor 停止这种震荡状态:
ceph osd set noup
ceph osd set nodown
这些标记记录在 osdmap 数据结构里:
ceph osd dump | grep flags
flags no-up,no-down
可用以下命令清楚标记:
ceph osd unset noup
ceph osd unset nodown