首页 > 系统相关 >关于LXD容器出现OOM错误,以及添加内存条后容器无法启动的解决

关于LXD容器出现OOM错误,以及添加内存条后容器无法启动的解决

时间:2023-09-22 17:15:35浏览次数:78  
标签:容器 user1 OOM 内存条 lxc 内存 conf memory

目前实验室的GPU服务器有4张3090显卡,但是只有32GB内存,频繁出现OOM(Out Of Memory)错误,因此博主通过添加大swap文件暂时缓解该问题,并采购内存条以解决该问题,同时解决添加内存条后lxc报错的问题。

问题描述

某次查看内核日志时,发现某容器出现了OOM(Out Of Memory)错误,有进程被强制kill,询问容器使用者,发现确实存在该问题,模型较大,取的batch size较大,程序跑不起来。
报错内容类似下面部分:

[2064598.795126] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=ns,mems_allowed=0,oom_memcg=/lxc/199,task_memcg=/lxc/199/ns/system.slice/clamav-daemon.service,task=clamd,pid=3647031,uid=100107
[2064598.796609] Memory cgroup out of memory: Killed process 3647031 (clamd) total-vm:1342176kB, anon-rss:1099032kB, file-rss:0kB, shmem-rss:0kB
[2064598.916492] oom_reaper: reaped process 3647031 (clamd), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

报错信息摘自:https://forum.proxmox.com/threads/oom-kill-process-inside-lxc-memory-cgroup-out-of-memory.65106/

通过swap文件来缓解该问题

对一台电脑来说,如果内存不够,有个简单的治标不治本的方法,也就是增加虚拟内存,允许内存将部分内容交换至磁盘,从而有种可用内存空间很大的假象。当然这种方法只是权宜之计,毕竟磁盘速度相比内存实在太慢,如果内存需求过高,会频繁产生缺页中断,极大影响性能。

对于lxd容器来说,它默认关闭了交换分区的使用,我们可以开启它来缓解该问题。


# 开启某lxd容器的交换分区
lxc config set <container_name> limits.memory.swap true

# 重启lxd容器
lxc restart <container_name>

# 对应的全局配置
lxc profile set default limits.memory.swap true

然后,我们可以在容器内通过以下指令查看内存使用

free -m

添加物理内存

既然内存不够,解决该问题的最直接的方法就是添加内存条。由于使用的是戴尔T630服务器,需要使用专用的RECC内存,普通的内存过不了自检。

服务器有两个CPU,内存条安装顺序比较特殊,可以参考https://www.dell.com/support/manuals/zh-cn/poweredge-t630/t630_om/%E7%B3%BB%E7%BB%9F%E5%86%85%E5%AD%98?guid=guid-77d112e3-72cf-40bf-bcf6-6a61e3a2520d&lang=zh-cn,简而言之就是每个CPU平均分配,优先填充编号小的,充分利用多通道。

安装完成后,在宿主机执行free -m,可以看到内存容量增加,完结撒花……?并没有=.=

问题描述

当我运行lxc start <container_name>后,系统报错,报错信息如下:

lxc user1 20230918061253.563 WARN     conf - conf.c:lxc_map_ids:3592 - newuidmap binary is missing
lxc user1 20230918061253.563 WARN     conf - conf.c:lxc_map_ids:3598 - newgidmap binary is missing
lxc user1 20230918061253.564 WARN     conf - conf.c:lxc_map_ids:3592 - newuidmap binary is missing
lxc user1 20230918061253.564 WARN     conf - conf.c:lxc_map_ids:3598 - newgidmap binary is missing
lxc user1 20230918061253.565 WARN     cgfsng - cgroups/cgfsng.c:fchowmodat:1252 - No such file or directory - Failed to fchownat(42, memory.oom.group, 1000000000, 0, AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW )
lxc user1 20230918061253.803 ERROR    conf - conf.c:run_buffer:321 - Script exited with status 1
lxc user1 20230918061253.803 ERROR    conf - conf.c:lxc_setup:4400 - Failed to run mount hooks
lxc user1 20230918061253.803 ERROR    start - start.c:do_start:1275 - Failed to setup container "user1"
lxc user1 20230918061253.803 ERROR    sync - sync.c:sync_wait:34 - An error occurred in another process (expected sequence number 4)
lxc user1 20230918061253.814 WARN     network - network.c:lxc_delete_network_priv:3617 - Failed to rename interface with index 0 from "eth0" to its initial name "vethd562e700"
lxc user1 20230918061253.814 ERROR    lxccontainer - lxccontainer.c:wait_on_daemonized_start:877 - Received container state "ABORTING" instead of "RUNNING"
lxc user1 20230918061253.814 ERROR    start - start.c:__lxc_start:2074 - Failed to spawn container "user1"
lxc user1 20230918061253.814 WARN     start - start.c:lxc_abort:1039 - No such process - Failed to send SIGKILL via pidfd 43 for process 12872
lxc user1 20230918061258.923 WARN     conf - conf.c:lxc_map_ids:3592 - newuidmap binary is missing
lxc user1 20230918061258.923 WARN     conf - conf.c:lxc_map_ids:3598 - newgidmap binary is missing
lxc 20230918061258.956 ERROR    af_unix - af_unix.c:lxc_abstract_unix_recv_fds_iov:218 - Connection reset by peer - Failed to receive response
lxc 20230918061258.956 ERROR    commands - commands.c:lxc_cmd_rsp_recv_fds:127 - Failed to receive file descriptors for command "get_state"

经过简单测试,对于新建容器、删除容器、配置容器等操作皆可进行,唯独无法运行容器。

注意到其中有一条报错信息和cgroup有关,而且有memory.oom.group的字样,加上刚插上内存条就出现这样的错误,于是猜测是lxc发现内存实际信息与它以为的信息不一致了。

lxc user1 20230918061253.565 WARN     cgfsng - cgroups/cgfsng.c:fchowmodat:1252 - No such file or directory - Failed to fchownat(42, memory.oom.group, 1000000000, 0, AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW )

解决方法

首先是重启,然后找办法重启lxc和lxd,希望能通过这些方法使它更新内存信息,但是失败了。

后续将lxc默认的关于memory的配置、容器的关于memory的配置删去,重新启动容器,问题解决,相关指令如下:

# 全局配置
lxc profile unset default limits.memory.swap
lxc profile unset default limits.memory

# 容器配置
lxc config unset <container_name> limits.memory.swap
lxc config unset <container_name> limits.memory

由于unset得太快,并未确定是哪条设置产生的影响,由于新建容器也无法运行,猜测是全局的限制内存指令造成的影响,读者感兴趣可以依次尝试。

标签:容器,user1,OOM,内存条,lxc,内存,conf,memory
From: https://www.cnblogs.com/treasurew/p/17722745.html

相关文章

  • 小米云原生文件存储平台化实践:支撑 AI 训练、大模型、容器平台多项业务
    小米作为全球知名的科技巨头公司,已经在数百款产品中广泛应用了AI技术,这些产品包括手机、电视、智能音箱、儿童手表和翻译机等。这些AI应用主要都是通过小米的深度学习训练平台完成的。在训练平台的存储方案中,小米曾尝试了多种不同的存储方式,包括Ceph+NFS、HDFS和对象存储挂......
  • SpringBoot中内置Servlet容器原理
    本篇博客会梳理一下SpringBoot内置Servlet容器的原理:原理其实跟SpringBoot中的内置Tomcat的启动原理差不多,我们从整个源码进行梳理一下。我们会发现当我们从Spring,SpringMVC演化到SpringBoot后发现采用SpringBoot后不需要配置Tomcat服务器了,这是什么原因呐,我们启动整个SpringBo......
  • docker容器中打开gazebo等可视化页面报错No protocol specified
    转载:https://blog.csdn.net/wsl_longwudi/article/details/127005162权限问题Noprotocolspecified问题这是由于X11服务默认只允许『来自本地的用户』启动的图形程序将图形显示在当前屏幕上。解决的办法很简单,允许所有用户访问X11服务即可。这个事情可以用xhost命令完成在宿主......
  • 关于.Net 6.0 在Linux ,Docker容器中,不安装任何依赖就生成图形验证码!!!!!!!!!!!
    在.NetFramework时代,我们生成验证码大多都是用System.Drawing。在.Net6中使用也是没有问题的。但是,System.Drawing却依赖于WindowsGDI+。为了实现跨平台,我陷入了沉思!! 微软推荐使用SkiaSharp进行替代,所以就开始了,踩坑之旅首先,安装SkiaSharp 编写好图形生成代码。......
  • C++ STL 容器之map
    一、map简介可以将任何基本类型映射到任何基本类型。如intarray[100]事实上就是定义了一个int型到int型的映射。map提供一对一的数据处理,key-value键值对,其类型可以自己定义,第一个称为关键字,第二个为关键字的值map内部是自动排序的二、用法1.map定义:map<type1name,t......
  • 关于.Net 6.0 在Linux ,Docker容器中,不安装任何依赖就生成图形验证码!!!!!!!!!!!
    在.NetFramework时代,我们生成验证码大多都是用System.Drawing。在.Net6中使用也是没有问题的。但是,System.Drawing却依赖于WindowsGDI+。为了实现跨平台,我陷入了沉思!! 微软推荐使用SkiaSharp进行替代,所以就开始了,踩坑之旅首先,安装SkiaSharp 编写好图形生成代码。......
  • docker-compose: 在容器中添加中文字体
    docker-compose配置先上docker-compose.yml的内容 version:'2'services:mandarin: container_name:mandarin restart:always image:liumapp/add-mandarin-fonts-in-docker:v1.0.0 build: context:. args: -LANG=C.UTF-8 ports: -8080:8080 volumes:......
  • Harbor 安装(k8s)-企业容器镜像仓库
    Harbor安装在k8s集群本小节目的是要在k8s集群上安装一个harbor镜像仓库。准备工作参考官网文档需要的准备工作。PrerequisitesKubernetescluster1.10+Helm2.8.0+Highavailableingresscontroller(Harbordoesnotmanagetheexternalendpoint)Highavailabl......
  • 容器技术:容器运行时
    什么是运行时(runtime)?runtime指的是程序执行时所需要的环境,以确保程序能够在特定的环境中正确运行;runtime为程序提供运行所需要的各种功能和支持,包括但不限于操作系统、编程语言的运行时库、虚拟机或解释器;Java程序文件就好比是容器镜像文件,JVM则好比是runtime,运行起来的Java程序......
  • 容器技术:网络工程师应该掌握的容器基础
    传统网络工程师要更有利于职业发展,需要掌握以下容器概念和基础知识:容器基础概念:容器vs.虚拟机:理解容器和虚拟机之间的区别,包括资源利用、隔离级别和部署速度。镜像:了解容器镜像的概念,即容器的静态快照,包含应用程序和其所有依赖项。容器运行时:熟悉容器运行时,如Docker的Containerd,......