Alibaba Cloud Linux 3系统的ECS实例中rq->nr_running在throttle场景下统计异常

本文介绍使用自建账号登录Windows实例后提示“Windows资源管理器已停止工作”的问题原因及解决方案。

问题描述

在符合如下条件的Alibaba Cloud Linux 3实例中,系统运行时出现rq->nr_running统计异常的问题。

  • 镜像:Alibaba Cloud Linux 3.2104 64位

  • 内核:5.10.60-9.al8.x86_64

两层cgroup同时throttle时会导致rq->nr_running低于正常值,出现以下溢出的情况,从而导致load统计不正确、调度异常、soft lockup等问题。其中soft lockup提示以下调用栈信息:

Sep 7 20:24:47 l80c11217.ea120 kernel: INFO: task bash:130503 blocked for more than 122 seconds.
Sep 7 20:24:47 l80c11217.ea120 kernel: Tainted: G S OE 5.10.23-001.ali5000_20210905_2f9a6ae7f7_cbp.alios7.x86_64 #1
Sep 7 20:24:47 l80c11217.ea120 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Sep 7 20:24:47 l80c11217.ea120 kernel: task:bash state:D stack: 0 pid:130503 ppid:130502 flags:0x00000000
Sep 7 20:24:47 l80c11217.ea120 kernel: Call Trace:
Sep 7 20:24:47 l80c11217.ea120 kernel: __schedule+0x283/0x6d0
Sep 7 20:24:47 l80c11217.ea120 kernel: ? cpu_stop_queue_work+0x79/0x160
Sep 7 20:24:47 l80c11217.ea120 kernel: ? usleep_range+0x80/0x80
Sep 7 20:24:47 l80c11217.ea120 kernel: schedule+0x46/0xb0
Sep 7 20:24:47 l80c11217.ea120 kernel: schedule_timeout+0xff/0x140
Sep 7 20:24:47 l80c11217.ea120 kernel: ? __trace_bprintk+0x6e/0x80
Sep 7 20:24:47 l80c11217.ea120 kernel: ? __prepare_to_swait+0x4b/0x70
Sep 7 20:24:47 l80c11217.ea120 kernel: __wait_for_common+0xa6/0x150
Sep 7 20:24:47 l80c11217.ea120 kernel: stop_one_cpu+0xab/0xe0
Sep 7 20:24:47 l80c11217.ea120 kernel: ? set_cpus_allowed_ptr+0x10/0x10
Sep 7 20:24:47 l80c11217.ea120 kernel: ? select_task_rq_fair+0x12c/0x2e0
Sep 7 20:24:47 l80c11217.ea120 kernel: sched_exec+0x88/0xd0
Sep 7 20:24:47 l80c11217.ea120 kernel: bprm_execve+0xec/0x230
Sep 7 20:24:47 l80c11217.ea120 kernel: do_execveat_common+0x192/0x1c0
Sep 7 20:24:47 l80c11217.ea120 kernel: __x64_sys_execve+0x39/0x50
Sep 7 20:24:47 l80c11217.ea120 kernel: do_syscall_64+0x2d/0x40
Sep 7 20:24:47 l80c11217.ea120 kernel: entry_SYSCALL_64_after_hwframe+0x44/0xa9
Sep 7 20:24:47 l80c11217.ea120 kernel: RIP: 0033:0x1461f4de5c37
Sep 7 20:24:47 l80c11217.ea120 kernel: RSP: 002b:00007ffcd19c8058 EFLAGS: 00000202 ORIG_RAX: 000000000000003b
Sep 7 20:24:47 l80c11217.ea120 kernel: RAX: ffffffffffffffda RBX: 00000000011fcc20 RCX: 00001461f4de5c37
Sep 7 20:24:47 l80c11217.ea120 kernel: RDX: 00000000011fbcf0 RSI: 00000000011fcca0 RDI: 00000000011fcc20
Sep 7 20:24:47 l80c11217.ea120 kernel: RBP: 00000000011fcc60 R08: 0000000000000000 R09: 0000000000000018
Sep 7 20:24:47 l80c11217.ea120 kernel: R10: 00007ffcd19c74a0 R11: 0000000000000202 R12: 0000000000000000
Sep 7 20:24:47 l80c11217.ea120 kernel: R13: 00000000011fcca0 R14: 00000000011fbcf0 R15: 0000000000000000

问题原因

两层cgroup同时throttle时没有判断调度实体是否为空,直接将rq->nr_running减一,导致rq->nr_running统计异常。

解决方案

当遇到该问题时,您可以参考以下任意一种方法进行处理。

方法一:升级系统内核

请根据现场实际情况,选择以下对应的步骤。

升级内核版本

  1. 登录ECS实例,具体操作,请参见连接方式概述

  2. 执行以下命令,确认系统内核版本适用此方案。

    uname -r

    系统显示类似如下。

    5.10.60-9.al8.x86_64

  3. 对于5.10.60-9.al8.x86_64之前的版本,执行以下命令,将操作系统版本更新至最新的内核版本。

    yum update kernel
    说明

    说明:

    • 或者您也可以将操作系统版本,回退至上个版本。

    • 如果您使用的是最新的操作系统版本,若遇到了该问题,请执行安装内核热补丁步骤。

  4. 更新内核版本之后,需重启生效,请执行以下命令,重启服务器。

    reboot

安装内核热补丁

  1. 执行以下命令,确认系统内核版本适用此方案。

    uname -r

    系统显示类似如下。

    5.10.60-9.al8.x86_64

  2. 对于5.10.60-9.al8.x86_64版本,执行以下命令,安装内核热补丁。

    yum install -y kernel-hotfix-6972801-`uname -r | awk -F"-" '{print $NF}'`

  3. 更新内核热补丁之后,需重启才能清除错误状态,请执行以下命令,重启服务器。

    reboot

方法二:避免两层配置cpu.cfs_quota_ns

避免两层及两层以上的Cgroup同时配置cpu.cfs_quota_ns。

适用于

  • 云服务器ECS