部分低版本的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实例创建快照备份数据,避免因误操作造成的数据丢失。创建快照的具体操作,请参见创建一个云盘快照。
远程连接Linux实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
运行以下命令查看内核版本信息。
uname -r
如果内核版本不高于4.15,则需要运行以下命令更新内核版本。
如果内核版本高于4.15,则表示系统不会出现softlockup异常。您无需再进行后续操作。
yum update kernel
说明部分低版本的Linux内核如果无法通过
yum update kernel
命令更新内核版本,则需要您自行下载高于4.15版本的内核RPM包手动升级。更新内核版本后,需要重启Linux实例。
reboot
待Linux实例重启后,再次运行以下命令,确认内核版本已高于4.15。
uname -r