侧边栏壁纸
博主头像
青菜-halo2 博主等级

行动起来,活在当下

  • 累计撰写 74 篇文章
  • 累计创建 6 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

Ceph OOM故障排查与解决方案总结

Administrator
2025-10-20 / 0 评论 / 0 点赞 / 20 阅读 / 0 字

Ceph OOM故障排查与解决方案总结

故障现象

在Ceph集群运行过程中,系统日志频繁出现OOM(Out of Memory)错误,ceph-osd进程被系统强制杀死:

[日 10月 19 04:51:32 2025] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/docker-9800a38238b45282d99e91c9bc9bbd9b0265d4efca8bfabdb34c2e11e22b5da5.scope,task=ceph-osd,pid=3003,uid=167
[日 10月 19 04:51:32 2025] Out of memory: Killed process 3003 (ceph-osd) total-vm:5131232kB, anon-rss:3785492kB, file-rss:196kB, shmem-rss:0kB, UID:167 pgtables:9356kB oom_score_adj:0

环境信息

  • Ceph版本: 15.2.17 (Octopus)
  • 部署方式: Docker容器化部署
  • 受影响组件: ceph-osd进程

根本原因分析

  1. 未配置内存限制: OSD进程默认无内存使用上限
  2. BlueStore缓存增长: 随着数据量增加,缓存占用持续增长
  3. 系统内存不足: 多个Ceph组件竞争有限的内存资源

解决方案

1. 设置OSD内存目标

# 为所有OSD设置内存目标(推荐3-4GB)
ceph config set osd osd_memory_target 3221225472  # 3GB

# 设置BlueStore缓存大小
ceph config set osd bluestore_cache_size 1073741824  # 1GB

# 启用缓存自动调整
ceph config set osd bluestore_cache_autotune true

# 设置内存基准值
ceph config set osd osd_memory_base 1073741824  # 1GB

2. 为特定OSD单独配置(可选)

# 如果某个OSD需要特殊配置
ceph config set osd.0 osd_memory_target 4294967296  # 4GB
ceph config set osd.0 bluestore_cache_size 536870912  # 512MB

3. 验证配置

# 检查所有OSD配置
ceph config dump | grep -E "(osd_memory_target|bluestore_cache_size)"

# 检查特定OSD配置
ceph config show osd.0 | grep -E "(memory|cache)"
ceph config show osd.4 | grep -E "(memory|cache)"

# 预期输出示例:
# osd_memory_target = 3221225472
# bluestore_cache_size = 1073741824
# bluestore_cache_autotune = true

4. 应用配置

# 逐个重启OSD服务(避免同时重启多个)
# 先重启一个OSD观察效果
docker restart <osd_container_id>

# 等待集群恢复健康状态
ceph status
watch ceph health

# 确认健康后重启下一个OSD
docker restart <next_osd_container_id>

监控与验证

1. 实时监控内存使用

# 监控容器内存使用
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}"

# 监控进程内存
ps aux | grep ceph-osd | awk '{print $2, $4, $11}' | sort -k2 -nr

# 检查系统内存
free -h
cat /proc/meminfo | grep -E "(MemTotal|MemAvailable|SwapTotal|SwapFree)"

2. 设置监控告警

# Ceph内置告警配置
ceph config set global mon_warn_on_osd_usage_min 70
ceph config set global mon_warn_on_osd_usage_max 85

# 检查当前内存使用情况
ceph osd perf

预防措施

1. 系统级优化

# 确保有足够的swap空间
swapon --show

# 如果没有swap或空间不足,创建swap文件
dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 将swap配置加入fstab实现永久生效
echo '/swapfile none swap sw 0 0' >> /etc/fstab

2. 容器资源限制

# 检查当前容器内存限制
docker inspect <container_id> | grep -A 5 Memory

# 更新容器内存限制(如果需要)
docker update --memory 4g --memory-swap 4g <container_name>

3. 内核参数调优

# 降低OOM killer的侵略性
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
echo 'vm.overcommit_ratio=95' >> /etc/sysctl.conf
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

故障恢复检查清单

  • 配置OSD内存目标
  • 设置BlueStore缓存大小
  • 启用缓存自动调整
  • 验证配置生效
  • 逐个重启OSD服务
  • 监控集群健康状态
  • 确认内存使用稳定
  • 设置监控告警

经验总结

  1. 预防优于治疗: 在部署Ceph集群时就应该配置合理的内存限制
  2. 渐进式变更: 配置变更后逐个重启服务,避免服务中断
  3. 持续监控: 建立完善的内存监控体系,及时发现潜在问题
  4. 容量规划: 根据业务需求合理规划硬件资源,预留足够缓冲

快速命令参考

# 一键配置OSD内存限制(3GB内存目标 + 1GB缓存)
ceph config set osd osd_memory_target 3221225472 && \
ceph config set osd bluestore_cache_size 1073741824 && \
ceph config set osd bluestore_cache_autotune true

# 快速验证配置
ceph config dump | grep -E "(osd_memory|bluestore_cache)"

# 重启所有OSD(生产环境谨慎使用)
docker ps --filter "name=ceph.*osd" --format "{{.ID}}" | xargs -I {} docker restart {}

通过以上配置和优化,可以有效地预防Ceph OSD进程因内存使用过多而被OOM Killer杀死的问题,确保集群的稳定运行。

0

评论区