【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?

news2024/11/28 10:34:59

背景介绍

最近的docker容器经常被kill掉,k8s中该节点的pod也被驱赶。

我有一个在主机中运行的Docker容器(也有在同一主机中运行的其他容器)。该Docker容器中的应用程序将会计算数据和流式处理,这可能会消耗大量内存。

该容器会不时退出。我怀疑这是由于内存不足,但不是很确定。我需要找到根本原因的方法。那么有什么方法可以知道这个集装箱的死亡发生了什么?

容器层级判断检测

提到docker logs $container_id查看该应用程序的输出。这永远是我要检查的第一件事。接下来,您可以运行docker inspect $container_id以查看状态的详细信息,例如:

    "State": {
        "Status": "exited",
        "Running": false,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 0,
        "ExitCode": 2,
        "Error": "",
        "StartedAt": "2016-06-28T21:26:53.477229071Z",
        "FinishedAt": "2016-06-28T21:26:53.478066987Z"
    }

重要的一行是“ OOMKilled”,如果您超出了容器的内存限制,并且Docker杀死了您的应用程序,则该行将为true。您可能还需要查找退出代码,以查看其是否标识出您的应用退出的原因。

  • Docker内部,这仅表示docker本身是否会杀死您的进程,并要求您在容器上设置内存限制。

  • Docker外部,如果主机本身内存不足,Linux内核可以销毁进程。发生这种情况时,Linux通常会在/ var / log中写入日志。使用Windows和Mac上的Docker Desktop,您可以在docker设置中调整分配给嵌入式Linux VM的内存。

    • 可以通过阅读日志来了解容器内的进程是否被OOM杀死。OOMkill是由内核启动的,因此每次发生时,都会在中包含很多行/var/log/kern.log,例如:
python invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=995
oom_kill_process+0x22e/0x450
Memory cgroup out of memory: Kill process 31204 (python) score 1994 or sacrifice child
Killed process 31204 (python) total-vm:7350860kB, anon-rss:4182920kB, file-rss:2356kB, shmem-rss:0kB

Linux操作系统的进程服务发生被killed的原因是什么

在Linux中,经常会遇到一些重要的进程无缘无故就被killed,而大多数的经验之谈就是系统资源不足或内存不足所导致的。

当Linux系统资源不足时,Linux内核可以决定终止一个或多个进程,内存不足时会在系统的物理内存耗尽时触发OOM killed,可以利用“dmesg | tail -N”命令来查看killed的近N行日志。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lbw6X6rA-1670991059774)(https://oscimg.oschina.net/oscnet/up-e34db4f2923e3aa82df10f04fee66aaf0ca.png)]

常规的宕机监控之类

在服务宕机或者重启之前我们的常规操作就是采用ps指令判定服务的增长趋势以及展示真实使用的资源的大小的前几位排名。

  • Linux下显示系统进程的命令ps,最常用的有ps -ef 和ps aux。这两个到底有什么区别呢?

ps -ef指令代表着’SystemV风格’,而ps aux代表着’BSD风格‘。

由上图所示,可以分析出对应的数据结构模型。

USER      //用户名
%CPU      //进程占用的CPU百分比
%MEM      //占用内存的百分比
VSZ       //该进程使用的虚拟內存量(KB)
RSS       //该进程占用的固定內存量(KB)resident set size
STAT      //进程的状态
START     //该进程被触发启动时间
TIME      //该进程实际使用CPU运行的时间

其中CPU算是第3个位置、内存MEM算是第4个位置,虚拟内存VSZ是第5个位置,记住这个后面我们会使用这个方式进行排序。

查看当前系统内CPU占用最多的前10个进程(栏位属于第3个)

ps auxw | sort -rn -k3 | head -10

ps auxw指令(BSD风格)

  • u:以用户为主的格式来显示程序状况
  • x:显示所有程序,不以终端机来区分
  • w:采用宽阔的格式来显示程序状况

sort排序指令

sort -rn -k5

-n是按照数字大小排序(-n 这代表着排除n行的操作处理),-r是以相反顺序,-k是指定需要排序的栏位

ps auxw | head -1

内存消耗最多的前10个进程(栏位属于第4个)

ps auxw | head -1;ps auxw|sort -rn -k4|head -10

虚拟内存使用最多的前10个进程(栏位属于第5个)

ps auxw|head -1;ps auxw|sort -rn -k5|head -10

去掉x参数的结果

ps auw | head -1; ps auw|sort -rn -k4 | head -10
stat取值含义

D      //无法中断的休眠状态(通常 IO 的进程);
R      //正在运行可中在队列中可过行的;
S      //处于休眠状态;
T      //停止或被追踪;
W      //进入内存交换 (从内核2.6开始无效);
X      //死掉的进程 (基本很少见);
Z      //僵尸进程;
<      //优先级高的进程
N      //优先级较低的进程
L      //有些页被锁进内存;
s      //进程的领导者(在它之下有子进程);
l      //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+      //位于后台的进程组;

dmesg的命令分析

有几个工具/脚本/命令 可以更轻松地从该虚拟设备读取数据,其中最常见的是 dmesg 和 journalctl。

输入dmesg指令进行egrep正则表达式匹配killed的进程信息,将输出对应的进程信息。

dmesg | egrep -i -B100 'killed process'

dmesg | grep -i -B100 'killed process'

以上的指令就可以输出最近killed的信息,其中-B100,表示 'killed process’之前的100行内容,与head的指令非常的相似。

如果我们看到了oom-kill的字样之后,就可以判断它是被内存不足所导致的kill,oom-kill之后,就是描述那个被killed的程序的pid和uid。

Out of memory: Killed process 1138439 (python3) total-vm:8117956kB, anon-rss:5649844kB,内存不够
total_vm和rss的指标值

  • total_vm:总共使用的虚拟内存 Virtual memory use (in 4 kB pages),8117956/1024(得到MB)/1024(得到GB)=7.741GB

  • rss:常驻内存使用Resident memory use (in 4 kB pages) 5649844/1024/1024=5.388GB

案例1:查看到pod被驱赶的原因
[3899860.525793] Out of memory: Kill process 64058 (nvidia-device-p) score 999 or sacrifice child
[3899860.526961] Killed process 64058 (nvidia-device-p) total-vm:126548kB, anon-rss:2080kB, file-rss:0kB, shmem-rss:0kB
案例2:查看到docker容器被kill 的原因
[3899859.737598] Out of memory: Kill process 27562 (jupyter-noteboo) score 1000 or sacrifice child
[3899859.738640] Killed process 27562 (jupyter-noteboo) total-vm:215864kB, anon-rss:45928kB, file-rss:0kB, shmem-rss:0kB

journalctl命令 – 查看指定的日志信息

当内存不足时,内核会将相关信息记录到内核日志缓冲区中,该缓冲区可通过 /dev/kmsg 获得。除了上面的dmesg之外,还有一个journalctl。

语法格式: journalctl [参数]

常用参数:

查看Killed日志

使用sudo dmesg | tail -7命令(任意目录下,不需要进入log目录,这应该是最简单的一种)而journalctl命令来自于英文词组“journal control”的缩写,其功能是用于查看指定的日志信息。

journalctl指令介绍

在RHEL7/CentOS7及以后版本的Linux系统中,Systemd服务统一管理了所有服务的启动日志,带来的好处就是可以只用journalctl一个命令,查看到全部的日志信息了。

查看所有日志(默认情况下 ,只保存本次启动的日志)
journalctl
查看内核日志(不显示应用日志)
journalctl -k
查看系统本次启动的日志
journalctl -b
journalctl -b -0
查看上一次启动的日志(需更改设置)
journalctl -b -1
查看指定时间的日志
journalctl --since=“2021-09-16 14:22:02”

journalctl --since “30 min ago”

journalctl --since yesterday

journalctl --since “2021-01-01” --until “2021-09-16 13:40”

journalctl --since 07:30 --until “2 hour ago”
显示尾部的最新10行日志
journalctl -n
显示尾部指定行数的日志
journalctl -n 15
实时滚动显示最新日志
journalctl -f
查看指定服务的日志
journalctl /usr/lib/systemd/systemd
比如查看docker服务的日志
systemctl status docker
查看某个 Unit 的日志
journalctl -u nginx.service
journalctl -u nginx.service --since today
实时滚动显示某个 Unit 的最新日志
journalctl -u nginx.service -f
合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统之线程和进程

文章目录一. 什么是操作系统二. 进程和线程1. 进程2. 线程3. 进程的管理3.1 PBC中的一些属性3.2 并发和并行3.3 进程的调度3.4 内存管理3.5 进程间的通信3.6 并发编程4. 进程与线程的区别一. 什么是操作系统 操作系统本质上是一个软件, 发挥的是管理作用, 可以管理软件和硬件,…

《Python多人游戏项目实战》第二节 使用pickle模块序列化数据

目录 2.1 设置游戏窗口 2.2 实现人物移动的功能 2.3 编写服务端代码 2.4 完善客户端代码 2.5 完整代码下载地址 在本节&#xff0c;笔者会带大家开发一个联机版的人物移动程序&#xff0c;示例如下&#xff1a; 在上一节&#xff0c;客户端和服务端通信的JSON数据中包含玩…

CentOS7中安装字体库中文字体

若存在中文乱码的情况&#xff0c;这是因为操作系统中没有安装中文字体。 安装字体库 yum install fontconfig -y 安装更新字体命令 yum install mkfontscale -y添加中文字体 # 新建目录 mkdir /usr/share/fonts/chinese # 切换到中文字体目录下&#xff0c;上传windows里宋…

浅谈人工智能生成内容(AIGC)

兴趣了解 [OpenAI ]人工智能绘画产品 DALLE: 在计算机上输入一句话&#xff0c;DALLE 就能够理解这句话、然后自动生成一幅意思相应的图像&#xff0c;且该图像是全网首发、独一无二。[谷歌 ] 5400 亿参数大模型 PaLM: PaLM 的文本理解能力与逻辑推理能力大幅提升&#xff0c;…

[附源码]Nodejs计算机毕业设计基于web的校园闲置物品交易系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

PyTorch中利用LSTMCell搭建多层LSTM实现时间序列预测

前言 前面已经写过不少时间序列预测的文章&#xff1a; 深入理解PyTorch中LSTM的输入和输出&#xff08;从input输入到Linear输出&#xff09;PyTorch搭建LSTM实现时间序列预测&#xff08;负荷预测&#xff09;PyTorch中利用LSTMCell搭建多层LSTM实现时间序列预测PyTorch搭建…

为什么AI距离智能越来越远?

2021年讨论了人机混合智能里的深度态势感知和人的算计与机器的计算如何结合的问题。之后有一位朋友问了我五个问题。第一&#xff0c;关于数学和逻辑的关系问题。这个问题是百年来数学的基础问题&#xff0c;迄今为止似乎没有定论。从实用主义角度说&#xff0c;“把数学等同于…

企业在项目中采用工时管理系统的好处

在如今疫情的影响下&#xff0c;不少企业面对经济形势愈发严峻的情况下&#xff0c;对项目员工工时的管理也是越来越注重。如何在确保企业正常运转的前提下提升企业发展空间&#xff0c;人员降低工作成本呢&#xff1f;根据目前研究表明&#xff0c;很多企业都选择使用项目工时…

Android Kotlin使用AspectJ进行AOP面向切面编程

前言 什么是面向切面编程&#xff1f;首先我们来了解下两个概念&#xff1a; OOP&#xff08;面向对象编程&#xff09;:针对业务处理过程的实体及其属性和行为进行抽象封装&#xff0c;以获得更加清晰高效的逻辑单元划分。 AOP(面向切面编程)&#xff1a;则是针对业务处理过程…

html好看的生日祝福,生日表白(源码)

文章目录1.设计来源1.1 主界面1.2 秘密基地1.3 甜言蜜语2.效果和源码2.1 动态效果2.2 源代码2.3 自定义背景图片代码2.4 自定义每次生日记录代码2.5 自定义背景音乐代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/de…

Java实现Google第三方登录

文章目录前言一、了解OAuth2.0二、注册开发者账号1.登录开发者平台2.创建应用三、代码实现1.实现流程1.点击登录2.接受回调中的code获取accessToken3.获取用户信息2.注意事项前言 Google API 使用 OAuth 2.0 协议进行身份验证和授权。Google 支持常见的 OAuth 2.0 场景&#x…

高分子点击试剂DBCO-PEG-Hydrazide,二苯并环辛炔-聚乙二醇-酰基

一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; DBCO-PEG-Hydrazide属于高分子点击试剂&#xff0c;“点击化学"一般由叠氮化物&#xff08;azide&#xff09;和炔烃&#xff08;alkyne&#xff09;作用形共价键&#…

老港综合填埋场二期配套渗滤液工程电能管理系统的设计和应用-Susie 周

1、概述 本项目为老港综合填埋场二期配套渗滤液工程电能管理系统。根据配电系统管理的要求&#xff0c;需要对&#xff08;老港综合填埋场二期配套渗滤液工程电能管理系统项目的配电柜进行电能管理&#xff0c;以保证用电的安全、可靠。 Acrel-3000电能管理系统充分利用了现代…

Mybatis源码分析(一)Mybatis 基本使用

目录一 知识回顾1.1 简介1.2 其他二 基本使用官网&#xff1a;mybatis – MyBatis 3 | 简介 一 知识回顾 1.1 简介 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作…

图片怎么转换成excel文档?

当我们创建excel文档中&#xff0c;里面无疑是需要各种表格内容&#xff0c;而如果是我们一个一个编辑起来&#xff0c;这就会比较繁琐。而现在许多需求可以通过网络很容易地得到满足。比如有把图片转换成excel表格的需求。下载一个小工具&#xff0c;这就相当方便了&#xff0…

不愧是阿里资深架构师,这本“分布式架构笔记”写得如此透彻明了

前言&#xff1a; Mybatis 是一款优秀的持久层框架。其封装了 JDBC 操作&#xff0c; 免去了开发人员编写 JDBC 代码以及设置参数和获取结果集的重复性工作。通过编写简单的 XML 或 Java 注解即可映射数据库 CRUD 操作。本文介绍的是阿里资深架构师十年经验整理&#xff0c;My…

JAVA 中的注解可以继承吗?

前言 注解想必大家都用过&#xff0c;也叫元数据&#xff0c;是一种代码级别的注释&#xff0c;可以对类或者方法等元素做标记说明&#xff0c;比如 Spring 框架中的Service&#xff0c;Component等。那么今天我想问大家的是类被继承了&#xff0c;注解能否继承呢&#xff1f;…

基于springboot在线答疑系统

教师权限&#xff1a;首页、个人中心、疑难解答管理、试卷管理、试题管理、考试管理。 学生权限&#xff1b;首页、个人中心、问题发布管理、疑难解答管理、考试管理等功能模块的管理维护等操作&#xff0c;系统结构图如下图4-1所示。 图4-1 系统功能图 截图 目 录 摘 要 I …

[附源码]Node.js计算机毕业设计扶贫产品展销平台小程序Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

matlab 的help没了

前两天还正常用&#xff0c;今天输入help 关键字 回复是没有相关的内容。 解决办法&#xff1a; 按照如下选择就行了 然后输入 help help 就会有显示了 help - Help for functions in Command Window This MATLAB function displays the help text for the functionalit…