本文記錄一次很詭異的bug (進程莫名被終止)的發現過程,而且詳細記錄了問題背後的緣由,以及解決方案。java
此項目是一個接口的自動化測試平臺,須要接入自動化工程(每一個自動化工程對應一個被測應用工程),每一個自動化工程都是獨立運行的進程。
自動化工程用的是springboot, 利用maven插件運行,mvn spring-boot:run 。
該平臺接入了不少自動化工程,在一臺linux機器上運行着不少個自動化工程的進程。linux
偶爾會莫名的出現自動化工程的進行被殺掉的狀況,須要在平臺上從新操做,啓動該自動化工程以後,才能繼續運行任務。
直到系統規模擴大,自動化工程數目變多,自動化用例變多,運行任務時間變長,自動化工程被莫名終止的機率加大。spring
[INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 09:32 min [INFO] Finished at: 2019-08-15T17:39:55+08:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.0.M5:run (default-cli) on project coupon_batch-Test: Application finished with exit code: 137 -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
For reference the status code 137 (128 + 9) typically means (can differ between flavours of unix).
That the process was terminated by receipt of a signal. In this case signal 9 which is SIGKILL and unblockable kill.
If this is the case the underlying machine/OS needs more virtual memory.
This can be added by either adding physical memory or swap space as appropriate.
You should try to increase the virtual memory of your machine.
Note:This also explains why a Jenkins restart (temporarily) fixes the issue.
Jenkins Maven Build 137 Error
swap space是磁盤上的一塊區域,能夠是一個分區,也能夠是一個文件,或者是他們的組合。
簡單點說,當系統物理內存吃緊時,Linux會將內存中不常訪問的數據保存到swap上,
這樣系統就有更多的物理內存爲各個進程服務,而當系統須要訪問swap上存儲的內容時,
再將swap上的數據加載到內存中,這就是咱們常說的swap out和swap in。apache
但這些內存不少時候只是在啓動的時候用一下,後面的運行過程當中不多再用到這些內存。有了swap後,
系統就能夠將這部分不這麼使用的內存數據保存到swap上去,從而釋放出更多的物理內存供系統使用。ubuntu
會將內存中的數據保存到swap分區上,等下次系統啓動的時候,再將數據加載到內存中,這樣能夠加快系統的啓動速度,
因此若是要使用休眠的功能,必需要配置swap分區,而且大小必定要大於等於物理內存segmentfault
這時能夠經過配置足夠的swap空間來達到目標,雖然慢一點,但至少能夠運行。springboot
或者有進程存在內存泄漏等,當內存不夠的時候,就會觸發內核的OOM killer,
根據OOM killer的配置,某些進程會被kill掉或者系統直接重啓(默認狀況是優先kill耗內存最多的那個進程),
不過有了swap後,能夠拿swap當內存用,雖然速度慢了點,但至少給了咱們一個去debug、kill進程或者保存當前工做進度的機會。bash
因此若是能將不怎麼經常使用的內存數據移動到swap上,就會有更多的物理內存用於cache,從而提升系統總體性能。app
若是不停的讀寫swap,那麼對系統的性能確定有影響,尤爲是當系統內存很吃緊的時候,讀寫swap空間發生的頻率會很高,
致使系統運行很慢,像死了同樣,這個時候添加物理內存是惟一的解決辦法。maven
再打開時小卡一下,由於須要將swap上的數據從新加載到內存中來。
Linux交換空間(swap space)
#先建立一個新的512M的文件,用來做爲swap文件,文件路徑能夠隨便 #fallocate這個命令依賴於文件系統,有些老的文件系統不支持這個命令,好比ext2, #這種狀況下能夠用dd來實現一樣的效果: #sudo dd if=/dev/zero of=/mnt/512MiB.swap bs=1024 count=524288 #fallocate和dd的區別在於: #fallocate是先聲明這麼多,而後在具體用到的時候文件系統才分配真正的物理磁盤空間,就是用一點分配一點, #而dd是一開始就實實在在的寫了512m的數據到物理磁盤空間。 #因此做爲測試來講fallocate方便些,由於剛開始不用寫任何數據,要快 dev@dev:~$ sudo fallocate -l 512m /mnt/512MiB.swap #修改文件的權限,避免其餘用戶對這個文件進行誤操做 dev@dev:~$ sudo chmod 600 /mnt/512MiB.swap #格式化爲swap文件 dev@dev:~$ sudo mkswap /mnt/512MiB.swap #將新的文件加入到系統中 dev@dev:~$ sudo swapon /mnt/512MiB.swap #這時候能夠看到新的swap文件已經被加入到系統中了,類型爲file #這裏能夠看到因爲優先級最高,第一個swap分區/dev/dm-1已經被使用了24K dev@dev:~$ swapon -s Filename Type Size Used Priority /dev/dm-1 partition 524284 24 -1 /dev/sdb1 partition 2096124 0 -2 /mnt/512MiB.swap file 524284 0 -3 #從free命令的輸出能夠看到,通過前面兩輪添加swap分區和文件, #如今系統的交換空間已經變成3G(3144692K)了 dev@dev:~$ free total used free shared buff/cache available Mem: 500192 39112 9564 1996 451516 430820 Swap: 3144692 24 3144668 #一樣爲了保證系統重啓後會自動加載咱們新的swap文件,須要修改/etc/fstab文件 dev@dev:~$ sudo sh -c 'echo "/mnt/512MiB.swap none swap sw 0 0" >> /etc/fstab'
技術上的問題總會有緣由的,就看你找不找獲得。
版權聲明:本文爲博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處連接和本聲明。posted from openWrite