Vim 一下日志文件,Java 进程没了?

一次端口告警,发现 java 进程被异常杀掉,而根因竟然是因为在问题机器上 vim 查看了 nginx 日志。下面我将从时间维度详细回顾这次排查,希望读者在遇到相似问题时有些许启发。

时间线

15:19 收到端口异常 odin 告警。

状态:P1故障
名称:应用端口8989
指标:data-stream-openapi.port.8989
主机:data-stream-openapi-nmg-sf-a9457-1.docker.nmg01
节点:hbb-v.data-stream-openapi.data-stream.datadream.didi.com
当前值:0.00
说明:happen(data-stream-openapi.port.8989,#12,12) = 0
故障时间:2022-11-15 15:21:10

08414785f64659cf35e4be5fb4c6d8bf.png

收到告警之后,登陆机器发现 java 进程消失了,第一反应是先摘流容器,然后再排查问题。

15:23 摘掉容器流量。

15:24 开始重建容器。

15:26 重建容器成功并上线。

99fd2e358c68f4ae0fc92eb1e91e1a7b.png

请求成功率恢复,端口恢复。

8d807de68d2c78988331506e193f473f.png

排查路径

线上告警解除,业务恢复正常后,开始排查问题。首先排除日常发布的因素,先查看容器性能相关的监控,是否存在异常。查看 odin 用户内存使用率的监控,发现有异常:在 15:19 内存使用率突然飙升,然后极速下跌。看着内存使用率有问题,第一反应是否有 FullGC 的问题?

a0389fa8ee40d0d78aeefbfcbd09229f.png

奇怪的是,在告警发生前后,居然一直没有 FullGC。

5ae40ea4fae27898e9fb519686ac3992.png

YGC 在问题发生点没有异常,15:25 YGC 较高,但很快恢复,应该和应用刚启动有关。

0f74281be79e7f207607f7bd98be848b.png

此时顺便查看 cpu 使用率有无问题。线上性能问题,往往是内存、cpu、io 这些情况。cpu 使用率没有明显的波动,15:25有短暂升高,原因是容器重建,java 代码即时编译。

4055acb7ea156e6ed83836be364d6ae9.png

既然性能层面监控没有头绪,试着查看应用监控和日志。成功率下跌是基于 nginx 的灭火图监控,查看应用层面接口的成功率监控,发现在告警发生期间,应用接口成功率并没有下跌。

1db1343cd21a83581e8b21ad5aa4e59a.png

根因定位

没有 FullGC,应用监控和应用日志都没有明显异常,为什么 java 进程无缘无故没有了?难道被 Linux 杀掉了,这时只能抱着试试的心态,看看是不是这个原因。

dmesg -T | grep java。

663e21454af51601e5acf0a116ea5def.png

发现 java 进程1155805在15:17时候被 linux 操作系统杀掉了,原因是发生了out of memory。再看看端口异常的告警配置,在12个周期(12*10s=2min)端口均不通会触发告警。到此,时间点串起来了。15:17 linux oom killer 杀掉了 java 进程,15:19 触发了端口异常告警。       

024fd950e83ca982b036df15425f9a25.png

奇怪的是,java 进程并没有 FullGC,为啥会触发 linux 系统 OOM 呢?就在排查原因陷入困境时,有同事反馈他刚才在问题机器看过日志,是使用 vim 查看 nginx 日志,打开文件过程中,vim 程序报错。

05d4cee3af1ce9ff6388d08f40623d32.png

有资料反馈 oom killer 有 case 和 vim 操作有关

vim 查看日志为什么会干掉 java 进程呢?看一下日志大小,居然有37G,而我们的容器规格仅有8G。 

e9d7b1cd8a92684470a17772a499f3a9.png

至此,问题原因基本定位:使用 vim 命令查看37G的的文件,文件在加载过程中耗尽了内存,触发了 linux oom killer 的机制,进而杀掉了 java 进程。

问题是,为什么不杀掉 vim 进程,而要杀掉 java 进程呢?

原理解析

这里有两个问题要验证:

  • vim 是不是要将文件全部加载到内存?

  • linux oom killer的机制是什么?

查阅资料吧,进入知识盲区了。有一篇不错的 vim 原理介绍 ,有兴趣可以阅读:《Linux 编辑器之神 vim 的 IO 存储原理》

归纳一下,vim 在加载文件时会调用 readfile 函数(readfile 内部在系统调用read),而 readfile 会读完文件。看来 vim 加载大文件确实会干爆内存。

划重点:readfile 会读完文件。这就是为什么当 vim 打开一个超大文件的时候,会非常慢的原因

那 linux oom killer 的机制又是什么?为什么不杀 vim 进程,杀掉 java 进程呢?核心原理是在内存快被耗尽的时候,linux 会尝试杀掉一些进程,不让系统变得更糟糕,具体杀掉哪个进程,有一个打分机制,得分高的进程容易被杀掉。具体原理可阅读《Linux 内核 OOM killer 机制》、《oom kill 内存源码》。

文章内容在此不赘述,分享两个核心:一个是 linux 内核源码注释

* If we run out of memory, we have the choice between either* killing a random task (bad), letting the system crash (worse)* OR try to be smart about which process to kill. Note that we* don't have to be perfect here, we just have to be good.

一个是 oom killer 相关结论

你的进程被Linux杀掉几个可能的原因:
一种是内存泄露;
一种是你的进程所需要的内存资源太大,系统无法满足,应该在设计时对进程需要的资源有个最大限制,不能让他无限增长;
当然,也不一定全是你的问题,也有可能是同一主机的其他进程占用资源过多,但是Linux OOM选择“最坏“进程杀掉的算法是很简单粗暴的,就选中你的进程杀掉,也是有可能的

linux oom killer 会在系统内存耗尽的时候,触发杀掉糟糕进程的保护机制,但选择糟糕进程的机制不是很精准,存在误杀的可能。

运维规范

查看或者搜索日志有很多很好用的命令,比如 less、grep、tail。

vim 命令严禁用在查看日志的场景,如果需要用 vim 编辑文件,一定要先确认文件的大小。

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

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

相关文章

黑马点评笔记 redis实现优惠卷秒杀

文章目录 难题全局唯一IDRedis实现全局唯一Id 超卖问题问题解决方案乐观锁问题 一人一单 难题 要解决优惠卷秒杀的问题我们要考虑到三个个问题,全局唯一ID,超卖问题,一人一单。 全局唯一ID 用户抢购时,就会生成订单并保存到同一…

【git】pip install git+https://github.com/xxx/xxx替换成本地下载编译安装解决网络超时问题

目录 🌑🌑 背景 🌒 🌒作用 🌔🌔 问题 🌔🌔解决方案 🌙方法一 🌙方法二 🌝🌝我的解决方案 整理不易,欢迎一键三连…

分布式篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、什么是补偿事务?二、消息队列是怎么实现的?三、那你说说Sagas事务模型前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。…

qgis添加postgis数据

左侧浏览器-PostGIS-右键-新建连接 展开-双击即可呈现 可以点击编辑按钮对矢量数据编辑后是直接入库的,因此谨慎使用。

企业数字化转型的作用是什么?_光点科技

在当今快速变化的商业环境中,数字化转型已成为企业发展的重要策略。企业数字化转型指的是利用数字技术改造传统业务模式和管理方式,以提升效率、增强竞争力和创造新的增长机会。 提升运营效率:数字化转型通过引入自动化工具和智能系统&#x…

NX二次开发UF_CSYS_ask_wcs 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_ask_wcs Defined in: uf_csys.h int UF_CSYS_ask_wcs(tag_t * wcs_id ) overview 概述 Gets the object identifier of the coordinate system to which the work coordin…

JMeter压测常见面试问题

1、JMeter可以模拟哪些类型的负载? JMeter可以模拟各种类型的负载,包括但不限于Web应用程序、API、数据库、FTP、SMTP、JMS、SOAP / RESTful Web服务等。这使得JMeter成为一个功能强大且灵活的压力测试工具。 2、如何配置JMeter来进行分布式压力测试&a…

在华为昇腾开发板安装gdal-python

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 在华为昇腾开发板安装gdal-python分为两步:编译gdal库和下载gdal对应的python包。 1.编译gdal库 首先下载gdal库,。在linux(arm架构)上编译的gdal库及其第三方库源码,内含一个编译…

智慧法院 | RPA+AI打造智慧执行助手,解决“案多人少”现实难题

为深化政法智能化建设,加强“智慧治理”“智慧法院”“智慧检务”“智慧警务”“智慧司法”等信息平台建设,深入实施大数据战略,实现科技创新成果同政法工作深度融合。法制日报社于今年3月继续举办了2023政法智能化建设创新案例及论文征集宣传…

Unity UGUI的HorizontalLayoutGroup(水平布局)组件

Horizontal Layout Group | Unity UI | 1.0.0 1. 什么是HorizontalLayoutGroup组件? HorizontalLayoutGroup是Unity UGUI中的一种布局组件,用于在水平方向上对子物体进行排列和布局。它可以根据一定的规则自动调整子物体的位置和大小,使它…

Navicat 技术指引 | GaussDB服务器对象的创建/设计(编辑)

Navicat Premium(16.2.8 Windows版或以上) 已支持对GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…

Jenkins Ansible 参数构建

首先在Jenkins中创建自由项目 在web端配置完成后在另一台机子上下载nginx 在gitlab端创建项目并创建文件配置代码 在有Jenkins的机器上下载Ansible [rootslave1 ~]# yum -y install epel-release [rootslave1 ~]# yum -y install ansible再进入下载nginx机器中克隆gitlab项目…

卷积神经网络(AlexNet)鸟类识别

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、AlexNet (8层)介绍四、构建AlexNet (8层)网络模型五、…

居家适老化设计第二十九条---卫生间之花洒

无电源 灯光显示 无障碍扶手型花洒 以上产品图片均来源于淘宝 侵权联系删除 居家适老化卫生间的花洒通常具有以下特点和功能:1. 高度可调节:适老化卫生间花洒可通过调节高度,满足不同身高的老年人使用需求,避免弯腰或过高伸展造…

【开源】基于Vue.js的固始鹅块销售系统

项目编号: S 060 ,文末获取源码。 \color{red}{项目编号:S060,文末获取源码。} 项目编号:S060,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固…

qgis添加xyz栅格瓦片

方式1:手动一个个添加 左侧浏览器-XYZ Tiles-右键-新建连接 例如添加高德瓦片地址 https://wprd01.is.autonavi.com/appmaptile?langzh_cn&size1&style7&x{x}&y{y}&z{z} 双击即可呈现 收集到的一些图源,仅供参考,其中一…

【C++学习手札】模拟实现list

​ 🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:リナリア—まるりとりゅうが 0:36━━━━━━️💟──────── 3:51 🔄 ◀️ ⏸ ▶️…

qgis添加wms服务

例如添加geoserver的wms服务 左右浏览器-WMS/WMTS-右键-新建连接 URL添加geoserver的wms地址 http://{ip}:{port}/geoserver/{workspace}/wms 展开wms目录,双击相应图层即可打开

Spark---基于Yarn模式提交任务

Yarn模式两种提交任务方式 一、yarn-client提交任务方式 1、提交命令 ./spark-submit --master yarn --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100 或者 ./spark-submit --master yarn–client --class org.apache.s…

三菱PLC应用[集锦]

三菱PLC应用[集锦] 如何判断用PNP还是NPN的个人工作心得 10~30VDC接近开关与PLC连接时,如何判断用PNP还是NPN的个人工作心得: 对于PLC的开关量输入回路。我个人感觉日本三菱的要好得多,甚至比西门子等赫赫大名的PLC都要实用和可靠&#xff01…