部分低版本的Linux操作系统内核在回写(writeback)文件缓存时,会出现softlockup异常。本文介绍问题原因与解决方案。

问题现象

在内核版本低于4.15的Linux实例中,内核回写文件缓存时会出现softlockup异常,并产生与如下所述类似的调用栈信息:
说明 Linux内核版本可以通过uname -r命令查看,例如查看结果为3.10.0-514.26.2.el7.x86_64,则其中的3.10.0为内核版本。本文所述的4.15版本指4.15.0版本。
[3507707.671883]  [<ffffffff8127cf7a>] redirty_tail+0x3a/0x40
[3507707.671884]  [<ffffffff81280ea4>] __writeback_inodes_wb+0x64/0xc0
[3507707.671885]  [<ffffffff81281238>] wb_writeback+0x268/0x300
[3507707.671887]  [<ffffffff812819f4>] wb_workfn+0xb4/0x380
[3507707.671889]  [<ffffffff810a5dc9>] process_one_work+0x189/0x420
[3507707.671890]  [<ffffffff810a625b>] worker_thread+0x1fb/0x4b0
[3507707.671891]  [<ffffffff810a6060>] ? process_one_work+0x420/0x420
[3507707.671893]  [<ffffffff810ac696>] kthread+0xe6/0x100
[3507707.671894]  [<ffffffff810ac5b0>] ? kthread_park+0x60/0x60
[3507707.671897]  [<ffffffff81741dd9>] ret_from_fork+0x39/0x50

问题原因

当实例中的内存紧缺时,系统内核会频繁调用wakeup_flusher_threads函数,调用该函数时会创建大量的回写任务(wb_writeback_work),从而导致回写线程一直在处理回写任务,最终引发系统softlockup异常。

解决方案

您需要把内核版本更新为高于4.15的版本以解决该问题。Alibaba Cloud Linux操作系统的内核版本均为4.19,不会出现该问题。以下解决方案主要适用于非Alibaba Cloud Linux操作系统的其他Linux发行版。
注意 在操作前,建议您为ECS实例创建快照备份数据,避免因误操作造成的数据丢失。创建快照的更多信息,请参见快照概述
  1. 远程连接Linux实例。
    远程连接的具体操作,请参见连接方式概述
  2. 运行以下命令查看内核版本信息。
    uname -r
  3. 如果内核版本不高于4.15,则需要运行以下命令更新内核版本。
    如果内核版本高于4.15,则表示系统不会出现softlockup异常。您无需再进行后续操作。
    yum update kernel
  4. 更新内核版本后,需要重启Linux实例。
    reboot
  5. 待Linux实例重启后,再次运行以下命令,确认内核版本已高于4.15。
    uname -r
    部分低版本的Linux内核如果无法通过yum update kernel命令更新内核版本,则需要您自行下载高于4.15版本的内核RPM包手动升级。