全部产品
Search
文档中心

:CentOS7实例随机性宕机问题

更新时间:May 10, 2022

免责声明:本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

问题描述

在使用Linux实例时,如果该实例满足以下三种情况,可能导致系统宕机。

  • 使用CentOS7.5或者7.6公共镜像或者自定义镜像创建实例。
  • 内核版本为3.10.0-862或3.10.0-957。
  • 频繁执行大文件或目录操作。

问题原因

CentOS7.5和7.6内核加入支持磁盘mq-deadline elevator的补丁,由于此补丁有Bug,会导致磁盘请求的nr_phys_segments有可能超过磁盘参数max_segments设置,virtio block驱动代码检测到这个错误后,会主动触发内核异常。已知的内核崩溃现象包括实例内部宕机,以及内核崩溃导致的常见内核堆栈,常见内核堆栈类似如下。

[336627.578227] FS: 0000000000000000(0000) GS:ffff9612bfd00000(0000) knlGS:0000000000000000
[336627.579031] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[336627.579604] CR2: 00007f3c0aee4ac0 CR3: 00000000369c8000 CR4: 00000000003606e0
[336627.580317] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[336627.581029] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[336627.581740] Call Trace:
[336627.582004] [] ? __kmalloc+0x2e/0x230
[336627.582544] [] virtqueue_add_sgs+0x87/0xa0 [virtio_ring]
[336627.583256] [] __virtblk_add_req+0xc2/0x1d0 [virtio_blk]
[336627.583953] [] ? __blk_segment_map_sg+0x57/0x1a0
[336627.584580] [] ? __sbitmap_queue_get+0x2b/0xb0
[336627.585195] [] virtio_queue_rq+0x139/0x2b0 [virtio_blk]
[336627.585883] [] blk_mq_dispatch_rq_list+0x268/0x620
[336627.586526] [] ? elv_rb_del+0x2a/0x40
[336627.587064] [] blk_mq_do_dispatch_sched+0x7e/0x130
[336627.587707] [] blk_mq_sched_dispatch_requests+0x11e/0x1c0
[336627.588415] [] __blk_mq_run_hw_queue+0x50/0xc0
[336627.589031] [] blk_mq_run_work_fn+0x15/0x20
[336627.589621] [] process_one_work+0x17f/0x440
[336627.590212] [] worker_thread+0x126/0x3c0
[336627.590777] [] ? manage_workers.isra.25+0x2a0/0x2a0
[336627.592891] [] kthread+0xd1/0xe0
[336627.594856] [] ? insert_kthread_work+0x40/0x4
[336627.596928] [] ret_from_fork_nospec_begin+0x21/0x21
[336627.599043] [] ? insert_kthread_work+0x40/0x40
[336627.601105] Code: ff e9 06 fd ff ff 48 89 d9 44 89 f2 48 c7 c6 3c b3 22 c0 48 c7 c7 78 c0 22 c0 31 c0 e8 48 7c d7 c8 8b 43 60 e9 19 ff ff ff 0f 0b <0f> 0b e8 ea 07 00 00 8b 55 ac 48 c7 c6 88 b4 22 c0 48 c7 c7 a0
[336627.606857] RIP [] virtqueue_add+0x4a2/0x4d0 [virtio_ring]
[336627.609101] RSP
[336627.613759] ---[ end trace b23f6bcae8735444 ]---
[336627.615676] Kernel panic - not syncing: Fatal exception
[336628.691211] Shutting down cpus with NMI

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
  1. 通过Linux社区官网发布的版补丁,修复该内核Bug。或者在社区官网下载新版本内核,在Linux实例中手动编译更新内核,编译更新完成后重启实例即可。
  2. 如果以上操作不方便执行,可以在控制台重启该实例,然后由阿里云通过后端修复该问题。
    提示:请务必在控制台重启实例,不要在系统中重启。

如果以上解决方法不便执行,可以参考如下方法,临时解决问题。

方法一

通过管理终端登录Linux实例,执行如下命令,将当前Linux实例中所有磁盘的max_sectors_kb参数减小,该参数修改不影响性能。

提示:max_sectors_kb参数缺省是512,此处修改为384,根据现场环境,修改参数小于实际参数即可。

echo 384 > `find / -name max_sectors_kb`

方法二

通过管理终端登录Linux实例,执行如下命令,将当前Linux实例中所有磁盘的schedule参数从mq-deadline改为none,该参数修改不影响性能。

echo "none" > `find / -name scheduler |grep sys`

适用于

  • 云服务器 ECS