<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          線上服務(wù)全掛了,經(jīng)排查居然是vim的鍋?

          共 2226字,需瀏覽 5分鐘

           ·

          2021-08-06 23:15


          源 /         文/ 

          最近無意間打開了曾經(jīng)做后端時的筆記,想起來許多往事,挑了一段有意思的,分享給大家。

          故事發(fā)生的時候我還是一個萌新,啥都不知道,完全聽老板和師兄安排。發(fā)生的時候是一個周末,周末嘛,自然就開開心心過周末,出去玩耍、約會,吃點好吃的,或者找點好玩的。就在正開心的時候,突然收到一條報警短信,說某某服務(wù)器掛了。

          我正擔(dān)心呢,就收到了師兄的消息,他說不要緊,我讓隔壁組的同事幫忙查了,應(yīng)該很快就能好。

          我聽到師兄這么講也就安心了,沒想到后來整個服務(wù)都宕機了,完全無法響應(yīng),因此還出了一個P1的故障。一般來說這種級別的故障都有一些很深奧的原因,沒想到后來開故障分析會的時候,才知道這次的事故起因非常非常不起眼,出在了大家日常都會使用的vim上。

          原本第一臺機器的宕機并不稀奇,由于OOM。

          當(dāng)時的服務(wù)器后端是用Java寫的,Java和C++相比最大的區(qū)別就是Java有自動垃圾回收機制,而C++只能手動釋放內(nèi)存。

          但Java的自動垃圾回收機制也有很多問題,比如JVM的配置不合理,或者是代碼寫得不夠優(yōu)雅,創(chuàng)建了許多極耗內(nèi)存的對象,垃圾回收策略來不及處理或者是超過了能夠處理的極限,就會引起內(nèi)存超界的錯誤。英文是OutOfMemory,簡稱為OOM。

          這種現(xiàn)象在Java后端還挺常見的,可能我們當(dāng)時的系統(tǒng)也的確不夠優(yōu)雅。原本這個問題并不大,因為集群都有負載均衡策略,一個服務(wù)都對應(yīng)多臺機器。哪怕是一臺機器掛了,上層的網(wǎng)關(guān)做流量分發(fā)的時候會自動避開宕機的機器,一樣能保證請求都能有響應(yīng)。

          所以一臺機器掛了其實沒啥問題,我們什么都不做等它自動重啟或者是找運維幫忙手動重啟都行。要命就要命在找了隔壁組的師兄來排查故障。

          這哥們排查故障的時候,非常自然地連上了服務(wù)器,然后用vim打開了系統(tǒng)的日志。

          就是這一行代碼:

          vim xxxx.log

          我當(dāng)時聽到報告的時候也很納悶,vim打開日志不是天經(jīng)地義的事情嗎,這也會出問題嗎?

          正常來說當(dāng)然是不會,但這里有一個隱藏的前提條件,就是vim打開文件時會把文件加載在系統(tǒng)的內(nèi)存里(顯然)。既然是加載在內(nèi)存里,那么自然是會消耗內(nèi)存的。這就導(dǎo)致了一個問題,如果這個文件太大,然后又用了vim強行打開,很有可能會導(dǎo)致系統(tǒng)內(nèi)存耗盡于是崩潰。

          這個哥們那天正是遇到了這樣的事情,他發(fā)現(xiàn)vim打開之后ssh連接斷了。他以為是自己的網(wǎng)絡(luò)出了問題,于是他換了一臺機器連接查看日志,于是同樣的劇本再次上演。這哥們一口氣把所有的服務(wù)器都查看了一遍,發(fā)現(xiàn)都沒反應(yīng),他以為是自己的ssh跪了,就匯報說暫時看不了問題,因為ssh跪了。

          報告的人也沒當(dāng)回事,因為之前的報警只是掛了一臺機器,不會影響服務(wù),也就沒當(dāng)回事。你可能會好奇,后面的機器掛了難道沒報警嗎?說來慚愧,關(guān)于這里的細節(jié)我有些記不清了。

          我猜想了一下,無非兩種可能,一種是報警程序是運行在機器里檢測java進程的,java進程掛了能夠發(fā)現(xiàn)并報警,但如果是機器直接掛了,就沒法報警了。第二種可能是報警了,但是他們以為還是之前的問題,于是忽略了。

          當(dāng)時這個故事給我觸動很大,這也是我至今還能記住這個故事的原因。因為我沒有想到,只是使用vim打開一個文件居然還有這樣的風(fēng)險。

          那么問題來了,既然vim打開文件有這樣的隱患,我們應(yīng)該怎么辦呢?

          大概有兩種方法,第一種是事先檢查。在使用vim打開文件之前,先使用ls命令查看一下文件的大小,如果文件過大則不要直接打開。

          檢查的命令很簡單:ls -lh,ls命令很簡單,大家都知道查看目錄下文件。這里傳入了兩個參數(shù),l表示詳細信息,包括文件類型、權(quán)限、文件大小等。但是這里顯示的文件大小是字節(jié)數(shù),很難直接看出來有多大,所以我們需要加上一個參數(shù)h,我沒記錯的話,這個參數(shù)表示將文件大小轉(zhuǎn)化成人類可識別的形式。

          比如我們不加h,得到的結(jié)果是這樣的:

          加上h之后,則是這樣的:

          這里的文件大小就容易理解多了。

          第二種方式是使用tail代替vim查看log,tail的意思是查看文件尾部的內(nèi)容。它有兩個參數(shù)非常常用,一個是-n,也就是顯示最后n行。

          tail -n10 xxx.log

          我這里寫的就是顯示xxx.log文件的最后10行,這里的n也可以省略,寫成tail -10也行。

          第二個參數(shù)是-f,-f的意思是表示循環(huán)輸出。因為線上的日志往往是不斷變更的,因為會有系統(tǒng)一直往當(dāng)中寫入新的日志。我們使用-f,就可以保持同步,將源源不斷寫入的內(nèi)容都打印在屏幕上。

          并且-f可以和-n一起使用,表示從當(dāng)前末尾n行開始一直循環(huán)輸出。

          tail -30f xxx.log

          自從學(xué)會了這兩招,再也沒有因為使用vim打開巨大日志而導(dǎo)致系統(tǒng)崩潰過。



          好文推薦


          被,裁員了。。。


          知乎高贊:一個程序員的水平能差到什么程度?


          某985學(xué)歷程序員嫌棄女朋友高職畢業(yè)學(xué)歷低,但女朋友實在太漂亮,好猶豫!







          END


          頂級程序員:topcoding

          做最好的程序員社區(qū):Java后端開發(fā)、Python、大數(shù)據(jù)、AI


          一鍵三連「分享」、「點贊」和「在看」


          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青娱乐成人在线 | 色婷婷在线观看免费视频 | 欧美大屌在线观看 | 性乱伦视频 | 免费视频在线观看一区 |