402 Star 1.4K Fork 1.3K

GVPopenEuler / kernel

 / 详情

docker运行容器的内存和swap使用达到临界值时,出现磁盘io暴增的情况

已完成
缺陷
创建于  
2023-11-08 17:54

【标题描述】能够简要描述问题:说明什么场景下,做了什么操作,出现什么问题(尽量使用正向表达方式)

一、缺陷信息

内核信息:
5.10.0-136.16.0.92.oe2203sp1
5.10.0-136.53.0.132.oe2203sp1
这两个版本的内核都存在问题

缺陷归属组件:

缺陷归属的版本:

缺陷简述:

  1. 当容器的内存和swap的使用达到临界值时,磁盘io读写暴增,util也大增,影响宿主机性能
  2. 开始出现 D状态进程,D状态时堆栈信息如下:

2023-11-08 17:31:55 Processing PID: 126442 - yum
[<0>] __lock_page_killable+0x122/0x3d0
[<0>] lock_page_maybe_drop_mmap+0x90/0x130
[<0>] filemap_fault+0x3be/0x790
[<0>] ext4_filemap_fault+0x2d/0x50 [ext4]
[<0>] __do_fault+0x37/0x200
[<0>] do_read_fault+0x31/0xf0
[<0>] do_fault+0x75/0x150
[<0>] __handle_mm_fault+0x3a2/0x680
[<0>] handle_mm_fault+0xbc/0x290
[<0>] exc_page_fault+0x26d/0x5e0
[<0>] asm_exc_page_fault+0x1e/0x30

  1. iotop 可以看到部分进程的io读写大增
    输入图片说明

【环境信息】
硬件信息

  • 裸机场景请提供问题的硬件信息
  • 虚拟机场景请提供虚拟机的XML文件或配置信息
    软件信息
  • OS版本及分支信息
  • 内核信息
    5.10.0-136.16.0.92.oe2203sp1
    5.10.0-136.53.0.132.oe2203sp1
    这两个版本的内核都存在问题
  • 发现问题的组件版本信息

【问题复现步骤】,请描述具体的操作步骤

  1. docker hub 下载centos7的镜像,docker pull centos:7
  2. 创建 centos7 的容器, 4G内存 + 2G swap,命令如下:
    docker create --name dockerhub_centos7 --cpu-period=100000 --cpu-quota=400000 --memory 4G --memory-swap 6G --cap-add=SYS_PTRACE --cap-add=SYS_ADMIN --cap-add=NET_ADMIN --cap-add=NET_RAW --pids-limit=20000 --ulimit nofile=1048576:1048576 --ulimit memlock=-1:-1 dockerhub_centos7:latest /usr/sbin/init
    docker start dockerhub_centos7
  3. 进入到容器:docker exec -it dockerhub_centos7 /bin/bash
  4. 进入容器后yum 安装 gcc , yum install gcc
  5. 编译下面的c程序,让c程序占用6G-50M的内存,占用99%的内存。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define SIZE 1*1024*1024 //1M

int main()
{
    void *ptr = NULL;
    int i = 0;

    for (i;i<1024*6-50;i++) {
        ptr = (void *) malloc(SIZE);
        if (ptr == NULL) {
            printf("malloc err!");
            return -1;
        }

        memset(ptr,0,SIZE);
    }

    sleep(99999);

    free(ptr);
    return 0;
}
  1. 执行上面c程序的二进制
  2. 在开一个终端,通过下面脚本,查看容器的内存使用情况
#!/bin/bash

while true
do
  awk '{ printf "%f MB\n", $1/(1024*1024) }' /sys/fs/cgroup/memory/system.slice/docker-$(docker inspect -f '{{.Id}}' dockerhub_centos7).scope/memory.memsw.usage_in_bytes
  sleep 1
done
  1. 执行 yum install expect 命令,这时候yum操作会卡住,可以看到内存已经使用6144M(6G),但是程序并不会oom退出,然后通过iotop观察到 yum 命令的 io读写暴增,而且开始出现 D 状态进程,如下图
    输入图片说明

9.如果在出问题的时候,把占用内存的进程 kill掉,马上恢复正常

【实际结果】,请描述出问题的结果和影响

  1. 产生d进程
    输入图片说明
    2.部分进程出现io飙升,而且ioutil持续升高

【其他相关附件信息】
比如系统message日志/组件日志、dump信息、图片等

缺陷详情参考链接:

缺陷分析指导链接:
https:xxx

评论 (3)

free6k 创建了缺陷

Hi free6k, welcome to the openEuler Community.
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here.
If you have any questions, please contact the SIG: Kernel, and any of the maintainers.

openeuler-ci-bot 添加了
 
sig/Kernel
标签
free6k 修改了描述
zhangjialin 添加了
 
help-wanted
标签
zhangjialin 关联分支设置为openEuler-22.03-LTS-SP1
zhangjialin 任务状态待办的 修改为修复中
zhangjialin 任务状态修复中 修改为已完成

yum进程在读取文件页时,采用预读机制读取多个页,并在内存达到限额后触发内存回收,导致在memcg内存不足时文件页来回振荡,IO很高;由于预读不会尝试OOM,只有在读取要访问的页时才会在16次回收失败的情况下触发OOM,导致OOM的触发条件难以达成,因此卡住很久。该问题本质上是相比于4.18内核,5.10内核回收效率更高,未快速触发OOM。

已向美团提供补丁,在预读时,如果某个页分配失败,则停止预读。该补丁已保证99%场景下快速OOM。

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(4)
5329419 openeuler ci bot 1632792936
C
1
https://gitee.com/openeuler/kernel.git
git@gitee.com:openeuler/kernel.git
openeuler
kernel
kernel

搜索帮助