存储相关cephceph-mon卡死故障分析处理
zphj1987问题现象
ceph -s命令无返回了,查看mon的日志输出内容如下
看到的现象是 failed to assign global_id
然后尝试预分配更多的 global_id
mon_globalid_prealloc=1111110000
这个地方调整后,只是延缓了id的无法分配,没有解决问题,这个地方并不是消息id的问题,而是mon此时出现了问题,无法去正常的回收和响应消息,从而耗尽了id,出现了上面的现象,出现问题以后,mon实际无法响应请求了
把mon的进程直接放到前台运行
1 2 3 4 5
| /usr/bin/ceph-mon -f --cluster ceph --id MYMON1 --setuser ceph --setgroup ceph tcmalloc: large alloc 1073741824 bytes == 0x5568d6ac6000 @ 0x7fb651ad24ef 0x7fb651af1bd6 0x556892b6c049 0x556892b6c08b 0x556892b6c940 0x7fb64f4e36f6 0x7fb64f4e7e66 0x7fb64f4debb5 0x556892b7a87d 0x556892ba9ba8 0x556892badb35 0x556892baefef 0x556892bdc6c6 0x556892bd8c86 0x7fb6531d8d69 0x7fb6532861ed 0x7fb64fd9dea5 0x7fb64ec60b0d tcmalloc: large alloc 2147483648 bytes == 0x556916b3e000 @ 0x7fb651ad24ef 0x7fb651af1bd6 0x556892b6c049 0x556892b6c08b 0x556892b6c940 0x7fb64f4e36f6 0x7fb64f4e7e66 0x7fb64f4debb5 0x556892b7a87d 0x556892ba9ba8 0x556892badb35 0x556892baefef 0x556892bdc6c6 0x556892bd8c86 0x7fb6531d8d69 0x7fb6532861ed 0x7fb64fd9dea5 0x7fb64ec60b0d tcmalloc: large alloc 4294967296 bytes == 0x556996b3e000 @ 0x7fb651ad24ef 0x7fb651af1bd6 0x556892b6c049 0x556892b6c08b 0x556892b6c940 0x7fb64f4e36f6 0x7fb64f4e7e66 0x7fb64f4debb5 0x556892b7a87d 0x556892ba9ba8 0x556892badb35 0x556892baefef 0x556892bdc6c6 0x556892bd8c86 0x7fb6531d8d69 0x7fb6532861ed 0x7fb64fd9dea5 0x7fb64ec60b0d tcmalloc: large alloc 8589934592 bytes == (nil) @ 0x7fb651ad24ef 0x7fb651af1bd6 0x556892b6c049 0x556892b6c08b 0x556892b6c940 0x7fb64f4e36f6 0x7fb64f4e7e66 0x7fb64f4debb5 0x556892b7a87d 0x556892ba9ba8 0x556892badb35 0x556892baefef 0x556892bdc6c6 0x556892bd8c86 0x7fb6531d8d69 0x7fb6532861ed 0x7fb64fd9dea5 0x7fb64ec60b0d
|
可以看到一直在大量的使用内存,这个地方会出现需要tcmalloc: large alloc 8589934592 bytes很大的问题
可以看到cpu占用很高,内存占用很多
mon的现象就是上面的持续的100%的情况,但是实际没做什么
临时恢复的方法
通过增加一个这个参数进行了问题的绕过
mon_sync_max_payload_size=4096
mon恢复了正常
这个在mon出现消息异常的时候,能够解决一些问题,这个地方我们继续分析相关的问题
问题定位
故障的原因是在响应ceph -s的时候产生了数百万个=的打印,这个纯属一个bug
https://tracker.ceph.com/issues/50587
这个issue里面比较清楚,并且15版本里面本身就完整的去掉了这一块,所以15版本没有问题,只有这个14版本有这个问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| https://github.com/ceph/ceph/blob/v14.2.11/src/mon/Monitor.cc auto& pem = mgrstatmon()->get_progress_events(); if (!pem.empty()) { ss << "\n \n progress:\n"; for (auto& i : pem) { ss << " " << i.second.message << "\n"; ss << " ["; unsigned j; for (j = 0; j < (unsigned)(i.second.progress * 30.0); ++j) { ss << '='; } for (; j < 30; ++j) { ss << '.'; } ss << "]\n"; } } ss << "\n "; }
|
就是这块代码的问题
社区相关的pr已经解决了
https://github.com/ceph/ceph/pull/41098
按这样修改以后进行验证
这个问题触发的情况是在osd出现频繁的上下线或者out以后,计算里面的状态值里面有问题,然后执行ceph -s的时候就触发了大量的内存分配的情况了
这个问题拿的社区版本的14.2.11 复现出来了这个问题,这个复现需要使用异常的mon的数据进行复现,按照上面的在14.2.11上面进行修改后,重新打包rpm,进行复测
可以看到14.2.22版本确认已经解决了这个问题了
出现问题后可以采用两个方式验证这个问题是否解决
- 1、直接用14.2.11进行pr的修改,验证是否解决
- 2、不改代码,直接用官方的14.2.22,验证是否解决,升级是不是有其它问题(启动看看有没有问题)
这个需要看根据实际项目来看是原包升级还是整体升级,原版本改动小一点,回退也方便
离线mon数据的加载复现方法
准备了一台虚拟机,主机名和ip都设置为跟现场一样的,ceph版本也安装一样的版本,把mon的目录拷贝到虚拟机的环境里面
进行单mon的处理
1 2 3 4
| [root@lab103 ~] [root@lab103 ~] [root@lab103 ~] [root@lab103 ~]
|
mon数据的属性问题
一般上面就可以了,但是这个有个版本的属性不匹配,需要多做下面的操作
1 2 3 4 5 6 7
| [root@lab103 ~] monmaptool: monmap file /tmp/monmap monmap:persistent:[kraken(1),luminous(2),mimic(4),osdmap-prune(8),nautilus(16),unknown(128)] monmap:optional:[none] monmap:required:[kraken(1),luminous(2),mimic(4),osdmap-prune(8),nautilus(16),unknown(128)] available:supported:[kraken(1),luminous(2),mimic(4),osdmap-prune(8),nautilus(16)] available:persistent:[kraken(1),luminous(2),mimic(4),osdmap-prune(8),nautilus(16)]
|
关闭相关的属性
1 2 3 4 5 6 7 8
| [root@lab103 ~] [root@lab103 ~] monmaptool: monmap file /tmp/monmap monmap:persistent:[kraken(1),luminous(2),mimic(4),osdmap-prune(8),nautilus(16)] monmap:optional:[none] monmap:required:[kraken(1),luminous(2),mimic(4),osdmap-prune(8),nautilus(16)] available:supported:[kraken(1),luminous(2),mimic(4),osdmap-prune(8),nautilus(16)] available:persistent:[kraken(1),luminous(2),mimic(4),osdmap-prune(8),nautilus(16)]
|
打包问题处理
打包14.2.11过程出现了一个问题,按这个修改后打包
https://tracker.ceph.com/issues/52891
问题总结
这个就是14版本早期版本的bug,在后期上下线osd的时候会触发,碰到了话,就按上面的先恢复后修复的方式处理即可,重点关注14版本的