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.pswp.cn/news/165872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165872.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165872.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

黑馬點評筆記 redis實現優惠卷秒殺

文章目錄 難題全局唯一IDRedis實現全局唯一Id 超賣問題問題解決方案樂觀鎖問題 一人一單 難題 要解決優惠卷秒殺的問題我們要考慮到三個個問題,全局唯一ID,超賣問題,一人一單。 全局唯一ID 用戶搶購時,就會生成訂單并保存到同一…

【git】pip install git+https://github.com/xxx/xxx替換成本地下載編譯安裝解決網絡超時問題

目錄 🌑🌑 背景 🌒 🌒作用 🌔🌔 問題 🌔🌔解決方案 🌙方法一 🌙方法二 🌝🌝我的解決方案 整理不易,歡迎一鍵三連…

7-12 統計投票情況(集合)

7-12 統計投票情況(集合) 分數 10 作者 python課程組 單位 福州大學至誠學院 利用集合分析活動投票情況。 第一小隊有五名隊員,序號是1,2,3,4,5;第二小隊也有五名隊員,序號6,7,8,9,10。 輸入一個由得票隊員編號組成的…

分布式篇---第三篇

系列文章目錄 文章目錄 系列文章目錄前言一、什么是補償事務?二、消息隊列是怎么實現的?三、那你說說Sagas事務模型前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站,這篇文章男女通用,看懂了就去分享給你的碼吧。…

qgis添加postgis數據

左側瀏覽器-PostGIS-右鍵-新建連接 展開-雙擊即可呈現 可以點擊編輯按鈕對矢量數據編輯后是直接入庫的,因此謹慎使用。

【DQN】基于pytorch的強化學習算法Demo

目錄 簡介代碼 簡介 DQN(Deep Q-Network)是一種基于深度神經網絡的強化學習算法,于2013年由DeepMind提出。它的目標是解決具有離散動作空間的強化學習問題,并在多個任務中取得了令人矚目的表現。 DQN的核心思想是使用深度神經網…

企業數字化轉型的作用是什么?_光點科技

在當今快速變化的商業環境中,數字化轉型已成為企業發展的重要策略。企業數字化轉型指的是利用數字技術改造傳統業務模式和管理方式,以提升效率、增強競爭力和創造新的增長機會。 提升運營效率:數字化轉型通過引入自動化工具和智能系統&#x…

指數退避重試

指數退避重試(Exponential Backoff and Retry)是一種網絡通信中常用的錯誤處理和重試策略。它通常用于處理臨時性的故障,例如網絡延遲、服務器過載或臨時性的錯誤,以提高系統的可靠性和穩定性。 基本思想是,當發生一個…

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中的一種布局組件,用于在水平方向上對子物體進行排列和布局。它可以根據一定的規則自動調整子物體的位置和大小,使它…

Shell腳本:Linux Shell腳本學習指南(第二部分Shell編程)二

第二部分:Shell編程(二) 十一、Shell數組:Shell數組定義以及獲取數組元素 和其他編程語言一樣,Shell 也支持數組。數組(Array)是若干數據的集合,其中的每一份數據都稱為元素&#…

Navicat 技術指引 | GaussDB服務器對象的創建/設計(編輯)

Navicat Premium(16.2.8 Windows版或以上) 已支持對GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能,還提供強大的高階功能(如模型、結構同步、協同合作、數據遷移等),這…

【華為OD題庫-034】字符串化繁為簡-java

題目 給定一個輸入字符串,字符串只可能由英文字母(a ~ z、A ~ Z)和左右小括號()組成。當字符里存在小括號時,小括號是成對的,可以有一個或多個小括號對,小括號對不會嵌套,小括號對內可以包含1個或多個英文字母也可以不…

Jenkins Ansible 參數構建

首先在Jenkins中創建自由項目 在web端配置完成后在另一臺機子上下載nginx 在gitlab端創建項目并創建文件配置代碼 在有Jenkins的機器上下載Ansible [rootslave1 ~]# yum -y install epel-release [rootslave1 ~]# yum -y install ansible再進入下載nginx機器中克隆gitlab項目…

Android 框架層AIDL 添加接口

文章目錄 AIDL的原理構建AIDL的流程往凍結的AIDL中加接口 AIDL的原理 可以利用ALDL定義客戶端與服務均認可的編程接口,以便二者使用進程間通信 (IPC) 進行相互通信。在 Android 中,一個進程通常無法訪問另一個進程的內存。因此,為進行通信&a…

卷積神經網絡(AlexNet)鳥類識別

文章目錄 一、前言二、前期工作1. 設置GPU(如果使用的是CPU可以忽略這步)2. 導入數據3. 查看數據 二、數據預處理1. 加載數據2. 可視化數據3. 再次檢查數據4. 配置數據集 三、AlexNet (8層)介紹四、構建AlexNet (8層)網絡模型五、…

微信小程序image組件圖片設置最大寬度 寬高自適應

問題描述:在使用微信小程序image組件的時候,在不確定圖片寬高情況下 想給一個最大寬度讓圖片自適應,按比例,image的widthfiex和heightFiex并不能滿足(只指定最大寬/高并不會生效) 問題解決:使用…